diff --git a/compiler/GHC/Driver/Pipeline/Execute.hs b/compiler/GHC/Driver/Pipeline/Execute.hs index aeacd9e9a019cfe937a65e8de5a126e99733aab9..bd2f453ec46aa3c6d816e5d7d8aeacb29fc11d34 100644 --- a/compiler/GHC/Driver/Pipeline/Execute.hs +++ b/compiler/GHC/Driver/Pipeline/Execute.hs @@ -602,7 +602,7 @@ runUnlitPhase hsc_env input_fn output_fn = do -- GHC.HsToCore.Ticks.isGoodTickSrcSpan where we check that the filename in -- a SrcLoc is the same as the source filename, the two will -- look bogusly different. See test: - -- libraries/hpc/tests/function/subdir/tough2.hs + -- testsuite/tests/hpc/function/subdir/tough2.hs escape ('\\':cs) = '\\':'\\': escape cs escape ('\"':cs) = '\\':'\"': escape cs escape ('\'':cs) = '\\':'\'': escape cs diff --git a/libraries/hpc b/libraries/hpc index 0ad03de570771bb04f383a04886bc58071b50b7b..60424b55b6c44254eab3887bb76bf7997aefa8ba 160000 --- a/libraries/hpc +++ b/libraries/hpc @@ -1 +1 @@ -Subproject commit 0ad03de570771bb04f383a04886bc58071b50b7b +Subproject commit 60424b55b6c44254eab3887bb76bf7997aefa8ba diff --git a/testsuite/tests/hpc/.gitignore b/testsuite/tests/hpc/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..9846ea3d6130f9acb7180e5a1876e48980fc14f5 --- /dev/null +++ b/testsuite/tests/hpc/.gitignore @@ -0,0 +1,20 @@ +.hpc*/ +*.o +*.hi +*.comp.std* +*.run.std* +*.eventlog +*.genscript +*.exe +*.hs.html +hpc_index*.html + +# all *.tix except hpc_sample.tix +*.tix +!hpc_sample.tix + +# specific files +/fork/hpc_fork +/function/tough +/function2/tough2 +/simple/hpc001 diff --git a/testsuite/tests/hpc/fork/Makefile b/testsuite/tests/hpc/fork/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4a268530f13bc7f70d03965dacf45d8a0b4a720e --- /dev/null +++ b/testsuite/tests/hpc/fork/Makefile @@ -0,0 +1,4 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + diff --git a/testsuite/tests/hpc/fork/hpc_fork.hs b/testsuite/tests/hpc/fork/hpc_fork.hs new file mode 100644 index 0000000000000000000000000000000000000000..ac912a83f21b812e897cc5e4464771c5c75a14f4 --- /dev/null +++ b/testsuite/tests/hpc/fork/hpc_fork.hs @@ -0,0 +1,10 @@ +module Main where + +import System.Posix.Process +import Control.Concurrent + +main = do + pid1 <- forkProcess $ do threadDelay 100000 + pid2 <- forkProcess $ do threadDelay 100000 + print () + diff --git a/testsuite/tests/hpc/fork/hpc_fork.stdout b/testsuite/tests/hpc/fork/hpc_fork.stdout new file mode 100644 index 0000000000000000000000000000000000000000..52f1f1b6e02fb5f967dc36e598a266c9983e3bed --- /dev/null +++ b/testsuite/tests/hpc/fork/hpc_fork.stdout @@ -0,0 +1,124 @@ +() + + + 53% expressions used (7/13) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) + + +-----<module Main>----- + 53% expressions used (7/13) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) + + +Writing: Main.hs.html +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +</head> +<body> +<pre> +<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span> +</pre> +<pre> +<span class="lineno"> 1 </span>module Main where +<span class="lineno"> 2 </span> +<span class="lineno"> 3 </span>import System.Posix.Process +<span class="lineno"> 4 </span>import Control.Concurrent +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span><span class="decl"><span class="istickedoff">main = do</span> +<span class="lineno"> 7 </span><span class="spaces"> </span><span class="istickedoff">pid1 <- forkProcess $ <span class="nottickedoff">do threadDelay 100000</span></span> +<span class="lineno"> 8 </span><span class="spaces"> </span><span class="istickedoff">pid2 <- forkProcess $ <span class="nottickedoff">do threadDelay 100000</span></span> +<span class="lineno"> 9 </span><span class="spaces"> </span><span class="istickedoff">print ()</span></span> +<span class="lineno"> 10 </span> + +</pre> +</body> +</html> +Writing: hpc_index.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">53%</td><td>7/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="53%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">53%</td><td>7/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="53%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_fun.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">53%</td><td>7/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="53%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">53%</td><td>7/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="53%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_alt.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">53%</td><td>7/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="53%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">53%</td><td>7/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="53%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_exp.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">53%</td><td>7/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="53%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">53%</td><td>7/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="53%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> + + diff --git a/testsuite/tests/hpc/fork/test.T b/testsuite/tests/hpc/fork/test.T new file mode 100644 index 0000000000000000000000000000000000000000..3ff54d2d6989c5d238385bcd743f97124837f990 --- /dev/null +++ b/testsuite/tests/hpc/fork/test.T @@ -0,0 +1,13 @@ +setTestOpts([omit_ways(ghci_ways + ['threaded2']), when(fast(), skip), js_skip]) + +hpc_prefix = "perl hpcrun.pl --clear --exeext={exeext} --hpc={hpc}" + +test('hpc_fork', + [extra_files(['../hpcrun.pl']), + when(opsys('mingw32'), skip), # no forkProcess on Windows + # profiling and forkProcess don't go well together. See #16907, #11645, + # and #8862. + req_process, + omit_ways(prof_ways), + cmd_prefix(hpc_prefix)], + compile_and_run, ['-fhpc']) diff --git a/testsuite/tests/hpc/function/Makefile b/testsuite/tests/hpc/function/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4a268530f13bc7f70d03965dacf45d8a0b4a720e --- /dev/null +++ b/testsuite/tests/hpc/function/Makefile @@ -0,0 +1,4 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + diff --git a/testsuite/tests/hpc/function/test.T b/testsuite/tests/hpc/function/test.T new file mode 100644 index 0000000000000000000000000000000000000000..24dfa70f83b8fce5a43b6fde27fe8185e20b1578 --- /dev/null +++ b/testsuite/tests/hpc/function/test.T @@ -0,0 +1,9 @@ +setTestOpts([omit_ghci, when(fast(), skip), js_skip]) + +hpc_prefix = "perl hpcrun.pl --clear --exeext={exeext} --hpc={hpc}" + +test('tough', + [extra_files(['../hpcrun.pl']), + cmd_prefix(hpc_prefix), + when(arch('wasm32'), fragile(23243))], + compile_and_run, ['-fhpc']) diff --git a/testsuite/tests/hpc/function/tough.hs b/testsuite/tests/hpc/function/tough.hs new file mode 100644 index 0000000000000000000000000000000000000000..ed3f3a01fb2ac4383eddc0c43594b5b94df43e74 --- /dev/null +++ b/testsuite/tests/hpc/function/tough.hs @@ -0,0 +1,47 @@ +import Control.Exception as E + +-- This test shows what hpc can really do. + +main = do + print ("Hello") + foo "Hello" + E.catch (print (badCase 22 44)) + (\ e -> print (e :: E.ErrorCall)) + E.catch (print (badCase 22 (error "Foo"))) + (\ e -> print (e :: E.ErrorCall)) + E.catch (print "Bark") + (\ e -> print (e :: E.ErrorCall)) + (_,_) <- return $ ("Hello","World") + return () + () <- return () + t <- case () of + _ | otherwoz -> return "Hello" + _ -> error "Bad Thing Happened" + t <- case () of + _ | otherwise -> return "Hello" + _ -> error "Bad Thing Happened" + t <- case () of + _ | otherwise + , False -> error "Bad Thing Happened" + _ -> return "Hello" + print t + print foo2 + +foo x = do + print x + return () + +unused_ a = a + +badCase :: Int -> Int -> Int +badCase a b = + if a > 100 + then error "badCase" + else if a > 1000 + then 1 + else badCase (a + 1) (b - 1) + + +foo2 = (1,2, if True then 3 else 4) + +otherwoz = True diff --git a/testsuite/tests/hpc/function/tough.stdout b/testsuite/tests/hpc/function/tough.stdout new file mode 100644 index 0000000000000000000000000000000000000000..01e286b125e9a60b3c83ec5fda4b9577ee42efa3 --- /dev/null +++ b/testsuite/tests/hpc/function/tough.stdout @@ -0,0 +1,171 @@ +"Hello" +"Hello" +badCase +CallStack (from HasCallStack): + error, called at tough.hs:39:14 in main:Main +badCase +CallStack (from HasCallStack): + error, called at tough.hs:39:14 in main:Main +"Bark" +"Hello" +(1,2,3) + + + 71% expressions used (68/95) + 14% boolean coverage (1/7) + 0% guards (0/4), 3 always True, 1 always False + 33% 'if' conditions (1/3), 1 always True, 1 always False + 100% qualifiers (0/0) + 58% alternatives used (7/12) +100% local declarations used (0/0) + 83% top-level declarations used (5/6) + + +-----<module Main>----- + 71% expressions used (68/95) + 14% boolean coverage (1/7) + 0% guards (0/4), 3 always True, 1 always False + 33% 'if' conditions (1/3), 1 always True, 1 always False + 100% qualifiers (0/0) + 58% alternatives used (7/12) +100% local declarations used (0/0) + 83% top-level declarations used (5/6) + + +Writing: Main.hs.html +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +</head> +<body> +<pre> +<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span> +</pre> +<pre> +<span class="lineno"> 1 </span>import Control.Exception as E +<span class="lineno"> 2 </span> +<span class="lineno"> 3 </span>-- This test shows what hpc can really do. +<span class="lineno"> 4 </span> +<span class="lineno"> 5 </span><span class="decl"><span class="istickedoff">main = do</span> +<span class="lineno"> 6 </span><span class="spaces"> </span><span class="istickedoff">print ("Hello")</span> +<span class="lineno"> 7 </span><span class="spaces"> </span><span class="istickedoff">foo "Hello"</span> +<span class="lineno"> 8 </span><span class="spaces"> </span><span class="istickedoff">E.catch (print (badCase 22 <span class="nottickedoff">44</span>))</span> +<span class="lineno"> 9 </span><span class="spaces"> </span><span class="istickedoff">(\ e -> print (e :: E.ErrorCall))</span> +<span class="lineno"> 10 </span><span class="spaces"> </span><span class="istickedoff">E.catch (print (badCase 22 <span class="nottickedoff">(error "Foo")</span>))</span> +<span class="lineno"> 11 </span><span class="spaces"> </span><span class="istickedoff">(\ e -> print (e :: E.ErrorCall))</span> +<span class="lineno"> 12 </span><span class="spaces"> </span><span class="istickedoff">E.catch (print "Bark")</span> +<span class="lineno"> 13 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">(\ e -> print (e :: E.ErrorCall))</span></span> +<span class="lineno"> 14 </span><span class="spaces"> </span><span class="istickedoff">(_,_) <- return $ (<span class="nottickedoff">"Hello"</span>,<span class="nottickedoff">"World"</span>)</span> +<span class="lineno"> 15 </span><span class="spaces"> </span><span class="istickedoff">return <span class="nottickedoff">()</span></span> +<span class="lineno"> 16 </span><span class="spaces"> </span><span class="istickedoff">() <- return ()</span> +<span class="lineno"> 17 </span><span class="spaces"> </span><span class="istickedoff">t <- case <span class="nottickedoff">()</span> of</span> +<span class="lineno"> 18 </span><span class="spaces"> </span><span class="istickedoff">_ | <span class="tickonlytrue">otherwoz</span> -> return <span class="nottickedoff">"Hello"</span></span> +<span class="lineno"> 19 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">error "Bad Thing Happened"</span></span> +<span class="lineno"> 20 </span><span class="spaces"> </span><span class="istickedoff">t <- case <span class="nottickedoff">()</span> of</span> +<span class="lineno"> 21 </span><span class="spaces"> </span><span class="istickedoff">_ | <span class="tickonlytrue">otherwise</span> -> return <span class="nottickedoff">"Hello"</span></span> +<span class="lineno"> 22 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">error "Bad Thing Happened"</span></span> +<span class="lineno"> 23 </span><span class="spaces"> </span><span class="istickedoff">t <- case <span class="nottickedoff">()</span> of</span> +<span class="lineno"> 24 </span><span class="spaces"> </span><span class="istickedoff">_ | <span class="tickonlytrue">otherwise</span> </span> +<span class="lineno"> 25 </span><span class="spaces"> </span><span class="istickedoff">, <span class="tickonlyfalse">False</span> -> <span class="nottickedoff">error "Bad Thing Happened"</span></span> +<span class="lineno"> 26 </span><span class="spaces"> </span><span class="istickedoff">_ -> return "Hello"</span> +<span class="lineno"> 27 </span><span class="spaces"> </span><span class="istickedoff">print t</span> +<span class="lineno"> 28 </span><span class="spaces"> </span><span class="istickedoff">print foo2</span></span> +<span class="lineno"> 29 </span> +<span class="lineno"> 30 </span><span class="decl"><span class="istickedoff">foo x = do</span> +<span class="lineno"> 31 </span><span class="spaces"> </span><span class="istickedoff">print x</span> +<span class="lineno"> 32 </span><span class="spaces"> </span><span class="istickedoff">return <span class="nottickedoff">()</span></span></span> +<span class="lineno"> 33 </span> +<span class="lineno"> 34 </span><span class="decl"><span class="nottickedoff">unused_ a = a</span></span> +<span class="lineno"> 35 </span> +<span class="lineno"> 36 </span>badCase :: Int -> Int -> Int +<span class="lineno"> 37 </span><span class="decl"><span class="istickedoff">badCase a b = </span> +<span class="lineno"> 38 </span><span class="spaces"> </span><span class="istickedoff">if a > 100 </span> +<span class="lineno"> 39 </span><span class="spaces"> </span><span class="istickedoff">then error "badCase" </span> +<span class="lineno"> 40 </span><span class="spaces"> </span><span class="istickedoff">else if <span class="tickonlyfalse">a > 1000</span> </span> +<span class="lineno"> 41 </span><span class="spaces"> </span><span class="istickedoff">then <span class="nottickedoff">1</span> </span> +<span class="lineno"> 42 </span><span class="spaces"> </span><span class="istickedoff">else badCase (a + 1) <span class="nottickedoff">(b - 1)</span></span></span> +<span class="lineno"> 43 </span> +<span class="lineno"> 44 </span> +<span class="lineno"> 45 </span><span class="decl"><span class="istickedoff">foo2 = (1,2, if <span class="tickonlytrue">True</span> then 3 else <span class="nottickedoff">4</span>)</span></span> +<span class="lineno"> 46 </span> +<span class="lineno"> 47 </span><span class="decl"><span class="istickedoff">otherwoz = True</span></span> + +</pre> +</body> +</html> +Writing: hpc_index.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_fun.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_alt.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_exp.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> + + diff --git a/testsuite/tests/hpc/function2/Makefile b/testsuite/tests/hpc/function2/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4a268530f13bc7f70d03965dacf45d8a0b4a720e --- /dev/null +++ b/testsuite/tests/hpc/function2/Makefile @@ -0,0 +1,4 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + diff --git a/testsuite/tests/hpc/function2/subdir/tough2.lhs b/testsuite/tests/hpc/function2/subdir/tough2.lhs new file mode 100644 index 0000000000000000000000000000000000000000..248bfe946d859ec1da895e1a34edd1c185d0975b --- /dev/null +++ b/testsuite/tests/hpc/function2/subdir/tough2.lhs @@ -0,0 +1,49 @@ +\begin{code} +import Control.Exception as E + +-- This test shows what hpc can really do. + +main = do + print ("Hello") + foo "Hello" + E.catch (print (badCase 22 44)) + (\ e -> print (e :: E.ErrorCall)) + E.catch (print (badCase 22 (error "Foo"))) + (\ e -> print (e :: E.ErrorCall)) + E.catch (print "Bark") + (\ e -> print (e :: E.ErrorCall)) + (_,_) <- return $ ("Hello","World") + return () + () <- return () + t <- case () of + _ | otherwoz -> return "Hello" + _ -> error "Bad Thing Happened" + t <- case () of + _ | otherwise -> return "Hello" + _ -> error "Bad Thing Happened" + t <- case () of + _ | otherwise + , False -> error "Bad Thing Happened" + _ -> return "Hello" + print t + print foo2 + +foo x = do + print x + return () + +unused_ a = a + +badCase :: Int -> Int -> Int +badCase a b = + if a > 100 + then error "badCase" + else if a > 1000 + then 1 + else badCase (a + 1) (b - 1) + + +foo2 = (1,2, if True then 3 else 4) + +otherwoz = True +\end{code} diff --git a/testsuite/tests/hpc/function2/test.T b/testsuite/tests/hpc/function2/test.T new file mode 100644 index 0000000000000000000000000000000000000000..3740e0e7b0757c8cb44dcb07bdde91ebc68b7758 --- /dev/null +++ b/testsuite/tests/hpc/function2/test.T @@ -0,0 +1,15 @@ +setTestOpts([when(fast(), skip), js_skip]) + +hpc_prefix = "perl hpcrun.pl --clear --exeext={exeext} --hpc={hpc}" + +# Test that -fhpc still works when (a) the source file is in a +# subdirectory and (b) it is a literate file. We had a bug in this +# area caused by the handling of line pragmas in the preprocessed +# source file. +test('tough2', + [extra_files(['../hpcrun.pl', 'subdir/']), + literate, + cmd_prefix(hpc_prefix), + omit_ways(ghci_ways + prof_ways), # profile goes in the wrong place + when(arch('wasm32'), fragile(23243)) ], + multimod_compile_and_run, ['subdir/tough2.lhs', '-fhpc']) diff --git a/testsuite/tests/hpc/function2/tough2.stdout b/testsuite/tests/hpc/function2/tough2.stdout new file mode 100644 index 0000000000000000000000000000000000000000..2aadd7f853c03473419589a4585ea9366a1e908a --- /dev/null +++ b/testsuite/tests/hpc/function2/tough2.stdout @@ -0,0 +1,173 @@ +"Hello" +"Hello" +badCase +CallStack (from HasCallStack): + error, called at subdir/tough2.lhs:40:14 in main:Main +badCase +CallStack (from HasCallStack): + error, called at subdir/tough2.lhs:40:14 in main:Main +"Bark" +"Hello" +(1,2,3) + + + 71% expressions used (68/95) + 14% boolean coverage (1/7) + 0% guards (0/4), 3 always True, 1 always False + 33% 'if' conditions (1/3), 1 always True, 1 always False + 100% qualifiers (0/0) + 58% alternatives used (7/12) +100% local declarations used (0/0) + 83% top-level declarations used (5/6) + + +-----<module Main>----- + 71% expressions used (68/95) + 14% boolean coverage (1/7) + 0% guards (0/4), 3 always True, 1 always False + 33% 'if' conditions (1/3), 1 always True, 1 always False + 100% qualifiers (0/0) + 58% alternatives used (7/12) +100% local declarations used (0/0) + 83% top-level declarations used (5/6) + + +Writing: Main.hs.html +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +</head> +<body> +<pre> +<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span> +</pre> +<pre> +<span class="lineno"> 1 </span>\begin{code} +<span class="lineno"> 2 </span>import Control.Exception as E +<span class="lineno"> 3 </span> +<span class="lineno"> 4 </span>-- This test shows what hpc can really do. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span><span class="decl"><span class="istickedoff">main = do</span> +<span class="lineno"> 7 </span><span class="spaces"> </span><span class="istickedoff">print ("Hello")</span> +<span class="lineno"> 8 </span><span class="spaces"> </span><span class="istickedoff">foo "Hello"</span> +<span class="lineno"> 9 </span><span class="spaces"> </span><span class="istickedoff">E.catch (print (badCase 22 <span class="nottickedoff">44</span>))</span> +<span class="lineno"> 10 </span><span class="spaces"> </span><span class="istickedoff">(\ e -> print (e :: E.ErrorCall))</span> +<span class="lineno"> 11 </span><span class="spaces"> </span><span class="istickedoff">E.catch (print (badCase 22 <span class="nottickedoff">(error "Foo")</span>))</span> +<span class="lineno"> 12 </span><span class="spaces"> </span><span class="istickedoff">(\ e -> print (e :: E.ErrorCall))</span> +<span class="lineno"> 13 </span><span class="spaces"> </span><span class="istickedoff">E.catch (print "Bark")</span> +<span class="lineno"> 14 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">(\ e -> print (e :: E.ErrorCall))</span></span> +<span class="lineno"> 15 </span><span class="spaces"> </span><span class="istickedoff">(_,_) <- return $ (<span class="nottickedoff">"Hello"</span>,<span class="nottickedoff">"World"</span>)</span> +<span class="lineno"> 16 </span><span class="spaces"> </span><span class="istickedoff">return <span class="nottickedoff">()</span></span> +<span class="lineno"> 17 </span><span class="spaces"> </span><span class="istickedoff">() <- return ()</span> +<span class="lineno"> 18 </span><span class="spaces"> </span><span class="istickedoff">t <- case <span class="nottickedoff">()</span> of</span> +<span class="lineno"> 19 </span><span class="spaces"> </span><span class="istickedoff">_ | <span class="tickonlytrue">otherwoz</span> -> return <span class="nottickedoff">"Hello"</span></span> +<span class="lineno"> 20 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">error "Bad Thing Happened"</span></span> +<span class="lineno"> 21 </span><span class="spaces"> </span><span class="istickedoff">t <- case <span class="nottickedoff">()</span> of</span> +<span class="lineno"> 22 </span><span class="spaces"> </span><span class="istickedoff">_ | <span class="tickonlytrue">otherwise</span> -> return <span class="nottickedoff">"Hello"</span></span> +<span class="lineno"> 23 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">error "Bad Thing Happened"</span></span> +<span class="lineno"> 24 </span><span class="spaces"> </span><span class="istickedoff">t <- case <span class="nottickedoff">()</span> of</span> +<span class="lineno"> 25 </span><span class="spaces"> </span><span class="istickedoff">_ | <span class="tickonlytrue">otherwise</span> </span> +<span class="lineno"> 26 </span><span class="spaces"> </span><span class="istickedoff">, <span class="tickonlyfalse">False</span> -> <span class="nottickedoff">error "Bad Thing Happened"</span></span> +<span class="lineno"> 27 </span><span class="spaces"> </span><span class="istickedoff">_ -> return "Hello"</span> +<span class="lineno"> 28 </span><span class="spaces"> </span><span class="istickedoff">print t</span> +<span class="lineno"> 29 </span><span class="spaces"> </span><span class="istickedoff">print foo2</span></span> +<span class="lineno"> 30 </span> +<span class="lineno"> 31 </span><span class="decl"><span class="istickedoff">foo x = do</span> +<span class="lineno"> 32 </span><span class="spaces"> </span><span class="istickedoff">print x</span> +<span class="lineno"> 33 </span><span class="spaces"> </span><span class="istickedoff">return <span class="nottickedoff">()</span></span></span> +<span class="lineno"> 34 </span> +<span class="lineno"> 35 </span><span class="decl"><span class="nottickedoff">unused_ a = a</span></span> +<span class="lineno"> 36 </span> +<span class="lineno"> 37 </span>badCase :: Int -> Int -> Int +<span class="lineno"> 38 </span><span class="decl"><span class="istickedoff">badCase a b = </span> +<span class="lineno"> 39 </span><span class="spaces"> </span><span class="istickedoff">if a > 100 </span> +<span class="lineno"> 40 </span><span class="spaces"> </span><span class="istickedoff">then error "badCase" </span> +<span class="lineno"> 41 </span><span class="spaces"> </span><span class="istickedoff">else if <span class="tickonlyfalse">a > 1000</span> </span> +<span class="lineno"> 42 </span><span class="spaces"> </span><span class="istickedoff">then <span class="nottickedoff">1</span> </span> +<span class="lineno"> 43 </span><span class="spaces"> </span><span class="istickedoff">else badCase (a + 1) <span class="nottickedoff">(b - 1)</span></span></span> +<span class="lineno"> 44 </span> +<span class="lineno"> 45 </span> +<span class="lineno"> 46 </span><span class="decl"><span class="istickedoff">foo2 = (1,2, if <span class="tickonlytrue">True</span> then 3 else <span class="nottickedoff">4</span>)</span></span> +<span class="lineno"> 47 </span> +<span class="lineno"> 48 </span><span class="decl"><span class="istickedoff">otherwoz = True</span></span> +<span class="lineno"> 49 </span>\end{code} + +</pre> +</body> +</html> +Writing: hpc_index.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_fun.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_alt.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_exp.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>7/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">71%</td><td>68/95</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="71%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> + + diff --git a/testsuite/tests/hpc/ghc_ghci/A.hs b/testsuite/tests/hpc/ghc_ghci/A.hs new file mode 100644 index 0000000000000000000000000000000000000000..f12fdadda7eda89dd79a691a8247f69354e2b34f --- /dev/null +++ b/testsuite/tests/hpc/ghc_ghci/A.hs @@ -0,0 +1,5 @@ + +module A (a) where + +a :: Char +a = 'z' diff --git a/testsuite/tests/hpc/ghc_ghci/B.hs b/testsuite/tests/hpc/ghc_ghci/B.hs new file mode 100644 index 0000000000000000000000000000000000000000..0bf4401f54fde10ccc5d90c9b86e4a896918d0b2 --- /dev/null +++ b/testsuite/tests/hpc/ghc_ghci/B.hs @@ -0,0 +1,7 @@ + +module B (b) where + +import A + +b :: Char +b = a diff --git a/testsuite/tests/hpc/ghc_ghci/Makefile b/testsuite/tests/hpc/ghc_ghci/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..fba4ca7c3e4a9f6441360030a9013a2f94dc5153 --- /dev/null +++ b/testsuite/tests/hpc/ghc_ghci/Makefile @@ -0,0 +1,9 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + +hpc_ghc_ghci: + rm -f A.o A.hi + '$(TEST_HC)' $(TEST_HC_OPTS) -fhpc -c A.hs + echo b | '$(TEST_HC)' $(TEST_HC_OPTS_INTERACTIVE) B.hs + diff --git a/testsuite/tests/hpc/ghc_ghci/hpc_ghc_ghci.stdout b/testsuite/tests/hpc/ghc_ghci/hpc_ghc_ghci.stdout new file mode 100644 index 0000000000000000000000000000000000000000..6ad22b40ef89c10907a1134458597f146dd5211d --- /dev/null +++ b/testsuite/tests/hpc/ghc_ghci/hpc_ghc_ghci.stdout @@ -0,0 +1 @@ +'z' diff --git a/testsuite/tests/hpc/ghc_ghci/test.T b/testsuite/tests/hpc/ghc_ghci/test.T new file mode 100644 index 0000000000000000000000000000000000000000..0a2807ef42f71b1f6a3973d0a2555135804c7aee --- /dev/null +++ b/testsuite/tests/hpc/ghc_ghci/test.T @@ -0,0 +1,5 @@ + +test('hpc_ghc_ghci', + [extra_files(['A.hs', 'B.hs']), + only_ways(['normal']), when(compiler_profiled(), skip), req_interp], + run_command, ['$MAKE -s --no-print-directory hpc_ghc_ghci']) diff --git a/testsuite/tests/hpc/hpc.ovr b/testsuite/tests/hpc/hpc.ovr new file mode 100644 index 0000000000000000000000000000000000000000..1c1f064b51d9f6019430c50ba6ca3191f8912327 --- /dev/null +++ b/testsuite/tests/hpc/hpc.ovr @@ -0,0 +1,13 @@ +tick "()"; +module "HpcCombine" {} +module "HpcDraft" {} +module "HpcFlags" {} +module "HpcLexer" {} +module "HpcMap" {} +module "HpcMarkup" {} +module "HpcOverlay" {} +module "HpcReport" {} +module "HpcSet" {} +module "HpcShowTix" {} +module "HpcUtils" {} +module "Main" {} diff --git a/testsuite/tests/hpc/hpcrun.pl b/testsuite/tests/hpc/hpcrun.pl new file mode 100644 index 0000000000000000000000000000000000000000..88fef33daf301163ee1a6777e807bb864f9bb40a --- /dev/null +++ b/testsuite/tests/hpc/hpcrun.pl @@ -0,0 +1,44 @@ +# +# This command wraps round a command execution, adding some hpc tests. +# + +while($ARGV[0] =~ /^--/) { + $arg = shift @ARGV; + if ($arg =~ /--hpc=(.*)/) { + $HPC = $1; + } + elsif ($arg =~ /--clear/) { + $CLEAR = 1; + } + elsif ($arg =~ /--exeext=(.*)/) { + $exeext = $1; + } + else { + die "Bad arg: $arg" + } +} + +die "no option --hpc=* provided\n" if (!defined($HPC)); + +$binary = $ARGV[0] . $exeext; + +# get the basename: needed for the test function/subdir/tough2 +$binary =~ s/^.*\/([^\/]*)$/$1/; + +unlink "$binary.tix" if (defined($CLEAR)); + +system @ARGV; +print "\n\n"; +system ($HPC, "report", "$binary.tix"); +print "\n\n"; +system ($HPC, "report", "$binary.tix", "--per-module"); +print "\n\n"; +open(MARKUP, "-|", $HPC, "markup", "$binary.tix"); +while(<MARKUP>) { + my $line = $_; + print $line; + if (/Writing: (\S+.html)/) { + system("cat $1"); + } +} +print "\n\n"; diff --git a/testsuite/tests/hpc/raytrace/CSG.hs b/testsuite/tests/hpc/raytrace/CSG.hs new file mode 100644 index 0000000000000000000000000000000000000000..ba37a17b25e76d0e63d65dffd858d70228fa730c --- /dev/null +++ b/testsuite/tests/hpc/raytrace/CSG.hs @@ -0,0 +1,16 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module CSG(module Construct, + module Geometry, + module Intersections, + module Interval, + module Misc) where + +import Construct +import Geometry +import Intersections +import Interval +import Misc diff --git a/testsuite/tests/hpc/raytrace/Construct.hs b/testsuite/tests/hpc/raytrace/Construct.hs new file mode 100644 index 0000000000000000000000000000000000000000..90dbc60f9e5128f8ce06814f18eb9ff091af2803 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Construct.hs @@ -0,0 +1,265 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Construct + ( Surface (..) + , Face (..) + , CSG (..) + , Texture + , Transform + , union, intersect, difference + , plane, sphere, cube, cylinder, cone + , transform + , translate, translateX, translateY, translateZ + , scale, scaleX, scaleY, scaleZ, uscale + , rotateX, rotateY, rotateZ + , eye, translateEye + , rotateEyeX, rotateEyeY, rotateEyeZ + ) where + +import Geometry + +-- In each case, we model the surface by a point and a pair of tangent vectors. +-- This gives us enough information to determine the surface +-- normal at that point, which is all that is required by the current +-- illumination model. We can't just save the surface normal because +-- that isn't preserved by transformations. + +data Surface + = Planar Point Vector Vector + | Spherical Point Vector Vector + | Cylindrical Point Vector Vector + | Conic Point Vector Vector + deriving Show + +data Face + = PlaneFace + | SphereFace + | CubeFront + | CubeBack + | CubeLeft + | CubeRight + | CubeTop + | CubeBottom + | CylinderSide + | CylinderTop + | CylinderBottom + | ConeSide + | ConeBase + deriving Show + +data CSG a + = Plane a + | Sphere a + | Cylinder a + | Cube a + | Cone a + | Transform Matrix Matrix (CSG a) + | Union (CSG a) (CSG a) + | Intersect (CSG a) (CSG a) + | Difference (CSG a) (CSG a) + | Box Box (CSG a) + deriving (Show) + +-- the data returned for determining surface texture +-- the Face tells which face of a primitive this is +-- the Point is the point of intersection in object coordinates +-- the a is application-specific texture information +type Texture a = (Face, Point, a) + +union, intersect, difference :: CSG a -> CSG a -> CSG a + +union p@(Box b1 _) q@(Box b2 _) = Box (mergeBox b1 b2) (Union p q) +union p q = Union p q + +-- rather pessimistic +intersect p@(Box b1 _) q@(Box b2 _) = Box (mergeBox b1 b2) (Intersect p q) +intersect p q = Intersect p q + +difference (Box b1 p) q = Box b1 (Difference p q) +-- no need to box again inside +-- difference p@(Box b1 _) q = Box b1 (Difference p q) +difference p q = Difference p q + +mkBox b p = Box b p + +plane, sphere, cube, cylinder, cone :: a -> CSG a + +plane = Plane +sphere s = + mkBox (B (-1 - epsilon) (1 + epsilon) + (-1 - epsilon) (1 + epsilon) + (-1 - epsilon) (1 + epsilon)) (Sphere s) +cone s = + mkBox (B (-1 - epsilon) (1 + epsilon) + ( - epsilon) (1 + epsilon) + (-1 - epsilon) (1 + epsilon)) (Cone s) +cube s = + mkBox (B (- epsilon) (1 + epsilon) + (- epsilon) (1 + epsilon) + (- epsilon) (1 + epsilon)) (Cube s) +cylinder s = + mkBox (B (-1 - epsilon) (1 + epsilon) + ( - epsilon) (1 + epsilon) + (-1 - epsilon) (1 + epsilon)) (Cylinder s) + +---------------------------- +-- Object transformations +---------------------------- + +type Transform = (Matrix, Matrix) + +transform :: Transform -> CSG a -> CSG a + +transform (m, m') (Transform mp mp' p) = Transform (multMM m mp) (multMM mp' m') p +transform mm' (Union p q) = Union (transform mm' p) (transform mm' q) +transform mm' (Intersect p q) = Intersect (transform mm' p) (transform mm' q) +transform mm' (Difference p q) = Difference (transform mm' p) (transform mm' q) +transform mm'@(m,_) (Box box p) = Box (transformBox m box) (transform mm' p) +transform (m, m') prim = Transform m m' prim + +translate :: Coords -> CSG a -> CSG a +translateX, translateY, translateZ :: Double -> CSG a -> CSG a + +translate xyz = transform $ transM xyz +translateX x = translate (x, 0, 0) +translateY y = translate (0, y, 0) +translateZ z = translate (0, 0, z) + +scale :: Coords -> CSG a -> CSG a +scaleX, scaleY, scaleZ, uscale :: Double -> CSG a -> CSG a + +scale xyz = transform $ scaleM xyz +scaleX x = scale (x, 1, 1) +scaleY y = scale (1, y, 1) +scaleZ z = scale (1, 1, z) +uscale u = scale (u,u,u) + +rotateX, rotateY, rotateZ :: Radian -> CSG a -> CSG a + +rotateX a = transform $ rotxM a +rotateY a = transform $ rotyM a +rotateZ a = transform $ rotzM a + +unit = matrix + ( ( 1.0, 0.0, 0.0, 0.0 ), + ( 0.0, 1.0, 0.0, 0.0 ), + ( 0.0, 0.0, 1.0, 0.0 ), + ( 0.0, 0.0, 0.0, 1.0 ) ) + +transM (x, y, z) + = ( matrix + ( ( 1, 0, 0, x ), + ( 0, 1, 0, y ), + ( 0, 0, 1, z ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( 1, 0, 0, -x ), + ( 0, 1, 0, -y ), + ( 0, 0, 1, -z ), + ( 0, 0, 0, 1 ) ) ) + +scaleM (x, y, z) + = ( matrix + ( ( x', 0, 0, 0 ), + ( 0, y', 0, 0 ), + ( 0, 0, z', 0 ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( 1/x', 0, 0, 0 ), + ( 0, 1/y', 0, 0 ), + ( 0, 0, 1/z', 0 ), + ( 0, 0, 0, 1 ) ) ) + where x' = nonZero x + y' = nonZero y + z' = nonZero z + +rotxM t + = ( matrix + ( ( 1, 0, 0, 0 ), + ( 0, cos t, -sin t, 0 ), + ( 0, sin t, cos t, 0 ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( 1, 0, 0, 0 ), + ( 0, cos t, sin t, 0 ), + ( 0, -sin t, cos t, 0 ), + ( 0, 0, 0, 1 ) ) ) + +rotyM t + = ( matrix + ( ( cos t, 0, sin t, 0 ), + ( 0, 1, 0, 0 ), + ( -sin t, 0, cos t, 0 ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( cos t, 0, -sin t, 0 ), + ( 0, 1, 0, 0 ), + ( sin t, 0, cos t, 0 ), + ( 0, 0, 0, 1 ) ) ) + +rotzM t + = ( matrix + ( ( cos t, -sin t, 0, 0 ), + ( sin t, cos t, 0, 0 ), + ( 0, 0, 1, 0 ), + ( 0, 0, 0, 1 ) ), + matrix + ( ( cos t, sin t, 0, 0 ), + ( -sin t, cos t, 0, 0 ), + ( 0, 0, 1, 0 ), + ( 0, 0, 0, 1 ) ) ) + +------------------- +-- Eye transformations + +-- These are used to specify placement of the eye. +-- `eye' starts out at (0, 0, -1). +-- These are implemented as inverse transforms of the model. +------------------- + +eye :: Transform +translateEye :: Coords -> Transform -> Transform +rotateEyeX, rotateEyeY, rotateEyeZ :: Radian -> Transform -> Transform + +eye = (unit, unit) +translateEye xyz (eye1, eye2) + = (multMM m1 eye1, multMM eye2 m2) + where (m1, m2) = transM xyz +rotateEyeX t (eye1, eye2) + = (multMM m1 eye1, multMM eye2 m2) + where (m1, m2) = rotxM t +rotateEyeY t (eye1, eye2) + = (multMM m1 eye1, multMM eye2 m2) + where (m1, m2) = rotyM t +rotateEyeZ t (eye1, eye2) + = (multMM m1 eye1, multMM eye2 m2) + where (m1, m2) = rotzM t + +------------------- +-- Bounding boxes +------------------- + +mergeBox (B x11 x12 y11 y12 z11 z12) (B x21 x22 y21 y22 z21 z22) = + B (x11 `min` x21) (x12 `max` x22) + (y11 `min` y21) (y12 `max` y22) + (z11 `min` z21) (z12 `max` z22) + +transformBox t (B x1 x2 y1 y2 z1 z2) + = (B (foldr1 min (map xCoord pts')) + (foldr1 max (map xCoord pts')) + (foldr1 min (map yCoord pts')) + (foldr1 max (map yCoord pts')) + (foldr1 min (map zCoord pts')) + (foldr1 max (map zCoord pts'))) + where pts' = map (multMP t) pts + pts = [point x1 y1 z1, + point x1 y1 z2, + point x1 y2 z1, + point x1 y2 z2, + point x2 y1 z1, + point x2 y1 z2, + point x2 y2 z1, + point x2 y2 z2] diff --git a/testsuite/tests/hpc/raytrace/Data.hs b/testsuite/tests/hpc/raytrace/Data.hs new file mode 100644 index 0000000000000000000000000000000000000000..d103766a573be8caa58ba14aa4aa79b0f29e4c92 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Data.hs @@ -0,0 +1,408 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Data where + +import Data.Array + +import CSG +import Geometry +import Illumination +import Primitives +import Surface + +import Debug.Trace + +-- Now the parsed (expresssion) language + +type Name = String + +type Code = [GMLToken] + +data GMLToken + -- All these can occur in parsed code + = TOp GMLOp + | TId Name + | TBind Name + | TBool Bool + | TInt Int + | TReal Double + | TString String + | TBody Code + | TArray Code + | TApply + | TIf + -- These can occur in optimized/transformed code + -- NONE (yet!) + + +instance Show GMLToken where + showsPrec p (TOp op) = shows op + showsPrec p (TId id) = showString id + showsPrec p (TBind id) = showString ('/' : id) + showsPrec p (TBool bool) = shows bool + showsPrec p (TInt i) = shows i + showsPrec p (TReal d) = shows d + showsPrec p (TString s) = shows s + showsPrec p (TBody code) = shows code + showsPrec p (TArray code) = showString "[ " + . foldr (\ a b -> a . showChar ' ' . b) id (map shows code) + . showString "]" + showsPrec p (TApply) = showString "apply" + showsPrec p (TIf) = showString "if" + + showList code = showString "{ " + . foldr (\ a b -> a . showChar ' ' . b) id (map shows code) + . showString "}" + + +-- Now the value language, used inside the interpreter + +type Stack = [GMLValue] + +data GMLValue + = VBool !Bool + | VInt !Int + | VReal !Double + | VString String + | VClosure Env Code + | VArray (Array Int GMLValue) -- FIXME: Haskell array + -- uses the interpreter version of point + | VPoint { xPoint :: !Double + , yPoint :: !Double + , zPoint :: !Double + } + -- these are abstract to the interpreter + | VObject Object + | VLight Light + -- This is an abstract object, used by the abstract interpreter + | VAbsObj AbsObj + + +-- There are only *3* basic abstract values, +-- and the combinators also. + +data AbsObj + = AbsFACE + | AbsU + | AbsV + deriving (Show) + +instance Show GMLValue where + showsPrec p value = showString (showStkEle value) + +showStkEle :: GMLValue -> String +showStkEle (VBool b) = show b ++ " :: Bool" +showStkEle (VInt i) = show i ++ " :: Int" +showStkEle (VReal r) = show r ++ " :: Real" +showStkEle (VString s) = show s ++ " :: String" +showStkEle (VClosure {}) = "<closure> :: Closure" +showStkEle (VArray arr) + = "<array (" ++ show (succ (snd (bounds arr))) ++ " elements)> :: Array" +showStkEle (VPoint x y z) = "(" ++ show x + ++ "," ++ show y + ++ "," ++ show z + ++ ") :: Point" +showStkEle (VObject {}) = "<Object> :: Object" +showStkEle (VLight {}) = "<Light> :: Object" +showStkEle (VAbsObj vobs) = "{{ " ++ show vobs ++ "}} :: AbsObj" + +-- An abstract environment + +newtype Env = Env [(Name, GMLValue)] deriving Show + +emptyEnv :: Env +emptyEnv = Env [] + +extendEnv :: Env -> Name -> GMLValue -> Env +extendEnv (Env e) n v = Env ((n, v):e) + +lookupEnv :: Env -> Name -> Maybe GMLValue +lookupEnv (Env e) n = lookup n e + +-- All primitive operators +-- +-- There is no Op_apply, Op_false, Op_true and Op_if +-- (because they appear explcitly in the rules). + +data GMLOp + = Op_acos + | Op_addi + | Op_addf + | Op_asin + | Op_clampf + | Op_cone + | Op_cos + | Op_cube + | Op_cylinder + | Op_difference + | Op_divi + | Op_divf + | Op_eqi + | Op_eqf + | Op_floor + | Op_frac + | Op_get + | Op_getx + | Op_gety + | Op_getz + | Op_intersect + | Op_length + | Op_lessi + | Op_lessf + | Op_light + | Op_modi + | Op_muli + | Op_mulf + | Op_negi + | Op_negf + | Op_plane + | Op_point + | Op_pointlight + | Op_real + | Op_render + | Op_rotatex + | Op_rotatey + | Op_rotatez + | Op_scale + | Op_sin + | Op_sphere + | Op_spotlight + | Op_sqrt + | Op_subi + | Op_subf + | Op_trace -- non standard, for debugging GML programs + | Op_translate + | Op_union + | Op_uscale + deriving (Eq,Ord,Ix,Bounded) + +instance Show GMLOp where + showsPrec _ op = showString (opNameTable ! op) + + +------------------------------------------------------------------------------ + +-- And how we use the op codes (there names, there interface) + +-- These keywords include, "apply", "if", "true" and "false", +-- they are not parsed as operators, but are +-- captured by the parser as a special case. + +keyWords :: [String] +keyWords = [ kwd | (kwd,_,_) <- opcodes ] + +-- Lookup has to look from the start (or else...) +opTable :: [(Name,GMLToken)] +opTable = [ (kwd,op) | (kwd,op,_) <- opcodes ] + +opNameTable :: Array GMLOp Name +opNameTable = array (minBound,maxBound) + [ (op,name) | (name,TOp op,_) <- opcodes ] + +undef = error "undefined function" +image = error "undefined function: talk to image group" + +-- typically, its best to have *one* opcode table, +-- so that mis-alignments do not happen. + +opcodes :: [(String,GMLToken,PrimOp)] +opcodes = + [ ("apply", TApply, error "incorrect use of apply") + , ("if", TIf, error "incorrect use of if") + , ("false", TBool False, error "incorrect use of false") + , ("true", TBool True, error "incorrect use of true") + ] ++ map (\ (a,b,c) -> (a,TOp b,c)) + -- These are just invocation, any coersions need to occur between here + -- and before arriving at the application code (like deg -> rad). + [ ("acos", Op_acos, Real_Real (rad2deg . acos)) + , ("addi", Op_addi, Int_Int_Int (+)) + , ("addf", Op_addf, Real_Real_Real (+)) + , ("asin", Op_asin, Real_Real (rad2deg . asin)) + , ("clampf", Op_clampf, Real_Real clampf) + , ("cone", Op_cone, Surface_Obj cone) + , ("cos", Op_cos, Real_Real (cos . deg2rad)) + , ("cube", Op_cube, Surface_Obj cube) + , ("cylinder", Op_cylinder, Surface_Obj cylinder) + , ("difference", Op_difference, Obj_Obj_Obj difference) + , ("divi", Op_divi, Int_Int_Int (ourQuot)) + , ("divf", Op_divf, Real_Real_Real (/)) + , ("eqi", Op_eqi, Int_Int_Bool (==)) + , ("eqf", Op_eqf, Real_Real_Bool (==)) + , ("floor", Op_floor, Real_Int floor) + , ("frac", Op_frac, Real_Real (snd . properFraction)) + , ("get", Op_get, Arr_Int_Value ixGet) + , ("getx", Op_getx, Point_Real (\ x y z -> x)) + , ("gety", Op_gety, Point_Real (\ x y z -> y)) + , ("getz", Op_getz, Point_Real (\ x y z -> z)) + , ("intersect", Op_intersect, Obj_Obj_Obj intersect) + , ("length", Op_length, Arr_Int (succ . snd . bounds)) + , ("lessi", Op_lessi, Int_Int_Bool (<)) + , ("lessf", Op_lessf, Real_Real_Bool (<)) + , ("light", Op_light, Point_Color_Light light) + , ("modi", Op_modi, Int_Int_Int (ourRem)) + , ("muli", Op_muli, Int_Int_Int (*)) + , ("mulf", Op_mulf, Real_Real_Real (*)) + , ("negi", Op_negi, Int_Int negate) + , ("negf", Op_negf, Real_Real negate) + , ("plane", Op_plane, Surface_Obj plane) + , ("point", Op_point, Real_Real_Real_Point VPoint) + , ("pointlight", Op_pointlight, Point_Color_Light pointlight) + , ("real", Op_real, Int_Real fromIntegral) + , ("render", Op_render, Render $ render eye) + , ("rotatex", Op_rotatex, Obj_Real_Obj (\ o d -> rotateX (deg2rad d) o)) + , ("rotatey", Op_rotatey, Obj_Real_Obj (\ o d -> rotateY (deg2rad d) o)) + , ("rotatez", Op_rotatez, Obj_Real_Obj (\ o d -> rotateZ (deg2rad d) o)) + , ("scale", Op_scale, Obj_Real_Real_Real_Obj (\ o x y z -> scale (x,y,z) o)) + , ("sin", Op_sin, Real_Real (sin . deg2rad)) + , ("sphere", Op_sphere, Surface_Obj sphere') -- see comment at end of file + , ("spotlight", Op_spotlight, Point_Point_Color_Real_Real_Light mySpotlight) + , ("sqrt", Op_sqrt, Real_Real ourSqrt) + , ("subi", Op_subi, Int_Int_Int (-)) + , ("subf", Op_subf, Real_Real_Real (-)) + , ("trace", Op_trace, Value_String_Value mytrace) + , ("translate", Op_translate, Obj_Real_Real_Real_Obj (\ o x y z -> translate (x,y,z) o)) + , ("union", Op_union, Obj_Obj_Obj union) + , ("uscale", Op_uscale, Obj_Real_Obj (\ o r -> uscale r o)) + ] + +-- This enumerate all possible ways of calling the fixed primitives + +-- The datatype captures the type at the *interp* level, +-- the type of the functional is mirrored on this (using Haskell types). + +data PrimOp + + -- 1 argument + = Int_Int (Int -> Int) + | Real_Real (Double -> Double) + | Point_Real (Double -> Double -> Double -> Double) + | Surface_Obj (SurfaceFn Color Double -> Object) + | Real_Int (Double -> Int) + | Int_Real (Int -> Double) + | Arr_Int (Array Int GMLValue -> Int) + + -- 2 arguments + | Int_Int_Int (Int -> Int -> Int) + | Int_Int_Bool (Int -> Int -> Bool) + | Real_Real_Real (Double -> Double -> Double) + | Real_Real_Bool (Double -> Double -> Bool) + | Arr_Int_Value (Array Int GMLValue -> Int -> GMLValue) + + -- Many arguments, typically image mangling + + | Obj_Obj_Obj (Object -> Object -> Object) + | Point_Color_Light (Coords -> Color -> Light) + | Real_Real_Real_Point (Double -> Double -> Double -> GMLValue) + | Obj_Real_Obj (Object -> Double -> Object) + | Obj_Real_Real_Real_Obj (Object -> Double -> Double -> Double -> Object) + | Value_String_Value (GMLValue -> String -> GMLValue) + + | Point_Point_Color_Real_Real_Light + (Coords -> Coords -> Color -> Radian -> Radian -> Light) + -- And finally render + | Render (Color -> [Light] -> Object -> Int -> Double -> Int -> Int -> String -> IO ()) + +data Type + = TyBool + | TyInt + | TyReal + | TyString + | TyCode + | TyArray + | TyPoint + | TyObject + | TyLight + | TyAlpha + | TyAbsObj + deriving (Eq,Ord,Ix,Bounded) + +typeTable = + [ ( TyBool, "Bool") + , ( TyInt, "Int") + , ( TyReal, "Real") + , ( TyString, "String") + , ( TyCode, "Code") + , ( TyArray, "Array") + , ( TyPoint, "Point") + , ( TyObject, "Object") + , ( TyLight, "Light") + , ( TyAlpha, "<anything>") + , ( TyAbsObj, "<abs>") + ] + +typeNames = array (minBound,maxBound) typeTable + +instance Show Type where + showsPrec _ op = showString (typeNames ! op) + +getPrimOpType :: PrimOp -> [Type] +getPrimOpType (Int_Int _) = [TyInt] +getPrimOpType (Real_Real _) = [TyReal] +getPrimOpType (Point_Real _) = [TyPoint] +getPrimOpType (Surface_Obj _) = [TyCode] +getPrimOpType (Real_Int _) = [TyReal] +getPrimOpType (Int_Real _) = [TyInt] +getPrimOpType (Arr_Int _) = [TyArray] +getPrimOpType (Int_Int_Int _) = [TyInt,TyInt] +getPrimOpType (Int_Int_Bool _) = [TyInt,TyInt] +getPrimOpType (Real_Real_Real _) = [TyReal,TyReal] +getPrimOpType (Real_Real_Bool _) = [TyReal,TyReal] +getPrimOpType (Arr_Int_Value _) = [TyArray,TyInt] +getPrimOpType (Obj_Obj_Obj _) = [TyObject,TyObject] +getPrimOpType (Point_Color_Light _) = [TyPoint,TyPoint] +getPrimOpType (Real_Real_Real_Point _) = [TyReal,TyReal,TyReal] +getPrimOpType (Obj_Real_Obj _) = [TyObject,TyReal] +getPrimOpType (Obj_Real_Real_Real_Obj _) = [TyObject,TyReal,TyReal,TyReal] +getPrimOpType (Value_String_Value _) = [TyAlpha,TyString] +getPrimOpType (Point_Point_Color_Real_Real_Light _) + = [TyPoint,TyPoint,TyPoint,TyReal,TyReal] +getPrimOpType (Render _) = [TyPoint, + TyLight, + TyObject, + TyInt, + TyReal, + TyReal, + TyReal, + TyString] + + +-- Some primitives with better error message + +mytrace v s = trace (s ++" : "++ show v ++ "\n") v + + +ixGet :: Array Int GMLValue -> Int -> GMLValue +ixGet arr i + | inRange (bounds arr) i = arr ! i + | otherwise = error ("failed access with index value " + ++ show i + ++ " (should be between 0 and " + ++ show (snd (bounds arr)) ++ ")") + +ourQuot :: Int -> Int -> Int +ourQuot _ 0 = error "attempt to use divi to divide by 0" +ourQuot a b = a `quot` b + +ourRem :: Int -> Int -> Int +ourRem _ 0 = error "attempt to use remi to divide by 0" +ourRem a b = a `rem` b + +ourSqrt :: Double -> Double +ourSqrt n | n < 0 = error "attempt to use sqrt on a negative number" + | otherwise = sqrt n + + +mySpotlight p1 p2 col cutoff exp = spotlight p1 p2 col (deg2rad cutoff) exp + +-- The problem specification gets the mapping for spheres backwards +-- (it maps the image from right to left). +-- We've fixed that in the raytracing library so that it goes from left +-- to right, but to keep the GML front compatible with the problem +-- statement, we reverse it here. + +sphere' :: SurfaceFn Color Double -> CSG (SurfaceFn Color Double) +sphere' (SFun f) = sphere (SFun (\i u v -> f i (1 - u) v)) +sphere' s = sphere s diff --git a/testsuite/tests/hpc/raytrace/Eval.hs b/testsuite/tests/hpc/raytrace/Eval.hs new file mode 100644 index 0000000000000000000000000000000000000000..7d451e975364ddb451cb85ab3ee2b418cf247183 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Eval.hs @@ -0,0 +1,371 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Eval where + +import Control.Monad +import Data.Array + +import Geometry +import CSG +import Surface +import Data +import Parse (rayParse, rayParseF) + +class Monad m => MonadEval m where + doOp :: PrimOp -> GMLOp -> Stack -> m Stack + tick :: m () + err :: String -> m a + + tick = return () + +newtype Pure a = Pure a deriving Show + +instance Functor Pure where + fmap = liftM + +instance Applicative Pure where + pure = Pure + (<*>) = ap + +instance Monad Pure where + Pure x >>= k = k x + return = pure + +instance MonadEval Pure where + doOp = doPureOp + err s = error s + +instance MonadEval IO where + doOp prim op stk = do { -- putStrLn ("Calling " ++ show op + -- ++ " << " ++ show stk ++ " >>") + doAllOp prim op stk + } + err s = error s + +data State + = State { env :: Env + , stack :: Stack + , code :: Code + } deriving Show + +callback :: Env -> Code -> Stack -> Stack +callback env code stk + = case eval (State { env = env, stack = stk, code = code}) of + Pure stk -> stk + +{-# SPECIALIZE eval :: State -> Pure Stack #-} +{-# SPECIALIZE eval :: State -> IO Stack #-} + +eval :: MonadEval m => State -> m Stack +eval st = + do { () <- return () -- $ unsafePerformIO (print st) -- Functional debugger + ; if moreCode st then + do { tick -- tick first, so as to catch loops on new eval. + ; st' <- step st + ; eval st' + } + else return (stack st) + } + +moreCode :: State -> Bool +moreCode (State {code = []}) = False +moreCode _ = True + +-- Step has a precondition that there *is* code to run +{-# SPECIALIZE step :: State -> Pure State #-} +{-# SPECIALIZE step :: State -> IO State #-} +step :: MonadEval m => State -> m State + +-- Rule 1: Pushing BaseValues +step st@(State{ stack = stack, code = (TBool b):cs }) + = return (st { stack = (VBool b):stack, code = cs }) +step st@(State{ stack = stack, code = (TInt i):cs }) + = return (st { stack = (VInt i):stack, code = cs }) +step st@(State{ stack = stack, code = (TReal r):cs }) + = return (st { stack = (VReal r):stack, code = cs }) +step st@(State{ stack = stack, code = (TString s):cs }) + = return (st { stack = (VString s):stack, code = cs }) + +-- Rule 2: Name binding +step st@(State{ env = env, stack = (v:stack), code = (TBind id):cs }) = + return (State { env = extendEnv env id v, stack = stack, code = cs }) +step st@(State{ env = env, stack = [], code = (TBind id):cs }) = + err "Attempt to bind the top of an empty stack" + +-- Rule 3: Name lookup +step st@(State{ env = env, stack = stack, code = (TId id):cs }) = + case (lookupEnv env id) of + Just v -> return (st { stack = v:stack, code = cs }) + Nothing -> err ("Cannot find value for identifier: " ++ id) + +-- Rule 4: Closure creation +step st@(State{ env = env, stack = stack, code = (TBody body):cs }) = + return (st { stack = (VClosure env body):stack, code = cs }) + +-- Rule 5: Application +step st@(State{ env = env, stack = (VClosure env' code'):stack, code = TApply:cs }) = + do { stk <- eval (State {env = env', stack = stack, code = code'}) + ; return (st { stack = stk, code = cs }) + } +step st@(State{ env = env, stack = [], code = TApply:cs }) = + err "Application with an empty stack" +step st@(State{ env = env, stack = _:_, code = TApply:cs }) = + err "Application of a non-closure" + +-- Rule 6: Arrays +step st@(State{ env = env, stack = stack, code = TArray code':cs }) = + do { stk <- eval (State {env = env, stack = [], code = code'}) + ; let last = length stk-1 + ; let arr = array (0,last) (zip [last,last-1..] stk) + ; return (st { stack = (VArray arr):stack, code = cs }) + } + +-- Rule 7 & 8: If statement +step st@(State{ env = env, stack = (VClosure e2 c2):(VClosure e1 c1):(VBool True):stack, code = TIf:cs }) = + do { stk <- eval (State {env = e1, stack = stack, code = c1}) + ; return (st { stack = stk, code = cs }) + } +step st@(State{ env = env, stack = (VClosure e2 c2):(VClosure e1 c1):(VBool False):stack, code = TIf:cs }) = + do { stk <- eval (State {env = e2, stack = stack, code = c2}) + ; return (st { stack = stk, code = cs }) + } +step st@(State{ env = env, stack = _, code = TIf:cs }) = + err "Incorrect use of if (bad and/or inappropriate values on the stack)" + +-- Rule 9: Operators +step st@(State{ env = env, stack = stack, code = (TOp op):cs }) = + do { stk <- doOp (opFnTable ! op) op stack + ; return (st { stack = stk, code = cs }) + } + +-- Rule Opps +step _ = err "Tripped on sidewalk while stepping." + + +-------------------------------------------------------------------------- +-- Operator code + +opFnTable :: Array GMLOp PrimOp +opFnTable = array (minBound,maxBound) + [ (op,prim) | (_,TOp op,prim) <- opcodes ] + + + + +doPureOp :: (MonadEval m) => PrimOp -> GMLOp -> Stack -> m Stack +doPureOp _ Op_render _ = + err ("\nAttempting to call render from inside a purely functional callback.") +doPureOp primOp op stk = doPrimOp primOp op stk -- call the purely functional operators + +{-# SPECIALIZE doPrimOp :: PrimOp -> GMLOp -> Stack -> Pure Stack #-} +{-# SPECIALIZE doPrimOp :: PrimOp -> GMLOp -> Stack -> IO Stack #-} +{-# SPECIALIZE doPrimOp :: PrimOp -> GMLOp -> Stack -> Abs Stack #-} + +doPrimOp :: (MonadEval m) => PrimOp -> GMLOp -> Stack -> m Stack + +-- 1 argument. + +doPrimOp (Int_Int fn) _ (VInt i1:stk) + = return ((VInt (fn i1)) : stk) +doPrimOp (Real_Real fn) _ (VReal r1:stk) + = return ((VReal (fn r1)) : stk) +doPrimOp (Point_Real fn) _ (VPoint x y z:stk) + = return ((VReal (fn x y z)) : stk) + +-- This is where the callbacks happen from... +doPrimOp (Surface_Obj fn) _ (VClosure env code:stk) + = case absapply env code [VAbsObj AbsFACE,VAbsObj AbsU,VAbsObj AbsV] of + Just [VReal r3,VReal r2,VReal r1,VPoint c1 c2 c3] -> + let + res = prop (color c1 c2 c3) r1 r2 r3 + in + return ((VObject (fn (SConst res))) : stk) + _ -> return ((VObject (fn (SFun call))) : stk) + where + -- The most general case + call i r1 r2 = + case callback env code [VReal r2,VReal r1,VInt i] of + [VReal r3,VReal r2,VReal r1,VPoint c1 c2 c3] + -> prop (color c1 c2 c3) r1 r2 r3 + stk -> error ("callback failed: incorrectly typed return arguments" + ++ show stk) + +doPrimOp (Real_Int fn) _ (VReal r1:stk) + = return ((VInt (fn r1)) : stk) +doPrimOp (Int_Real fn) _ (VInt r1:stk) + = return ((VReal (fn r1)) : stk) +doPrimOp (Arr_Int fn) _ (VArray arr:stk) + = return ((VInt (fn arr)) : stk) + +-- 2 arguments. + +doPrimOp (Int_Int_Int fn) _ (VInt i2:VInt i1:stk) + = return ((VInt (fn i1 i2)) : stk) +doPrimOp (Int_Int_Bool fn) _ (VInt i2:VInt i1:stk) + = return ((VBool (fn i1 i2)) : stk) +doPrimOp (Real_Real_Real fn) _ (VReal r2:VReal r1:stk) + = return ((VReal (fn r1 r2)) : stk) +doPrimOp (Real_Real_Bool fn) _ (VReal r2:VReal r1:stk) + = return ((VBool (fn r1 r2)) : stk) +doPrimOp (Arr_Int_Value fn) _ (VInt i:VArray arr:stk) + = return ((fn arr i) : stk) + + + -- Many arguments, typically image mangling + +doPrimOp (Obj_Obj_Obj fn) _ (VObject o2:VObject o1:stk) + = return ((VObject (fn o1 o2)) : stk) +doPrimOp (Point_Color_Light fn) _ (VPoint r g b:VPoint x y z : stk) + = return (VLight (fn (x,y,z) (color r g b)) : stk) +doPrimOp (Point_Point_Color_Real_Real_Light fn) _ + (VReal r2:VReal r1:VPoint r g b:VPoint x2 y2 z2:VPoint x1 y1 z1 : stk) + = return (VLight (fn (x1,y1,z1) (x2,y2,z2) (color r g b) r1 r2) : stk) +doPrimOp (Real_Real_Real_Point fn) _ (VReal r3:VReal r2:VReal r1:stk) + = return ((fn r1 r2 r3) : stk) +doPrimOp (Obj_Real_Obj fn) _ (VReal r:VObject o:stk) + = return (VObject (fn o r) : stk) +doPrimOp (Obj_Real_Real_Real_Obj fn) _ (VReal r3:VReal r2:VReal r1:VObject o:stk) + = return (VObject (fn o r1 r2 r3) : stk) + +-- This one is our testing harness +doPrimOp (Value_String_Value fn) _ (VString s:o:stk) + = res `seq` return (res : stk) + where + res = fn o s + +doPrimOp primOp op args + = err ("\n\ntype error when attempting to execute builtin primitive \"" ++ + show op ++ "\"\n\n| " ++ + show op ++ " takes " ++ show (length types) ++ " argument" ++ s + ++ " with" ++ the ++ " type" ++ s ++ "\n|\n|" ++ + " " ++ unwords [ show ty | ty <- types ] ++ "\n|\n|" ++ + " currently, the relevent argument" ++ s ++ " on the stack " ++ + are ++ "\n|\n| " ++ + unwords [ "(" ++ show arg ++ ")" + | arg <- reverse (take (length types) args) ] ++ "\n|\n| " + ++ " (top of stack is on the right hand side)\n\n") + where + len = length types + s = (if len /= 1 then "s" else "") + are = (if len /= 1 then "are" else "is") + the = (if len /= 1 then "" else " the") + types = getPrimOpType primOp + + +-- Render is somewhat funny, because it can only get called at top level. +-- All other operations are purely functional. + +doAllOp :: PrimOp -> GMLOp -> Stack -> IO Stack +doAllOp (Render render) Op_render + (VString str:VInt ht:VInt wid:VReal fov + :VInt dep:VObject obj:VArray arr + :VPoint r g b : stk) + = do { render (color r g b) lights obj dep (fov * (pi / 180.0)) wid ht str + ; return stk + } + where + lights = [ light | (VLight light) <- elems arr ] + +doAllOp primOp op stk = doPrimOp primOp op stk -- call the purely functional operators + +------------------------------------------------------------------------------ +{- + - Abstract evaluation. + - + - The idea is you check for constant code that + - (1) does not look at its arguments + - (2) gives a fixed result + - + - We run for 100 steps. + - + -} + +absapply :: Env -> Code -> Stack -> Maybe Stack +absapply env code stk = + case runAbs (eval (State env stk code)) 100 of + AbsState stk _ -> Just stk + AbsFail m -> Nothing + +newtype Abs a = Abs { runAbs :: Int -> AbsState a } +data AbsState a = AbsState a !Int + | AbsFail String + +instance Functor Abs where + fmap = liftM + +instance Applicative Abs where + pure x = Abs (\ n -> AbsState x n) + (<*>) = ap + +instance Monad Abs where + (Abs fn) >>= k = Abs (\ s -> case fn s of + AbsState r s' -> runAbs (k r) s' + AbsFail m -> AbsFail m) + return = pure + +instance MonadFail Abs where + fail s = Abs (\ n -> AbsFail s) + +instance MonadEval Abs where + doOp = doAbsOp + err = fail + tick = Abs (\ n -> if n <= 0 + then AbsFail "run out of time" + else AbsState () (n-1)) + +doAbsOp :: PrimOp -> GMLOp -> Stack -> Abs Stack +doAbsOp _ Op_point (VReal r3:VReal r2:VReal r1:stk) + = return ((VPoint r1 r2 r3) : stk) + -- here, you could have an (AbsPoint :: AbsObj) which you put on the + -- stack, with any object in the three fields. +doAbsOp _ op _ = err ("operator not understood (" ++ show op ++ ")") + +------------------------------------------------------------------------------ +-- Driver + +mainEval :: Code -> IO () +mainEval prog = do { stk <- eval (State emptyEnv [] prog) + ; return () + } +{- + * Oops, one of the example actually has something + * on the stack at the end. + * Oh well... + ; if null stk + then return () + else do { putStrLn done + ; print stk + } +-} + +done = "Items still on stack at (successful) termination of program" + +------------------------------------------------------------------------------ +-- testing + +test :: String -> Pure Stack +test is = eval (State emptyEnv [] (rayParse is)) + +testF :: String -> IO Stack +testF is = do prog <- rayParseF is + eval (State emptyEnv [] prog) + +testA :: String -> Either String (Stack,Int) +testA is = case runAbs (eval (State emptyEnv + [VAbsObj AbsFACE,VAbsObj AbsU,VAbsObj AbsV] + (rayParse is))) 100 of + AbsState a n -> Right (a,n) + AbsFail m -> Left m + +abstest1 = "1.0 0.0 0.0 point /red { /v /u /face red 1.0 0.0 1.0 } apply" + +-- should be [3:: Int] +et1 = test "1 /x { x } /f 2 /x f apply x addi" + + + + + diff --git a/testsuite/tests/hpc/raytrace/Geometry.hs b/testsuite/tests/hpc/raytrace/Geometry.hs new file mode 100644 index 0000000000000000000000000000000000000000..39592bcf1b6e859da8fe9055ded366777a4669f6 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Geometry.hs @@ -0,0 +1,313 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Geometry + ( Coords + , Ray + , Point -- abstract + , Vector -- abstract + , Matrix -- abstract + , Color -- abstract + , Box(..) + , Radian + , matrix + , coord + , color + , uncolor + , xCoord , yCoord , zCoord + , xComponent , yComponent , zComponent + , point + , vector + , nearV + , point_to_vector + , vector_to_point + , dot + , cross + , tangents + , addVV + , addPV + , subVV + , negV + , subPP + , norm + , normalize + , dist2 + , sq + , distFrom0Sq + , distFrom0 + , multSV + , multMM + , transposeM + , multMV + , multMP + , multMQ + , multMR + , white + , black + , addCC + , subCC + , sumCC + , multCC + , multSC + , nearC + , offsetToPoint + , epsilon + , inf + , nonZero + , eqEps + , near + , clampf + ) where + + +type Coords = (Double,Double,Double) + +type Ray = (Point,Vector) -- origin of ray, and unit vector giving direction + +data Point = P !Double !Double !Double -- implicit extra arg of 1 + deriving (Show) +data Vector = V !Double !Double !Double -- implicit extra arg of 0 + deriving (Show, Eq) +data Matrix = M !Quad !Quad !Quad !Quad + deriving (Show) + +data Color = C !Double !Double !Double + deriving (Show, Eq) + +data Box = B !Double !Double !Double !Double !Double !Double + deriving (Show) + +data Quad = Q !Double !Double !Double !Double + deriving (Show) + +type Radian = Double + +type Tup4 a = (a,a,a,a) + +--{-# INLINE matrix #-} +matrix :: Tup4 (Tup4 Double) -> Matrix +matrix ((m11, m12, m13, m14), + (m21, m22, m23, m24), + (m31, m32, m33, m34), + (m41, m42, m43, m44)) + = M (Q m11 m12 m13 m14) + (Q m21 m22 m23 m24) + (Q m31 m32 m33 m34) + (Q m41 m42 m43 m44) + +coord x y z = (x, y, z) + +color r g b = C r g b + +uncolor (C r g b) = (r,g,b) + +{-# INLINE xCoord #-} +xCoord (P x y z) = x +{-# INLINE yCoord #-} +yCoord (P x y z) = y +{-# INLINE zCoord #-} +zCoord (P x y z) = z + +{-# INLINE xComponent #-} +xComponent (V x y z) = x +{-# INLINE yComponent #-} +yComponent (V x y z) = y +{-# INLINE zComponent #-} +zComponent (V x y z) = z + +point :: Double -> Double -> Double -> Point +point x y z = P x y z + +vector :: Double -> Double -> Double -> Vector +vector x y z = V x y z + +nearV :: Vector -> Vector -> Bool +nearV (V a b c) (V d e f) = a `near` d && b `near` e && c `near` f + +point_to_vector :: Point -> Vector +point_to_vector (P x y z) = V x y z + +vector_to_point :: Vector -> Point +vector_to_point (V x y z) = P x y z + +{-# INLINE vector_to_quad #-} +vector_to_quad :: Vector -> Quad +vector_to_quad (V x y z) = Q x y z 0 + +{-# INLINE point_to_quad #-} +point_to_quad :: Point -> Quad +point_to_quad (P x y z) = Q x y z 1 + +{-# INLINE quad_to_point #-} +quad_to_point :: Quad -> Point +quad_to_point (Q x y z _) = P x y z + +{-# INLINE quad_to_vector #-} +quad_to_vector :: Quad -> Vector +quad_to_vector (Q x y z _) = V x y z + +--{-# INLINE dot #-} +dot :: Vector -> Vector -> Double +dot (V x1 y1 z1) (V x2 y2 z2) = x1 * x2 + y1 * y2 + z1 * z2 + +cross :: Vector -> Vector -> Vector +cross (V x1 y1 z1) (V x2 y2 z2) + = V (y1 * z2 - z1 * y2) (z1 * x2 - x1 * z2) (x1 * y2 - y1 * x2) + +-- assumption: the input vector is a normal +tangents :: Vector -> (Vector, Vector) +tangents v@(V x y z) + = (v1, v `cross` v1) + where v1 | x == 0 = normalize (vector 0 z (-y)) + | otherwise = normalize (vector (-y) x 0) + +{-# INLINE dot4 #-} +dot4 :: Quad -> Quad -> Double +dot4 (Q x1 y1 z1 w1) (Q x2 y2 z2 w2) = x1 * x2 + y1 * y2 + z1 * z2 + w1 * w2 + +addVV :: Vector -> Vector -> Vector +addVV (V x1 y1 z1) (V x2 y2 z2) + = V (x1 + x2) (y1 + y2) (z1 + z2) + +addPV :: Point -> Vector -> Point +addPV (P x1 y1 z1) (V x2 y2 z2) + = P (x1 + x2) (y1 + y2) (z1 + z2) + +subVV :: Vector -> Vector -> Vector +subVV (V x1 y1 z1) (V x2 y2 z2) + = V (x1 - x2) (y1 - y2) (z1 - z2) + +negV :: Vector -> Vector +negV (V x1 y1 z1) + = V (-x1) (-y1) (-z1) + +subPP :: Point -> Point -> Vector +subPP (P x1 y1 z1) (P x2 y2 z2) + = V (x1 - x2) (y1 - y2) (z1 - z2) + +--{-# INLINE norm #-} +norm :: Vector -> Double +norm (V x y z) = sqrt (sq x + sq y + sq z) + +--{-# INLINE normalize #-} +-- normalize a vector to a unit vector +normalize :: Vector -> Vector +normalize v@(V x y z) + | norm /= 0 = multSV (1/norm) v + | otherwise = error "normalize empty!" + where norm = sqrt (sq x + sq y + sq z) + +-- This does computes the distance *squared* +dist2 :: Point -> Point -> Double +dist2 us vs = sq x + sq y + sq z + where + (V x y z) = subPP us vs + +{-# INLINE sq #-} +sq :: Double -> Double +sq d = d * d + +{-# INLINE distFrom0Sq #-} +distFrom0Sq :: Point -> Double -- Distance of point from origin. +distFrom0Sq (P x y z) = sq x + sq y + sq z + +{-# INLINE distFrom0 #-} +distFrom0 :: Point -> Double -- Distance of point from origin. +distFrom0 p = sqrt (distFrom0Sq p) + +--{-# INLINE multSV #-} +multSV :: Double -> Vector -> Vector +multSV k (V x y z) = V (k*x) (k*y) (k*z) + +--{-# INLINE multMM #-} +multMM :: Matrix -> Matrix -> Matrix +multMM m1@(M q1 q2 q3 q4) m2 + = M (multMQ m2' q1) + (multMQ m2' q2) + (multMQ m2' q3) + (multMQ m2' q4) + where + m2' = transposeM m2 + +{-# INLINE transposeM #-} +transposeM :: Matrix -> Matrix +transposeM (M (Q e11 e12 e13 e14) + (Q e21 e22 e23 e24) + (Q e31 e32 e33 e34) + (Q e41 e42 e43 e44)) = (M (Q e11 e21 e31 e41) + (Q e12 e22 e32 e42) + (Q e13 e23 e33 e43) + (Q e14 e24 e34 e44)) + + +--multMM m1 m2 = [map (dot4 row) (transpose m2) | row <- m1] + +--{-# INLINE multMV #-} +multMV :: Matrix -> Vector -> Vector +multMV m v = quad_to_vector (multMQ m (vector_to_quad v)) + +--{-# INLINE multMP #-} +multMP :: Matrix -> Point -> Point +multMP m p = quad_to_point (multMQ m (point_to_quad p)) + +-- mat vec = map (dot4 vec) mat + +{-# INLINE multMQ #-} +multMQ :: Matrix -> Quad -> Quad +multMQ (M q1 q2 q3 q4) q + = Q (dot4 q q1) + (dot4 q q2) + (dot4 q q3) + (dot4 q q4) + +{-# INLINE multMR #-} +multMR :: Matrix -> Ray -> Ray +multMR m (r, v) = (multMP m r, multMV m v) + +white :: Color +white = C 1 1 1 +black :: Color +black = C 0 0 0 + +addCC :: Color -> Color -> Color +addCC (C a b c) (C d e f) = C (a+d) (b+e) (c+f) + +subCC :: Color -> Color -> Color +subCC (C a b c) (C d e f) = C (a-d) (b-e) (c-f) + +sumCC :: [Color] -> Color +sumCC = foldr addCC black + +multCC :: Color -> Color -> Color +multCC (C a b c) (C d e f) = C (a*d) (b*e) (c*f) + +multSC :: Double -> Color -> Color +multSC k (C a b c) = C (a*k) (b*k) (c*k) + +nearC :: Color -> Color -> Bool +nearC (C a b c) (C d e f) = a `near` d && b `near` e && c `near` f + +offsetToPoint :: Ray -> Double -> Point +offsetToPoint (r,v) i = r `addPV` (i `multSV` v) + +-- + +epsilon, inf :: Double -- aproximate zero and infinity +epsilon = 1.0e-10 +inf = 1.0e20 + +nonZero :: Double -> Double -- Use before a division. It makes definitions +nonZero x | x > epsilon = x -- more complete and I bet the errors that get + | x < -epsilon = x -- introduced will be undetectable if epsilon + | otherwise = epsilon -- is small enough + + +eqEps x y = abs (x-y) < epsilon +near = eqEps + +clampf :: Double -> Double +clampf p | p < 0 = 0 + | p > 1 = 1 + | True = p diff --git a/testsuite/tests/hpc/raytrace/Illumination.hs b/testsuite/tests/hpc/raytrace/Illumination.hs new file mode 100644 index 0000000000000000000000000000000000000000..34365b9e3cae79076d4378f775b923ca7d96d473 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Illumination.hs @@ -0,0 +1,231 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +-- Modified to use stdout (for testing) + +module Illumination + ( Object + , Light (..) + , light, pointlight, spotlight + , render + ) where + +import Data.Array +import Data.Char(chr) +import Data.Maybe + +import Geometry +import CSG +import Surface +import Misc + +type Object = CSG (SurfaceFn Color Double) + +data Cxt = Cxt {ambient::Color, lights::[Light], object::Object, depth::Int} + deriving Show + +render :: (Matrix,Matrix) -> Color -> [Light] -> Object -> Int -> + Radian -> Int -> Int -> String -> IO () +render (m,m') amb ls obj dep fov wid ht file + = do { debugging + ; txt <- readFile "galois.sample" + ; let vals = read txt + ; let rt_vals = showBitmap' wid ht pixels + ; if length vals /= length rt_vals + then print ("BAD LENGTH",length vals,length rt_vals) + else do { + ; let cmp = sum(zipWith (\ a b -> abs (a - b) * abs (a - b)) vals rt_vals) + ; print $ if cmp <= (length vals * 16) then ("GOOD MATCH") else ("BAD MATCH:" ++ show cmp) + }} + + where + debugging = return () +{- + do { putStrLn (show cxt) + ; putStrLn (show (width, delta, aspect, left, top)) + } +-} + obj' = transform (m',m) obj + ls' = [ transformLight m' l | l <- ls ] + pixelA = listArray ((1,1), (ht,wid)) + [ illumination cxt (start,pixel i j) + | j <- take ht [0.5..] + , i <- take wid [0.5..] ] + antiA = pixelA // + [ (ix, superSample ix (pixelA ! ix)) + | j <- [2 .. ht - 1], i <- [2 .. wid - 1] + , let ix = (j, i) + , contrast ix pixelA ] + pixels = [ [ illumination cxt (start,pixel i j) | i<- take wid [0.5..] ] + | j <- take ht [0.5..] + ] + cxt = Cxt {ambient=amb, lights=ls', object=obj', depth=dep} + start = point 0 0 (-1) + width = 2 * tan (fov/2) + delta = width / fromIntegral wid + aspect = fromIntegral ht / fromIntegral wid + left = - width / 2 + top = - left * aspect + pixel i j = vector (left + i*delta) (top - j*delta) 1 + + superSample (y, x) col = avg $ col: + [ illumination cxt (start, pixel (fromIntegral x - 0.5 + xd) (fromIntegral y - 0.5 + yd)) + | (xd, yd) <- [(-0.333, 0.0), (0.333, 0.0), (0.0, -0.333), (0.0, 0.333)] + ] + +avg cs = divN (fromIntegral (length cs)) (uncolor (sumCC cs)) + where divN n (r,g,b) = color (r / n) (g / n) (b / n) + +contrast :: (Int, Int) -> Array (Int, Int) Color -> Bool +contrast (x, y) arr = any diffMax [ subCC cur (arr ! (x + xd, y + yd)) + | xd <- [-1, 1], yd <- [-1, 1] + ] + where cur = arr ! (x, y) + diffMax col = (abs r) > 0.25 || (abs g) > 0.2 || (abs b) > 0.4 + where + (r,g,b) = uncolor col + + +illumination :: Cxt -> Ray -> Color +illumination cxt (r,v) + | depth cxt <= 0 = black + | otherwise = case castRay (r,v) (object cxt) of + Nothing -> black + Just info -> illum (cxt{depth=(depth cxt)-1}) info v + +illum :: Cxt -> (Point,Vector,Properties Color Double) -> Vector -> Color +illum cxt (pos,normV,(col,kd,ks,n)) v + = ambTerm `addCC` difTerm `addCC` spcTerm `addCC` recTerm + where + visibleLights = unobscured pos (object cxt) (lights cxt) normV + d = depth cxt + amb = ambient cxt + newV = subVV v (multSV (2 * dot normV v) normV) + + ambTerm = multSC kd (multCC amb col) + difTerm = multSC kd (sumCC [multSC (dot normV lj) (multCC intensity col) + |(loc,intensity) <- visibleLights, + let lj = normalize ({- pos `subVV` -} loc)]) + -- ZZ might want to avoid the phong, when you can... + spcTerm = multSC ks (sumCC [multSC ((dot normV hj) ** n ) (multCC intensity col) + |(loc,intensity) <- visibleLights, + -- ZZ note this is specific to the light at infinity + let lj = {- pos `subVV` -} normalize loc, + let hj = normalize (lj `subVV` normalize v)]) + recTerm = if recCoeff `nearC` black then black else multCC recCoeff recRay + recCoeff = multSC ks col + recRay = illumination cxt (pos,newV) + +showBitmapA :: Int -> Int -> Array (Int, Int) Color -> String +showBitmapA wid ht arr + = header ++ concatMap scaleColor (elems arr) + where + scaleColor col = [scalePixel r, scalePixel g, scalePixel b] + where (r,g,b) = uncolor col + header = "P6\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n" + +showBitmap :: Int -> Int ->[[Color]] -> String +showBitmap wid ht pss +-- type of assert | length pss == ht && all (\ ps -> length ps == wid) pss + = header ++ concat [[scalePixel r,scalePixel g,scalePixel b] + | ps <- pss, (r,g,b) <- map uncolor ps] + where + header = "P6\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n" +showBitmap _ _ _ = error "incorrect length of bitmap string" + +scalePixel :: Double -> Char +scalePixel p = chr (floor (clampf p * 255)) + +showBitmap' :: Int -> Int ->[[Color]] -> [Int] +showBitmap' wid ht pss +-- type of assert | length pss == ht && all (\ ps -> length ps == wid) pss + = concat [ concat [ [scalePixel' r,scalePixel' g,scalePixel' b] + | (r,g,b) <- map uncolor ps] + | ps <- pss ] + where + header = "P3\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n" +showBitmap' _ _ _ = error "incorrect length of bitmap string" + +scalePixel' :: Double -> Int +scalePixel' p = floor (clampf p * 255) + +-- Lights + +data Light = Light Vector Color + | PointLight Point Color + | SpotLight Point Point Color Radian Double + deriving Show + +light :: Coords -> Color -> Light +light (x,y,z) color = + Light (normalize (vector (-x) (-y) (-z))) color +pointlight (x,y,z) color = + PointLight (point x y z) color +spotlight (x,y,z) (p,q,r) col cutoff exp = + SpotLight (point x y z) (point p q r) col cutoff exp + +transformLight m (Light v c) = Light (multMV m v) c +transformLight m (PointLight p c) = PointLight (multMP m p) c +transformLight m (SpotLight p q c r d) = SpotLight (multMP m p) (multMP m q) c r d + +unobscured :: Point -> Object -> [Light] -> Vector -> [(Vector,Color)] +unobscured pos obj lights normV = catMaybes (map (unobscure pos obj normV) lights) + +unobscure :: Point -> Object -> Vector -> Light -> Maybe (Vector,Color) +unobscure pos obj normV (Light vec color) + -- ZZ probably want to make this faster + | vec `dot` normV < 0 = Nothing + | intersects (pos `addPV` (0.0001 `multSV` vec),vec) obj = Nothing + | otherwise = Just (vec,color) +unobscure pos obj normV (PointLight pp color) + | vec `dot` normV < 0 = Nothing + | intersectWithin (pos `addPV` (0.0001 `multSV` (normalize vec)), vec) obj = Nothing + | otherwise = Just (vec,is) + where vec = pp `subPP` pos + is = attenuate vec color +unobscure org obj normV (SpotLight pos at color cutoff exp) + | vec `dot` normV < 0 = Nothing + | intersectWithin (org `addPV` (0.0001 `multSV` (normalize vec)), vec) obj = Nothing + | angle > cutoff = Nothing + | otherwise = Just (vec, is) + where vec = pos `subPP` org + vec' = pos `subPP` at + angle = acos (normalize vec `dot` (normalize vec')) + + asp = normalize (at `subPP` pos) + qsp = normalize (org `subPP` pos) + is = attenuate vec (((asp `dot` qsp) ** exp) `multSC` color) + +attenuate :: Vector -> Color -> Color +attenuate vec color = (100 / (99 + sq (norm vec))) `multSC` color + +-- + +castRay ray p + = case intersectRayWithObject ray p of + (True, _, _) -> Nothing -- eye is inside + (False, [], _) -> Nothing -- eye is inside + (False, (0, b, _) : _, _) -> Nothing -- eye is inside + (False, (i, False, _) : _, _) -> Nothing -- eye is inside + (False, (t, b, (s, p0)) : _, _) -> + let (v, prop) = surface s p0 in + Just (offsetToPoint ray t, v, prop) + +intersects ray p + = case intersectRayWithObject ray p of + (True, _, _) -> False + (False, [], _) -> False + (False, (0, b, _) : _, _) -> False + (False, (i, False, _) : _, _) -> False + (False, (i, b, _) : _, _) -> True + +intersectWithin :: Ray -> Object -> Bool +intersectWithin ray p + = case intersectRayWithObject ray p of + (True, _, _) -> False -- eye is inside + (False, [], _) -> False -- eye is inside + (False, (0, b, _) : _, _) -> False -- eye is inside + (False, (i, False, _) : _, _) -> False -- eye is inside + (False, (t, b, _) : _, _) -> t < 1.0 diff --git a/testsuite/tests/hpc/raytrace/Intersections.hs b/testsuite/tests/hpc/raytrace/Intersections.hs new file mode 100644 index 0000000000000000000000000000000000000000..58210c30f95dc70d5222f1897f1290916f58d860 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Intersections.hs @@ -0,0 +1,404 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Intersections + ( intersectRayWithObject, + quadratic + ) where + +import Data.Maybe(isJust) + +import Construct +import Geometry +import Interval +import Misc + +-- This is factored into two bits. The main function `intersections' +-- intersects a line with an object. +-- The wrapper call `intersectRayWithObject' coerces this to an intersection +-- with a ray by clamping the result to start at 0. + +intersectRayWithObject ray p + = clampIntervals is + where is = intersections ray p + +clampIntervals (True, [], True) = (False, [(0, True, undefined)], True) +clampIntervals empty@(False, [], False) = empty +clampIntervals (True, is@((i, False, p) : is'), isOpen) + | i `near` 0 || i < 0 + = clampIntervals (False, is', isOpen) + | otherwise + = (False, (0, True, undefined) : is, isOpen) +clampIntervals ivals@(False, is@((i, True, p) : is'), isOpen) + | i `near` 0 || i < 0 + -- can unify this with first case... + = clampIntervals (True, is', isOpen) + | otherwise + = ivals + +intersections ray (Union p q) + = unionIntervals is js + where is = intersections ray p + js = intersections ray q + +intersections ray (Intersect p q) + = intersectIntervals is js + where is = intersections ray p + js = intersections ray q + +intersections ray (Difference p q) + = differenceIntervals is (negateSurfaces js) + where is = intersections ray p + js = intersections ray q + +intersections ray (Transform m m' p) + = mapI (xform m) is + where is = intersections (m' `multMR` ray) p + xform m (i, b, (s, p0)) = (i, b, (transformSurface m s, p0)) + +intersections ray (Box box p) + | intersectWithBox ray box = intersections ray p + | otherwise = emptyIList + +intersections ray p@(Plane s) + = intersectPlane ray s + +intersections ray p@(Sphere s) + = intersectSphere ray s + +intersections ray p@(Cube s) + = intersectCube ray s + +intersections ray p@(Cylinder s) + = intersectCylinder ray s + +intersections ray p@(Cone s) + = intersectCone ray s + +negateSurfaces :: IList (Surface, Texture a) -> IList (Surface, Texture a) +negateSurfaces = mapI negSurf + where negSurf (i, b, (s,t)) = (i, b, (negateSurface s, t)) + +negateSurface (Planar p0 v0 v1) + = Planar p0 v1 v0 +negateSurface (Spherical p0 v0 v1) + = Spherical p0 v1 v0 +negateSurface (Cylindrical p0 v0 v1) + = Cylindrical p0 v1 v0 +negateSurface (Conic p0 v0 v1) + = Conic p0 v1 v0 + +transformSurface m (Planar p0 v0 v1) + = Planar p0' v0' v1' + where p0' = multMP m p0 + v0' = multMV m v0 + v1' = multMV m v1 + +transformSurface m (Spherical p0 v0 v1) + = Spherical p0' v0' v1' + where p0' = multMP m p0 + v0' = multMV m v0 + v1' = multMV m v1 + +-- ditto as above +transformSurface m (Cylindrical p0 v0 v1) + = Cylindrical p0' v0' v1' + where p0' = multMP m p0 + v0' = multMV m v0 + v1' = multMV m v1 + +transformSurface m (Conic p0 v0 v1) + = Conic p0' v0' v1' + where p0' = multMP m p0 + v0' = multMV m v0 + v1' = multMV m v1 + +-------------------------------- +-- Plane +-------------------------------- + +intersectPlane :: Ray -> a -> IList (Surface, Texture a) +intersectPlane ray texture = intersectXZPlane PlaneFace ray 0.0 texture + +intersectXZPlane :: Face -> Ray -> Double -> a -> IList (Surface, Texture a) +intersectXZPlane n (r,v) yoffset texture + | b `near` 0 + = -- the ray is parallel to the plane - it's either all in, or all out + if y `near` yoffset || y < yoffset then openIList else emptyIList + + -- The line intersects the plane. Find t such that + -- (x + at, y + bt, z + ct) intersects the X-Z plane. + -- t may be negative (the ray starts within the halfspace), + -- but we'll catch that later when we clamp the intervals + + | b < 0 -- the ray is pointing downwards + = (False, [mkEntry (t0, (Planar p0 v0 v1, (n, p0, texture)))], True) + + | otherwise -- the ray is pointing upwards + = (True, [mkExit (t0, (Planar p0 v0 v1, (n, p0, texture)))], False) + + where t0 = (yoffset-y) / b + x0 = x + a * t0 + z0 = z + c * t0 + p0 = point x0 0 z0 + v0 = vector 0 0 1 + v1 = vector 1 0 0 + + x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + + +-------------------------------- +-- Sphere +-------------------------------- + +intersectSphere :: Ray -> a -> IList (Surface, Texture a) +intersectSphere ray@(r, v) texture + = -- Find t such that (x + ta, y + tb, z + tc) intersects the + -- unit sphere, that is, such that: + -- (x + ta)^2 + (y + tb)^2 + (z + tc)^2 = 1 + -- This is a quadratic equation in t: + -- t^2(a^2 + b^2 + c^2) + 2t(xa + yb + zc) + (x^2 + y^2 + z^2 - 1) = 0 + let c1 = sq a + sq b + sq c + c2 = 2 * (x * a + y * b + z * c) + c3 = sq x + sq y + sq z - 1 + in + case quadratic c1 c2 c3 of + Nothing -> emptyIList + Just (t1, t2) -> entryexit (g t1) (g t2) + where x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + g t = (t, (Spherical origin v1 v2, (SphereFace, p0, texture))) + where origin = point 0 0 0 + x0 = x + t * a + y0 = y + t * b + z0 = z + t * c + p0 = point x0 y0 z0 + v0 = vector x0 y0 z0 + (v1, v2) = tangents v0 + + +-------------------------------- +-- Cube +-------------------------------- + +intersectCube :: Ray -> a -> IList (Surface, Texture a) +intersectCube ray@(r, v) texture + = -- The set of t such that (x + at, y + bt, z + ct) lies within + -- the unit cube satisfies: + -- 0 <= x + at <= 1, 0 <= y + bt <= 1, 0 <= z + ct <= 1 + -- The minimum and maximum such values of t give us the two + -- intersection points. + case intersectSlabIval (intersectCubeSlab face2 face3 x a) + (intersectSlabIval (intersectCubeSlab face5 face4 y b) + (intersectCubeSlab face0 face1 z c)) of + Nothing -> emptyIList + Just (t1, t2) -> entryexit (g t1) (g t2) + where g ((n, v0, v1), t) + = (t, (Planar p0 v0 v1, (n, p0, texture))) + where p0 = offsetToPoint ray t + face0 = (CubeFront, vectorY, vectorX) + face1 = (CubeBack, vectorX, vectorY) + face2 = (CubeLeft, vectorZ, vectorY) + face3 = (CubeRight, vectorY, vectorZ) + face4 = (CubeTop, vectorZ, vectorX) + face5 = (CubeBottom, vectorX, vectorZ) + vectorX = vector 1 0 0 + vectorY = vector 0 1 0 + vectorZ = vector 0 0 1 + x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + +intersectCubeSlab n m w d + | d `near` 0 = if (0 <= w) && (w <= 1) + then Just ((n, -inf), (m, inf)) else Nothing + | d > 0 = Just ((n, (-w)/d), (m, (1-w)/d)) + | otherwise = Just ((m, (1-w)/d), (n, (-w)/d)) + +intersectSlabIval Nothing Nothing = Nothing +intersectSlabIval Nothing (Just i) = Nothing +intersectSlabIval (Just i) Nothing = Nothing +intersectSlabIval (Just (nu1@(n1, u1), mv1@(m1, v1))) + (Just (nu2@(n2, u2), mv2@(m2, v2))) + = checkInterval (nu, mv) + where nu = if u1 < u2 then nu2 else nu1 + mv = if v1 < v2 then mv1 else mv2 + checkInterval numv@(nu@(_, u), (m, v)) + -- rounding error may force us to push v out a bit + | u `near` v = Just (nu, (m, u + epsilon)) + | u < v = Just numv + | otherwise = Nothing + + +-------------------------------- +-- Cylinder +-------------------------------- + +intersectCylinder :: Ray -> a -> IList (Surface, Texture a) +intersectCylinder ray texture + = isectSide `intersectIntervals` isectTop `intersectIntervals` isectBottom + where isectSide = intersectCylSide ray texture + isectTop = intersectXZPlane CylinderTop ray 1.0 texture + isectBottom = complementIntervals $ negateSurfaces $ + intersectXZPlane CylinderBottom ray 0.0 texture + +intersectCylSide (r, v) texture + = -- The ray (x + ta, y + tb, z + tc) intersects the sides of the + -- cylinder if: + -- (x + ta)^2 + (z + tc)^2 = 1 and 0 <= y + tb <= 1. + if (sq a + sq c) `near` 0 + then -- The ray is parallel to the Y-axis, and does not intersect + -- the cylinder sides. It's either all in, or all out + if (sqxy `near` 1.0 || sqxy < 1.0) then openIList else emptyIList + else -- Find values of t that solve the quadratic equation + -- (a^2 + c^2)t^2 + 2(ax + cz)t + x^2 + z^2 - 1 = 0 + let c1 = sq a + sq c + c2 = 2 * (x * a + z * c) + c3 = sq x + sq z - 1 + in + case quadratic c1 c2 c3 of + Nothing -> emptyIList + Just (t1, t2) -> entryexit (g t1) (g t2) + + where sqxy = sq x + sq y + g t = (t, (Cylindrical origin v1 v2, (CylinderSide, p0, texture))) + where origin = point 0 0 0 + x0 = x + t * a + y0 = y + t * b + z0 = z + t * c + p0 = point x0 y0 z0 + v0 = vector x0 0 z0 + (v1, v2) = tangents v0 + + x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + + +------------------- +-- Cone +------------------- + +intersectCone :: Ray -> a -> IList (Surface, Texture a) +intersectCone ray texture + = isectSide `intersectIntervals` isectTop `intersectIntervals` isectBottom + where isectSide = intersectConeSide ray texture + isectTop = intersectXZPlane ConeBase ray 1.0 texture + isectBottom = complementIntervals $ negateSurfaces $ + intersectXZPlane ConeBase ray 0.0 texture + +intersectConeSide (r, v) texture + = -- Find the points where the ray intersects the cond side. At any points of + -- intersection, we must have: + -- (x + ta)^2 + (z + tc)^2 = (y + tb)^2 + -- which is the following quadratic equation: + -- t^2(a^2-b^2+c^2) + 2t(xa-yb+cz) + (x^2-y^2+z^2) = 0 + let c1 = sq a - sq b + sq c + c2 = 2 * (x * a - y * b + c * z) + c3 = sq x - sq y + sq z + in case quadratic c1 c2 c3 of + Nothing -> emptyIList + Just (t1, t2) -> + -- If either intersection strikes the middle, then the other + -- can only be off by rounding error, so we make a tangent + -- strike using the "good" value. + -- If the intersections straddle the origin, then it's + -- an exit/entry pair, otherwise it's an entry/exit pair. + let y1 = y + t1 * b + y2 = y + t2 * b + in if y1 `near` 0 then entryexit (g t1) (g t1) + else if y2 `near` 0 then entryexit (g t2) (g t2) + else if (y1 < 0) `xor` (y2 < 0) then exitentry (g t1) (g t2) + else entryexit (g t1) (g t2) + + where g t = (t, (Conic origin v1 v2, (ConeSide, p0, texture))) + where origin = point 0 0 0 + x0 = x + t * a + y0 = y + t * b + z0 = z + t * c + p0 = point x0 y0 z0 + v0 = normalize $ vector x0 (-y0) z0 + (v1, v2) = tangents v0 + + x = xCoord r + y = yCoord r + z = zCoord r + a = xComponent v + b = yComponent v + c = zComponent v + + -- beyond me why this isn't defined in the prelude... + xor False b = b + xor True b = not b + + +------------------- +-- Solving quadratics +------------------- + +quadratic :: Double -> Double -> Double -> Maybe (Double, Double) +quadratic a b c = + -- Solve the equation ax^2 + bx + c = 0 by using the quadratic formula. + let d = sq b - 4 * a * c + d' = if d `near` 0 then 0 else d + in if d' < 0 + then Nothing -- There are no real roots. + else + if a > 0 then Just (((-b) - sqrt d') / (2 * a), + ((-b) + sqrt d') / (2 * a)) + else Just (((-b) + sqrt d') / (2 * a), + ((-b) - sqrt d') / (2 * a)) + +------------------- +-- Bounding boxes +------------------- + +data MaybeInterval = Interval !Double !Double + | NoInterval + +isInterval (Interval _ _) = True +isInterval _ = False + +intersectWithBox :: Ray -> Box -> Bool +intersectWithBox (r, v) (B x1 x2 y1 y2 z1 z2) + = isInterval interval + where x_interval = intersectRayWithSlab (xCoord r) (xComponent v) (x1, x2) + y_interval = intersectRayWithSlab (yCoord r) (yComponent v) (y1, y2) + z_interval = intersectRayWithSlab (zCoord r) (zComponent v) (z1, z2) + interval = intersectInterval x_interval + (intersectInterval y_interval z_interval) + +intersectInterval :: MaybeInterval -> MaybeInterval -> MaybeInterval +intersectInterval NoInterval _ = NoInterval +intersectInterval _ NoInterval = NoInterval +intersectInterval (Interval a b) (Interval c d) + | b < c || d < a = NoInterval + | otherwise = Interval (a `max` c) (b `min` d) + +{-# INLINE intersectRayWithSlab #-} +intersectRayWithSlab :: Double -> Double -> (Double,Double) -> MaybeInterval +intersectRayWithSlab xCoord alpha (x1, x2) + | alpha == 0 = if xCoord < x1 || xCoord > x2 then NoInterval else infInterval + | alpha > 0 = Interval a b + | otherwise = Interval b a + where a = (x1 - xCoord) / alpha + b = (x2 - xCoord) / alpha + +infInterval = Interval (-inf) inf diff --git a/testsuite/tests/hpc/raytrace/Interval.hs b/testsuite/tests/hpc/raytrace/Interval.hs new file mode 100644 index 0000000000000000000000000000000000000000..a4d313f66e7bc72d441eae651dd32b27476a3d92 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Interval.hs @@ -0,0 +1,121 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Interval + ( IList + , Intersection + , emptyIList, openIList + , mkEntry, mkExit + , entryexit, exitentry + , mapI + , unionIntervals, intersectIntervals, differenceIntervals + , complementIntervals + ) where + +import Geometry + +-- The result of a ray trace is represented as a list of surface +-- intersections. Each intersection is a point along the ray with +-- a flag indicating whether this intersection is an entry or an +-- exit from the solid. Each intersection also carries unspecified +-- surface data for use by the illumination model. + +-- Just the list of intersections isn't enough, however. An empty +-- list can denote either a trace that is always within the solid +-- or never in the solid. To dissambiguate, an extra flag is kept +-- that indicates whether we are starting inside or outside of the +-- solid. As a convenience, we also keep an additional flag that +-- indicates whether the last intersection ends inside or outside. + +type IList a = (Bool, [Intersection a], Bool) +type Intersection a = (Double, Bool, a) + +emptyIList = (False, [], False) +openIList = (True, [], True) + +mapI f (b1, is, b2) = (b1, map f is, b2) + +isEntry (_, entry, _) = entry +isExit (_, entry, _) = not entry + +mkEntry (t, a) = (t, True, a) +mkExit (t, a) = (t, False, a) + +entryexit w1 w2 = (False, [mkEntry w1, mkExit w2], False) +exitentry w1 w2 = (True, [mkExit w1, mkEntry w2], True) +arrange w1@(t1, _) w2@(t2, _) | t1 < t2 = entryexit w1 w2 + | otherwise = entryexit w2 w1 + + +cmpI :: Intersection a -> Intersection a -> Ordering +cmpI (i, _, _) (j, _, _) + | i `near` j = EQ + | i < j = LT + | otherwise = GT + +bad (b1, [], b2) = b1 /= b2 +bad (b1, is, b2) = bad' b1 is || b2 /= b3 + where (_, b3, _) = last is + +bad' b [] = False +bad' b ((_, c, _) : is) = b == c || bad' c is + +unionIntervals :: IList a -> IList a -> IList a +unionIntervals (isStartOpen, is, isEndOpen) (jsStartOpen, js, jsEndOpen) + = (isStartOpen || jsStartOpen, uniIntervals is js, isEndOpen || jsEndOpen) + where uniIntervals is [] | jsEndOpen = [] + | otherwise = is + uniIntervals [] js | isEndOpen = [] + | otherwise = js + uniIntervals is@(i : is') js@(j : js') + = case cmpI i j of + EQ -> if isEntry i == isEntry j then i : uniIntervals is' js' + else uniIntervals is' js' + LT -> if isEntry j then i : uniIntervals is' js + else uniIntervals is' js + GT -> if isEntry i then j : uniIntervals is js' + else uniIntervals is js' + +intersectIntervals :: IList a -> IList a -> IList a +intersectIntervals is js + = complementIntervals (unionIntervals is' js') + where is' = complementIntervals is + js' = complementIntervals js + +differenceIntervals :: IList a -> IList a -> IList a +differenceIntervals is js + = complementIntervals (unionIntervals is' js) + where is' = complementIntervals is + +complementIntervals :: IList a -> IList a +complementIntervals (o1, is, o2) + = (not o1, [ (i, not isentry, a) | (i, isentry, a) <- is ], not o2) + +-- tests... + +{- +mkIn, mkOut :: Double -> Intersection a +mkIn x = (x, True, undefined) +mkOut x = (x, False, undefined) + +i1 = (False, [ mkIn 2, mkOut 7 ], False) +i1' = (True, [ mkOut 2, mkIn 7 ], True) +i2 = (False, [ mkIn 1, mkOut 3, mkIn 4, mkOut 5, mkIn 6, mkOut 8 ], False) + +t1 = unionIntervals i1 i2 +t2 = intersectIntervals i1 i2 +t3 = intersectIntervals i2 i1 +t4 = complementIntervals i1 +t5 = intersectIntervals i2 i1' +t6 = differenceIntervals i2 i1 +t7 = differenceIntervals i2 i2 + +sh (o1,is,o2) = + do if o1 then putStr "..." else return () + putStr $ foldr1 (++) (map si is) + if o2 then putStr "..." else return () +si (i, True, _, _) = "<" ++ show i +si (i, False, _, _) = " " ++ show i ++ ">" +-} diff --git a/testsuite/tests/hpc/raytrace/Main.hs b/testsuite/tests/hpc/raytrace/Main.hs new file mode 100644 index 0000000000000000000000000000000000000000..e8c88ad090698b195307e82cb80555cb76a83b47 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Main.hs @@ -0,0 +1,15 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +-- Modified to read sample input directly from a file. + +module Main where + +import Parse +import Eval + +main = do { str <- readFile "galois.gml" + ; mainEval (rayParse str) + } diff --git a/testsuite/tests/hpc/raytrace/Makefile b/testsuite/tests/hpc/raytrace/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4a268530f13bc7f70d03965dacf45d8a0b4a720e --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Makefile @@ -0,0 +1,4 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + diff --git a/testsuite/tests/hpc/raytrace/Misc.hs b/testsuite/tests/hpc/raytrace/Misc.hs new file mode 100644 index 0000000000000000000000000000000000000000..104bd06af1467d611820f83f1e2768bbca60a386 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Misc.hs @@ -0,0 +1,11 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Misc where + +import Debug.Trace + +debug s v = trace (s ++" : "++ show v ++ "\n") v +-- debug s v = v diff --git a/testsuite/tests/hpc/raytrace/Parse.hs b/testsuite/tests/hpc/raytrace/Parse.hs new file mode 100644 index 0000000000000000000000000000000000000000..26aeb05427cecbf4f7d6dd6d74c7409c892e26b3 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Parse.hs @@ -0,0 +1,137 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Parse where + +import Data.Char +import Text.ParserCombinators.Parsec hiding (token) + +import Data + + +program :: Parser Code +program = + do { whiteSpace + ; ts <- tokenList + ; eof + ; return ts + } + +tokenList :: Parser Code +tokenList = many token <?> "list of tokens" + +token :: Parser GMLToken +token = + do { ts <- braces tokenList ; return (TBody ts) } + <|> do { ts <- brackets tokenList ; return (TArray ts) } + <|> (do { s <- gmlString ; return (TString s) } <?> "string") + <|> (do { t <- pident False ; return t } <?> "identifier") + <|> (do { char '/' -- No whitespace after slash + ; t <- pident True ; return t } <?> "binding identifier") + <|> (do { n <- number ; return n } <?> "number") + +pident :: Bool -> Parser GMLToken +pident rebind = + do { id <- ident + ; case (lookup id opTable) of + Nothing -> if rebind then return (TBind id) else return (TId id) + Just t -> if rebind then error ("Attempted rebinding of identifier " ++ id) else return t + } + +ident :: Parser String +ident = lexeme $ + do { l <- letter + ; ls <- many (satisfy (\x -> isAlphaNum x || x == '-' || x == '_')) + ; return (l:ls) + } + +gmlString :: Parser String +gmlString = lexeme $ between (char '"') (char '"') (many (satisfy (\x -> isPrint x && x /= '"'))) + +-- Tests for numbers +-- Hugs breaks on big exponents (> ~40) +test_number = "1234 -1234 1 -0 0" ++ + " 1234.5678 -1234.5678 1234.5678e12 1234.5678e-12 -1234.5678e-12" ++ + " -1234.5678e12 -1234.5678E-12 -1234.5678E12" ++ + " 1234e11 1234E33 -1234e33 1234e-33" ++ + " 123e 123.4e 123ee 123.4ee 123E 123.4E 123EE 123.4EE" + + +-- Always int or real +number :: Parser GMLToken +number = lexeme $ + do { s <- optSign + ; n <- decimal + ; do { string "." + ; m <- decimal + ; e <- option "" exponent' + ; return (TReal (read (s ++ n ++ "." ++ m ++ e))) -- FIXME: Handle error conditions + } + <|> do { e <- exponent' + ; return (TReal (read (s ++ n ++ ".0" ++ e))) + } + <|> do { return (TInt (read (s ++ n))) } + } + +exponent' :: Parser String +exponent' = try $ + do { e <- oneOf "eE" + ; s <- optSign + ; n <- decimal + ; return (e:s ++ n) + } + +decimal = many1 digit + +optSign :: Parser String +optSign = option "" (string "-") + + +------------------------------------------------------ +-- Library for tokenizing. + +braces p = between (symbol "{") (symbol "}") p +brackets p = between (symbol "[") (symbol "]") p + +symbol name = lexeme (string name) + +lexeme p = do{ x <- p; whiteSpace; return x } + +whiteSpace = skipMany (simpleSpace <|> oneLineComment <?> "") + where simpleSpace = skipMany1 (oneOf " \t\n\r\v") + oneLineComment = + do{ string "%" + ; skipMany (noneOf "\n\r\v") + ; return () + } + + +------------------------------------------------------------------------------ + +rayParse :: String -> Code +rayParse is = case (parse program "<stdin>" is) of + Left err -> error (show err) + Right x -> x + +rayParseF :: String -> IO Code +rayParseF file = + do { r <- parseFromFile program file + ; case r of + Left err -> error (show err) + Right x -> return x + } + +run :: String -> IO () +run is = case (parse program "" is) of + Left err -> print err + Right x -> print x + +runF :: IO () +runF = + do { r <- parseFromFile program "simple.gml" + ; case r of + Left err -> print err + Right x -> print x + } diff --git a/testsuite/tests/hpc/raytrace/Pixmap.hs b/testsuite/tests/hpc/raytrace/Pixmap.hs new file mode 100644 index 0000000000000000000000000000000000000000..edb75af4fa15aadb570af5b090f0c1b10c27f9bb --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Pixmap.hs @@ -0,0 +1,64 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Pixmap where + +import Data.Char +import System.IO hiding (try) +import Text.ParserCombinators.Parsec + +readPPM f + = do h <- openFile f ReadMode + s <- hGetContents h + case (parse parsePPM f s) of + Left err -> error (show err) + Right x -> return x + +writePPM f ppm + = do h <- openFile f WriteMode + let s = showPPM (length (head ppm)) (length ppm) ppm + hPutStr h s + +-- parsing + +parsePPM + = do string "P6" + whiteSpace + width <- number + whiteSpace + height <- number + whiteSpace + colormax <- number + whiteSpace + cs <- getInput + return (chop width (chopColors cs)) + +chopColors [] = [] +chopColors (a:b:c:ds) = (ord a, ord b, ord c) : chopColors ds + +chop n [] = [] +chop n xs = h : chop n t + where (h, t) = splitAt n xs + +number + = do ds <- many1 digit + return (read ds :: Int) + +whiteSpace + = skipMany (simpleSpace <|> oneLineComment <?> "") + where simpleSpace = skipMany1 (oneOf " \t\n\r\v") + oneLineComment = + do char '#' + skipMany (noneOf "\n\r\v") + return () + +-- printing + +showPPM :: Int -> Int -> [[(Int,Int,Int)]] -> String +showPPM wid ht pss + = header ++ concat [[chr r, chr g, chr b] | ps <- pss, (r, g, b) <-ps] + where + header = "P6\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n" +showPPM _ _ _ = error "incorrect length of bitmap string" diff --git a/testsuite/tests/hpc/raytrace/Primitives.hs b/testsuite/tests/hpc/raytrace/Primitives.hs new file mode 100644 index 0000000000000000000000000000000000000000..2f216540550628889b17820a80461f5ab4430da6 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Primitives.hs @@ -0,0 +1,24 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Primitives where + +rad2deg :: Double -> Double +rad2deg r = r * 180 / pi + +deg2rad :: Double -> Double +deg2rad d = d * pi / 180 + +addi :: Int -> Int -> Int +addi = (+) + +addf :: Double -> Double -> Double +addf = (+) + +acosD :: Double -> Double +acosD x = acos x * 180 / pi + +asinD :: Double -> Double +asinD x = asin x * 180 / pi diff --git a/testsuite/tests/hpc/raytrace/RayTrace.hs b/testsuite/tests/hpc/raytrace/RayTrace.hs new file mode 100644 index 0000000000000000000000000000000000000000..cb15388e2c70a82c258b6c4721880c3c8907ee95 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/RayTrace.hs @@ -0,0 +1,9 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module RayTrace(module Illumination, module Surface) where + +import Illumination +import Surface diff --git a/testsuite/tests/hpc/raytrace/Surface.hs b/testsuite/tests/hpc/raytrace/Surface.hs new file mode 100644 index 0000000000000000000000000000000000000000..832f0fcae27077021e72f2d38f4cf630b3729563 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/Surface.hs @@ -0,0 +1,115 @@ +-- Copyright (c) 2000 Galois Connections, Inc. +-- All rights reserved. This software is distributed as +-- free software under the license in the file "LICENSE", +-- which is included in the distribution. + +module Surface + ( SurfaceFn (..) + , Properties + , sfun, sconst + , prop + , matte, shiny + , chgColor + , surface + ) where + +import Geometry +import CSG +import Misc + +-- the surface gets passed face then u then v. +data SurfaceFn c v = SFun (Int -> Double -> Double -> Properties c v) + | SConst (Properties c v) + +sfun :: (Int -> Double -> Double -> Properties c v) -> SurfaceFn c v +sfun = SFun +sconst :: Properties c v -> SurfaceFn c v +sconst = SConst + +type Properties c v = (c, v, v, v) + +prop c d s p = (c, d, s, p) + +matte = (white, 1.0, 0.0, 1.0) +shiny = (white, 0.0, 1.0, 1.0) + +chgColor :: c -> Properties d v -> Properties c v +chgColor c (_, d, s, p) = (c, d, s, p) + +instance (Show c, Show v) => Show (SurfaceFn c v) where + show (SFun _) = "Surface function" + -- show (SConst p) = "Surface constant: " ++ show p + show (SConst p) = "Surface constant" + +evalSurface :: SurfaceFn Color Double -> Int -> Double -> Double -> Properties Color Double +evalSurface (SConst p) = \_ _ _ -> p +evalSurface (SFun f) = f + +-- calculate surface properties, given the type of +-- surface, and intersection point in object coordinates + +-- surface :: Surface SurfaceFn -> (Int, Point) -> (Vector, Properties) + +surface (Planar _ v0 v1) (n, p0, fn) + = (norm, evalSurface fn n' u v) + where norm = normalize $ cross v0 v1 + (n', u, v) = planarUV n p0 + +surface (Spherical _ v0 v1) (_, p0, fn) + = (norm, evalSurface fn 0 u v) + where x = xCoord p0 + y = yCoord p0 + z = zCoord p0 + k = sqrt (1 - sq y) + theta = adjustRadian (atan2 (x / k) (z / k)) + -- correct so that the image grows left-to-right + -- instead of right-to-left + u = 1.0 - clampf (theta / (2 * pi)) + v = clampf ((y + 1) / 2) + norm = normalize $ cross v0 v1 + +-- ZZ ignore the (incorrect) surface model, and estimate the normal +-- from the intersection in object space +surface (Cylindrical _ v0 v1) (_, p0, fn) + = (norm, evalSurface fn 0 u v) + where x = xCoord p0 + y = yCoord p0 + z = zCoord p0 + u = clampf $ adjustRadian (atan2 x z) / (2 * pi) + v = y + norm = normalize $ cross v0 v1 + +-- ZZ ignore the (incorrect) surface model, and estimate the normal +-- from the intersection in object space +surface (Conic _ v0 v1) (_, p0, fn) + = (norm, evalSurface fn 0 u v) + where x = xCoord p0 + y = yCoord p0 + z = zCoord p0 + u = clampf $ adjustRadian (atan2 (x / y) (z / y)) / (2 * pi) + v = y + norm = normalize $ cross v0 v1 + +planarUV face p0 + = case face of + PlaneFace -> (0, x, z) + + CubeFront -> (0, x, y) + CubeBack -> (1, x, y) + CubeLeft -> (2, z, y) + CubeRight -> (3, z, y) + CubeTop -> (4, x, z) + CubeBottom -> (5, x, z) + + CylinderTop -> (1, (x + 1) / 2, (z + 1) / 2) + CylinderBottom -> (2, (x + 1) / 2, (z + 1) / 2) + + ConeBase -> (1, (x + 1) / 2, (z + 1) / 2) + where x = xCoord p0 + y = yCoord p0 + z = zCoord p0 + +-- misc + +adjustRadian :: Radian -> Radian +adjustRadian r = if r > 0 then r else r + 2 * pi diff --git a/testsuite/tests/hpc/raytrace/galois.gml b/testsuite/tests/hpc/raytrace/galois.gml new file mode 100644 index 0000000000000000000000000000000000000000..ab26083c1c54a40323f09867a22fc970f1f1324e --- /dev/null +++ b/testsuite/tests/hpc/raytrace/galois.gml @@ -0,0 +1,147 @@ + +[ [97 95 73 50 89 97 99 99 99 99 99 99 99 99 99 98 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 98 99 99 99 99 99 98 99 99 98 97 99 99 99 99 99 99 99 99 99 99 97 97 96 96 96 96 96 96 99 99 99] + [88 96 66 53 52 86 99 99 99 99 99 99 99 99 99 99 99 99 99 98 99 99 99 99 99 99 99 99 99 99 98 96 98 99 99 99 99 99 99 99 99 97 98 99 99 99 99 99 99 99 99 99 96 96 96 98 97 96 96 96 97 97 96] + [89 92 79 50 54 45 91 98 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 98 98 99 98 96 98 98 98 98 97 98 99 99 99 99 99 99 99 99 99 99 99 99 99 97 96 96 97 99 99 96 96 98 98 97 97] + [88 91 96 81 40 35 39 91 95 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 98 97 97 98 99 98 99 99 96 95 95 95 96 97 99 99 98 97 99 99 97 98 99 99 98 96 96 96 94 96 98 99 96 96 96 97 95 96] + [83 92 91 48 54 33 62 64 98 99 99 99 99 99 99 99 97 98 99 99 99 99 99 99 99 98 98 99 99 99 99 99 99 98 97 97 98 99 97 99 99 99 99 99 99 99 99 99 99 99 96 97 98 96 96 97 99 98 96 95 96 96 96] + [91 93 64 78 94 75 57 50 81 97 99 99 99 99 99 98 94 96 99 99 99 99 99 99 99 97 98 99 99 99 98 98 99 98 99 98 99 99 98 99 99 99 99 99 99 99 99 99 99 99 97 99 98 96 91 96 97 98 98 96 96 96 99] + [95 63 85 94 84 95 72 61 44 84 96 98 99 99 99 99 98 98 98 99 99 99 99 99 99 97 96 98 99 99 97 96 98 99 99 97 98 99 98 97 99 99 99 99 99 99 99 99 99 99 97 99 99 96 93 98 96 97 96 96 96 96 95] + [63 80 88 96 96 88 90 52 64 52 95 98 99 99 99 99 99 99 97 98 99 99 99 97 97 99 98 97 97 97 99 96 98 99 99 97 98 99 99 98 98 98 99 99 99 99 99 99 99 99 98 98 99 96 96 96 94 97 98 99 96 92 95] + [92 84 90 92 91 88 89 75 50 58 64 96 99 99 99 99 99 99 99 99 99 99 99 98 99 99 98 99 99 98 99 98 99 99 99 99 99 99 99 99 98 98 99 99 99 96 99 98 99 99 99 97 96 97 96 96 92 96 99 98 95 94 95] + [91 80 85 85 92 96 93 87 81 49 66 88 99 99 99 99 99 99 99 99 99 99 99 98 99 99 96 98 99 99 99 99 99 98 99 99 99 98 99 99 99 99 99 99 99 98 99 98 99 99 98 97 98 96 96 96 93 96 99 98 96 97 97] + [70 90 96 96 95 95 97 93 60 73 64 67 93 97 99 99 99 99 99 99 99 99 99 98 97 97 98 99 99 99 99 99 98 94 97 98 99 98 99 99 99 99 99 99 99 99 98 98 98 97 98 99 99 96 96 96 96 96 99 97 96 96 95] + [93 93 97 97 94 88 85 89 90 57 72 43 82 97 99 99 99 99 99 99 99 99 99 99 98 96 97 99 99 99 99 99 99 96 96 96 98 99 99 98 99 97 98 99 99 98 95 81 88 84 98 98 95 96 96 95 96 96 98 95 94 94 92] + [87 96 91 94 96 97 98 94 75 66 76 60 67 83 99 99 99 99 99 99 99 99 99 99 99 98 98 99 99 99 99 99 99 97 97 97 95 96 97 95 96 76 70 66 73 83 92 60 88 58 88 95 95 95 96 94 95 96 98 96 97 97 97] + [90 96 86 84 89 85 93 92 96 96 94 84 56 85 98 98 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 98 99 97 56 40 57 71 69 66 78 73 84 55 34 39 39 41 44 46 31 61 90 98 97 92 94 98 99 97 98 98 98] + [93 91 94 89 66 81 86 94 89 87 97 82 84 65 84 82 87 89 97 96 97 99 99 99 99 99 99 99 99 99 99 97 96 40 4 15 9 9 6 2 7 14 23 9 8 8 10 3 3 8 13 12 17 42 90 93 86 93 96 97 96 96 96] + [85 82 82 76 91 90 86 83 84 86 54 37 26 49 31 20 13 43 40 55 80 95 98 98 99 99 99 99 99 98 99 97 66 10 3 4 12 19 4 4 7 18 7 4 11 11 6 11 24 11 12 8 18 9 30 85 93 90 98 99 96 93 96] + [77 68 78 66 72 66 79 92 73 57 57 73 69 39 73 68 70 57 22 15 17 21 50 83 93 97 98 99 99 97 94 66 12 0 0 0 3 4 6 21 7 3 5 2 3 14 17 7 4 6 28 39 39 24 20 53 95 80 98 99 98 96 97] + [69 75 86 82 89 86 64 51 66 93 93 80 90 92 89 87 92 94 68 34 24 13 17 6 20 55 91 98 98 95 66 10 18 4 3 3 1 3 12 10 9 11 17 3 15 14 17 23 15 26 25 25 21 43 21 10 65 62 97 98 99 98 96] + [95 94 94 68 45 48 41 69 84 72 80 94 78 78 94 96 88 93 95 94 83 67 35 13 28 38 15 40 87 80 17 7 4 7 6 9 37 20 19 19 22 9 5 7 11 13 26 14 29 27 41 35 44 19 20 16 43 70 96 96 97 99 99] + [93 96 88 54 57 57 75 74 70 79 94 96 94 97 97 88 88 96 83 97 97 72 65 75 46 21 17 9 28 29 19 22 4 9 8 5 24 34 17 19 7 8 25 16 9 5 8 12 15 32 54 43 30 14 18 11 45 62 96 96 96 97 98] + [97 91 56 59 44 70 63 78 88 82 73 82 96 97 78 94 94 96 99 99 98 91 54 21 4 4 3 11 14 35 14 17 7 26 36 21 11 35 42 24 3 9 17 13 9 20 9 21 20 45 28 35 42 19 38 14 36 67 98 98 97 97 96] + [80 42 56 39 41 71 74 62 54 57 62 68 96 87 92 95 93 97 98 98 67 21 7 4 5 19 22 25 10 8 24 7 6 26 42 43 38 42 32 13 36 60 81 88 67 62 37 63 28 15 26 44 32 30 25 38 62 70 73 78 87 95 97] + [33 60 39 44 80 73 40 59 58 55 70 71 90 91 86 97 98 98 92 43 8 9 2 6 42 65 50 45 27 27 24 9 13 37 66 66 88 80 60 72 92 90 96 98 94 84 43 43 18 31 34 35 19 53 28 46 31 23 49 56 40 78 96] + [74 32 63 76 67 52 85 93 81 74 85 83 65 80 88 96 98 68 30 4 2 2 2 24 82 56 40 25 44 44 30 52 70 83 87 91 90 73 69 51 86 97 99 99 97 92 44 39 28 26 26 22 49 23 36 67 37 17 23 27 39 54 91] + [44 62 77 88 81 94 95 94 55 78 57 42 77 79 90 92 39 7 3 9 1 4 19 68 57 39 49 54 62 53 74 92 88 97 99 99 90 64 82 53 84 99 99 99 97 99 87 76 52 39 48 37 35 26 51 32 8 6 19 6 42 78 84] + [61 82 82 81 96 90 94 66 64 77 65 81 96 97 81 20 2 5 9 10 21 23 61 67 55 48 53 61 48 87 97 96 98 98 98 96 69 50 85 60 65 98 99 99 98 97 94 62 45 50 57 54 21 11 16 11 6 11 21 6 26 71 75] + [93 77 71 97 90 93 51 85 65 77 94 96 94 77 15 1 0 0 8 9 8 53 73 61 64 59 59 53 87 98 98 98 96 94 98 75 37 34 84 51 37 97 98 99 99 97 57 5 5 4 5 4 7 3 18 4 6 15 9 4 8 64 76] + [96 82 93 79 95 82 81 79 85 96 91 74 44 11 12 9 2 0 5 5 24 69 55 63 84 82 75 78 92 98 99 97 95 91 89 33 38 41 70 55 30 94 98 99 98 90 11 8 4 6 3 12 41 2 3 1 6 6 6 6 16 30 58] + [89 66 92 84 96 98 97 92 96 75 45 29 9 38 6 10 3 10 1 8 69 67 64 70 85 87 93 94 97 99 99 99 94 94 70 44 23 60 78 55 28 98 99 99 99 78 6 9 16 15 5 2 8 4 7 1 18 13 18 16 4 23 66] + [48 79 85 82 90 97 96 95 64 20 25 26 27 12 5 8 6 7 6 42 74 64 49 80 94 96 98 99 99 99 99 98 94 96 71 50 7 55 92 31 49 98 99 99 98 62 7 10 13 8 12 11 9 3 5 4 16 9 11 9 13 44 68] + [93 72 87 92 96 98 95 62 38 9 23 64 5 6 12 32 7 9 15 70 69 54 75 97 96 97 99 99 99 99 99 98 98 96 71 79 62 66 69 20 41 98 99 99 98 63 9 29 38 33 28 17 17 40 10 9 18 10 22 10 8 39 74] + [93 69 84 88 95 93 72 41 17 31 69 54 35 6 6 26 18 36 39 68 77 82 95 98 98 97 99 98 99 99 99 99 99 97 91 89 92 63 31 11 44 98 99 99 98 77 19 8 13 22 30 28 35 14 18 21 15 7 37 46 23 53 91] + [77 85 92 96 88 65 24 23 58 63 44 35 24 17 9 24 18 21 43 54 87 95 97 98 98 97 99 97 96 98 99 99 99 99 97 89 64 47 42 16 68 99 99 99 99 94 31 17 37 25 20 51 13 7 8 7 6 34 40 39 65 63 94] + [58 83 97 92 90 42 34 66 76 38 42 35 22 12 10 51 8 33 54 80 98 96 94 90 56 88 94 95 70 68 98 98 98 97 96 94 89 66 30 48 97 99 99 99 98 98 61 13 24 10 20 19 18 6 15 10 11 25 43 27 63 53 92] + [87 71 66 73 79 65 69 44 74 47 44 38 18 15 24 29 9 38 67 93 98 96 79 53 46 96 95 88 23 61 87 95 95 95 87 79 56 35 46 89 99 99 99 99 99 98 67 23 13 10 21 49 31 21 26 16 17 36 46 40 46 67 96] + [96 80 47 69 60 77 59 22 29 74 61 50 56 41 34 27 12 48 74 96 99 97 56 40 23 95 96 63 39 77 85 82 77 75 69 68 71 77 90 97 99 99 99 99 99 98 66 29 44 17 7 23 23 18 24 27 16 33 67 18 30 87 96] + [97 96 92 70 45 52 21 22 30 18 38 74 82 25 24 21 12 35 74 96 99 93 31 57 33 95 94 35 17 53 50 48 77 89 93 96 96 98 95 97 99 99 99 99 99 99 72 7 16 28 22 31 14 10 20 23 16 13 39 25 54 95 92] + [90 64 52 70 92 83 73 49 25 8 36 40 44 25 39 28 42 26 72 96 98 96 28 41 43 95 88 18 8 75 92 89 91 95 98 93 75 61 94 97 99 99 99 99 99 98 82 13 12 20 34 25 9 23 73 55 45 19 21 15 93 95 96] + [22 38 82 96 93 95 93 81 89 51 45 46 26 36 28 24 36 15 31 94 98 95 55 44 30 80 93 34 19 87 88 89 83 94 94 79 30 16 33 90 97 99 99 99 98 98 74 26 9 32 38 21 14 54 74 41 46 46 18 29 91 92 96] + [79 92 98 98 98 95 86 82 85 91 94 81 47 28 13 16 47 7 6 69 93 95 92 70 40 75 95 83 44 42 43 83 94 96 81 61 26 26 7 32 85 98 99 99 98 95 62 38 8 13 20 30 23 62 42 31 3 11 11 59 94 97 97] + [96 96 97 98 98 85 82 94 93 88 89 96 94 92 59 40 19 12 3 10 37 84 90 94 79 60 93 67 75 65 68 94 97 96 66 40 9 11 48 4 35 93 98 99 97 62 50 36 4 3 15 53 33 63 28 6 2 15 56 72 97 97 95] + [98 94 97 95 86 94 91 89 90 95 95 96 95 93 98 88 75 58 34 29 7 21 54 83 84 89 75 79 85 94 94 95 98 82 43 25 6 21 60 24 15 89 97 99 70 66 47 48 2 0 3 22 21 7 4 1 6 55 83 96 98 95 93] + [93 96 96 91 60 65 73 87 93 96 95 91 91 88 94 97 97 97 90 76 74 25 2 19 37 59 72 71 83 91 87 90 92 95 67 47 69 37 51 45 3 76 98 98 46 83 71 21 3 4 2 19 13 2 0 7 60 89 97 99 98 92 90] + [90 88 92 95 97 95 95 93 87 88 82 86 95 93 92 91 97 96 49 73 58 58 24 6 10 58 77 49 56 84 82 89 87 94 87 46 71 37 47 67 9 54 98 98 56 50 58 13 14 18 0 10 20 4 2 31 96 96 99 99 99 96 95] + [78 55 84 95 97 89 73 71 89 92 91 89 90 90 83 82 93 93 68 54 41 27 24 49 85 96 97 89 72 70 48 70 76 91 95 92 43 25 40 87 27 69 97 96 75 33 13 12 10 5 2 14 6 3 15 86 99 97 99 99 97 96 97] + [43 61 66 70 93 79 86 94 89 84 80 84 90 96 90 92 94 92 81 37 34 70 94 96 99 98 99 98 96 95 85 77 57 62 63 59 55 50 52 77 33 63 91 71 18 6 4 5 4 4 4 12 4 15 77 98 99 99 99 98 95 95 96] + [77 82 75 56 62 67 86 85 84 89 92 90 80 77 52 61 56 59 70 89 98 98 99 99 99 99 99 99 99 98 98 98 92 92 91 69 61 47 28 22 4 9 14 7 4 3 7 11 4 9 4 4 22 79 97 96 97 99 98 96 93 95 96] + [97 96 93 97 94 86 69 64 73 59 71 71 71 64 87 94 95 96 99 99 99 99 99 99 99 97 99 99 99 99 99 99 98 96 96 96 96 95 96 93 77 35 11 4 10 2 7 6 2 1 18 59 97 97 99 97 97 99 99 97 95 95 95] + [96 97 98 94 97 95 89 75 65 85 89 93 97 98 99 98 98 99 99 99 99 99 99 97 97 99 98 99 99 97 96 96 95 94 95 97 96 96 96 97 98 93 75 45 19 4 2 4 18 49 90 98 99 99 99 95 96 98 96 96 96 95 96] + [96 98 99 97 96 95 78 59 78 97 98 98 99 99 99 99 99 99 99 99 99 99 99 98 98 99 97 97 98 96 92 91 92 95 96 98 98 95 96 97 99 98 96 97 93 82 80 87 98 97 98 99 99 98 97 96 96 98 96 96 96 97 96] + [95 84 92 97 95 94 50 80 95 98 99 99 99 99 99 97 96 99 98 97 98 99 99 97 97 99 97 97 96 96 90 82 89 92 97 94 94 94 93 96 99 99 98 99 97 99 98 99 99 97 97 97 98 98 96 97 96 96 96 96 96 98 96] + [97 90 92 98 92 52 39 93 98 99 99 99 99 99 98 95 95 98 98 96 97 99 99 97 97 99 99 98 98 95 93 89 87 92 94 88 90 90 88 94 96 97 98 98 97 99 99 99 99 97 97 96 95 96 95 96 96 97 98 98 99 98 96] + [96 94 90 95 69 43 75 97 99 99 99 99 99 99 97 96 94 94 95 96 99 99 97 94 95 98 99 97 95 95 98 95 87 93 89 89 87 88 93 94 90 94 96 96 98 98 99 98 99 98 96 97 97 95 93 95 96 98 99 99 99 98 99] + [97 81 85 68 51 53 96 97 99 99 99 99 99 99 99 97 94 95 95 96 96 98 98 97 95 94 95 95 84 90 96 95 93 95 94 88 79 88 92 97 95 95 95 96 98 99 97 97 99 99 99 98 95 94 96 98 97 99 98 98 98 99 99] + [81 86 70 56 71 72 97 99 99 99 99 99 99 99 99 99 97 98 97 96 96 96 98 98 95 94 96 96 92 94 92 94 95 94 93 91 91 93 95 97 92 87 93 95 98 99 95 95 99 98 98 98 94 88 95 95 96 98 96 97 97 96 98] + [67 62 30 43 90 73 95 98 98 96 98 98 97 98 95 98 95 95 96 95 98 94 95 96 94 95 96 95 95 96 90 94 96 96 96 92 91 92 94 96 97 91 91 95 94 97 95 93 98 96 96 96 97 95 96 93 95 96 96 96 97 95 96] + [53 35 46 37 71 72 94 97 99 99 98 97 98 98 95 94 96 97 96 96 98 87 92 93 96 95 95 92 93 96 95 93 93 89 94 90 87 89 92 90 95 96 97 90 90 96 95 94 97 97 96 96 96 97 97 94 95 96 96 97 96 97 96] + [74 88 56 35 91 90 88 94 97 97 95 95 97 98 95 94 96 97 96 96 98 96 95 95 92 88 91 92 92 94 93 94 90 86 88 95 94 93 93 92 97 96 96 94 95 96 96 96 98 99 98 99 98 98 98 97 95 97 98 98 96 94 93] + [92 93 63 65 92 97 93 95 99 96 89 98 99 98 96 98 96 93 93 95 97 94 91 94 97 94 95 96 93 88 85 90 92 86 90 97 96 96 96 93 94 97 95 96 94 96 99 96 96 96 96 98 98 96 95 95 94 97 96 93 92 95 93] + [82 94 95 81 92 95 92 97 99 98 94 93 92 97 94 97 97 98 94 90 97 95 92 94 94 90 91 96 92 88 94 94 89 83 90 97 96 96 95 96 97 95 94 97 96 96 97 94 93 93 96 98 94 96 96 92 89 90 94 94 94 92 88] + [78 85 76 94 97 95 96 97 99 99 98 96 97 97 96 97 97 95 95 96 98 96 96 96 88 86 93 96 94 93 89 88 88 90 90 94 94 97 97 96 96 97 98 98 98 96 92 87 96 96 96 96 96 94 92 93 88 88 93 95 94 90 87] + [83 88 91 94 97 97 99 98 98 98 98 99 99 98 99 98 99 97 98 97 98 96 96 95 96 94 96 95 95 91 85 90 90 93 94 94 92 94 95 96 98 97 98 98 97 97 97 96 96 96 95 96 94 95 95 94 93 93 94 95 93 88 91] + [95 90 94 94 98 96 98 99 96 98 97 97 98 98 99 99 96 95 97 97 99 95 96 98 93 96 96 96 93 95 89 93 93 95 96 96 97 97 97 97 99 98 97 96 98 99 99 99 98 93 93 96 96 96 95 94 91 92 90 93 94 96 96] +] /galois + +{ /v /u /face % bind parameters + { % toIntCoord : float -> int + 63.0 mulf floor /i % i = floor(3.0*i) + i 63 eqi { 62 } { i } if % return max(2, i) + } /toIntCoord + galois u toIntCoord apply get % val = texture[u][v] + v toIntCoord apply get + real 100.0 divf /gal + gal gal gal point % b/w galois + 1.0 % kd = 1.0 + 0.0 % ks = 0.0 + 1.0 % n = 1.0 +} /galoisface + + +galoisface cube +-0.5 -0.5 -0.5 translate % center +2.5 uscale % make it bigger +-25.0 rotatex -25.0 rotatey % rotate +0.0 -1.0 7.0 translate % move to final position + +%galoisface cylinder +%-0.5 -0.5 -0.5 translate % center +%1.5 uscale % make it bigger +%0.0 rotatex 90.0 rotatey % rotate +%0.0 0.0 5.0 translate % move to final position + +%galoisface sphere +%-0.5 -0.5 -0.5 translate % center +%1.5 uscale % make it bigger +%-25.0 rotatex 25.0 rotatey % rotate +%-3.0 0.0 5.0 translate % move to final position + +%union union % join the 3 together + +{ /v /u /face + v 5.0 divf /v + u 5.0 divf /u + v floor 2 modi 0 eqi + { 1.0 } + { 0.8 } + if /r + u floor 2 modi 0 eqi + { 1.0 } + { 0.8 } + if /g + v frac /v + u frac /u + v 0.0 lessf { v 1.0 addf } { v } if /v + u 0.0 lessf { u 1.0 addf } { u } if /u + { % toIntCoord : float -> int + 63.0 mulf floor /i % i = floor(3.0*i) + i 63 eqi { 62 } { i } if % return max(2, i) + } /toIntCoord + galois u toIntCoord apply get % val = texture[u][v] + v toIntCoord apply get + real 100.0 divf /gal + r gal mulf g gal mulf gal point % b/w galois + 0.0 % kd = 1.0 + 1.0 % ks = 0.0 + 1.0 % n = 1.0 +} plane /p + +p 0.0 -3.0 0.0 translate % plane at Y = -3 + +union + +/scene + % directional light +1.0 -1.0 0.0 point % direction +1.0 1.0 1.0 point light /l % directional light + +1.0 0.5 0.0 point % ambient light +[ l ] % lights +scene % scene to render +3 % tracing depth +90.0 % field of view +300 200 +"galois.ppm" % output file +render + diff --git a/testsuite/tests/hpc/raytrace/galois.sample b/testsuite/tests/hpc/raytrace/galois.sample new file mode 100644 index 0000000000000000000000000000000000000000..41ad5959022c7813855cb9c56a2aa1ae3b071b2f --- /dev/null +++ b/testsuite/tests/hpc/raytrace/galois.sample @@ -0,0 +1 @@ +[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,253,142,255,248,125,255,253,128,255,248,125,255,248,125,255,248,125,255,245,124,255,248,125,255,243,123,255,250,127,255,248,125,255,240,122,255,253,128,255,255,129,255,250,127,255,245,124,208,139,70,255,217,110,255,196,99,254,170,86,255,175,89,255,235,119,255,243,123,255,248,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,150,255,248,125,255,250,127,255,255,129,255,255,129,255,250,127,255,243,123,255,238,120,255,248,125,255,248,125,255,253,128,255,240,122,255,232,118,239,160,81,255,181,91,255,173,87,255,181,91,88,59,30,81,54,27,34,23,11,69,46,23,42,28,14,142,95,48,154,103,52,177,119,60,96,64,32,57,38,19,227,152,77,255,248,125,255,255,129,255,255,129,255,248,125,255,250,127,255,248,125,255,255,129,255,253,128,255,250,127,255,248,125,255,238,120,255,243,123,255,248,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,153,255,255,160,255,250,127,255,248,125,255,248,125,255,253,128,255,248,125,255,248,125,255,248,125,255,248,125,255,248,125,255,253,128,162,108,55,92,62,31,166,111,56,54,36,18,146,98,49,108,72,36,139,93,47,61,41,20,69,46,23,27,18,9,19,12,6,69,46,23,30,20,10,61,41,20,88,59,30,212,142,72,119,80,40,23,15,7,27,18,9,255,222,112,255,253,128,255,250,127,255,248,125,255,248,125,255,248,125,255,248,125,255,245,124,255,245,124,255,230,116,255,240,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,151,255,255,158,255,255,156,255,255,129,255,255,129,255,253,128,255,255,129,255,255,129,255,255,129,255,255,129,255,250,127,224,150,76,119,80,40,50,33,17,108,72,36,96,64,32,208,139,70,108,72,36,131,87,44,100,67,34,220,147,74,19,12,6,19,12,6,42,28,14,108,72,36,196,131,66,189,126,64,119,80,40,96,64,32,115,77,39,204,137,69,73,49,24,54,36,18,15,10,5,255,250,127,255,255,129,255,253,128,255,250,127,255,243,123,255,250,127,255,253,128,255,243,123,255,245,124,255,248,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,148,255,255,158,255,255,160,255,255,158,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,245,124,255,238,120,150,100,51,23,15,7,65,43,22,100,67,34,30,20,10,34,23,11,166,111,56,150,100,51,239,160,81,19,12,6,34,23,11,38,25,13,30,20,10,65,43,22,88,59,30,112,75,38,50,33,17,146,98,49,15,10,5,11,7,3,54,36,18,15,10,5,7,5,2,69,46,23,255,255,129,255,255,129,255,255,129,255,253,128,255,253,128,255,248,125,255,248,125,255,240,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,155,255,255,155,255,255,160,255,255,156,255,255,158,255,255,129,255,253,128,255,250,127,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,254,170,86,34,23,11,15,10,5,7,5,2,27,18,9,61,41,20,255,227,115,255,253,128,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,253,128,255,255,129,255,255,129,255,255,129,255,255,129,255,253,128,255,250,127,177,119,60,216,144,73,69,46,23,15,10,5,73,49,24,255,250,127,255,255,129,255,255,129,255,250,127,255,248,125,255,248,125,255,248,125,255,250,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,155,255,255,153,255,255,160,255,255,156,255,255,156,255,255,155,255,255,129,255,255,129,255,255,129,255,255,129,255,250,127,255,253,128,255,255,129,255,255,129,255,253,128,255,245,124,7,5,2,27,18,9,34,23,11,84,56,28,27,18,9,139,93,47,255,238,120,255,217,110,251,168,85,142,95,48,108,72,36,189,126,64,169,113,57,255,175,89,255,255,129,255,255,129,255,255,129,255,250,127,255,240,122,255,230,116,208,139,70,243,162,82,34,23,11,255,240,122,255,253,128,255,250,127,255,245,124,255,225,114,255,248,125,255,250,127,255,245,124,255,250,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,153,255,255,158,255,255,156,255,255,161,255,255,161,255,255,158,255,255,129,255,255,129,255,250,127,255,245,124,255,255,129,255,253,128,255,253,128,255,255,129,255,255,129,255,253,128,220,147,74,34,23,11,46,31,15,3,2,1,142,95,48,131,87,44,162,108,55,255,206,104,247,165,83,193,129,65,158,106,53,231,155,78,212,142,72,243,162,82,181,121,61,135,90,45,255,199,101,235,157,80,61,41,20,42,28,14,81,54,27,142,95,48,96,64,32,181,121,61,255,248,125,255,245,124,255,227,115,255,240,122,255,245,124,255,238,120,255,240,122,255,245,124,255,245,124,255,250,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,156,255,255,155,255,255,156,255,255,158,255,255,161,255,255,153,255,255,156,255,255,129,255,255,129,255,248,125,255,253,128,255,253,128,255,255,129,255,255,129,255,253,128,255,243,123,255,250,127,255,250,127,154,103,52,0,0,0,15,10,5,27,18,9,100,67,34,100,67,34,142,95,48,255,250,127,255,253,128,255,230,116,255,181,91,255,183,93,255,235,119,255,250,127,255,225,114,255,178,90,255,253,128,255,243,123,254,170,86,166,111,56,255,225,114,255,245,124,255,235,119,255,248,125,255,248,125,255,250,127,255,230,116,255,240,122,255,248,125,255,227,115,255,232,118,255,232,118,255,248,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,151,255,255,156,255,255,160,255,255,156,255,255,145,121,84,47,255,194,109,255,255,148,255,255,129,255,253,128,255,253,128,255,255,129,255,253,128,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,243,123,254,170,86,65,43,22,54,36,18,92,62,31,92,62,31,255,191,97,255,250,127,255,255,129,255,255,129,255,253,128,255,255,129,255,255,129,255,245,124,255,212,107,255,230,116,255,230,116,255,243,123,255,245,124,255,230,116,255,181,91,255,253,128,255,255,129,255,235,119,255,212,107,255,245,124,255,245,124,255,243,123,255,240,122,255,232,118,255,227,115,255,232,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,151,255,255,160,255,255,160,255,255,158,25,17,9,75,52,29,167,116,65,163,113,63,255,255,129,255,255,129,255,253,128,255,250,127,255,255,129,255,253,128,255,250,127,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,253,128,34,23,11,42,28,14,96,64,32,96,64,32,208,139,70,235,157,80,255,201,102,255,243,123,255,255,129,255,253,128,255,248,125,88,59,30,150,100,51,30,20,10,73,49,24,169,113,57,255,219,111,255,214,108,255,186,94,255,248,125,255,255,129,255,255,129,255,248,125,255,253,128,255,217,110,255,245,124,255,240,122,255,240,122,255,238,120,255,245,124,255,240,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,156,255,255,160,255,255,161,62,43,24,4,2,1,79,55,31,179,125,70,33,23,13,255,221,124,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,250,127,255,255,129,255,250,127,255,253,128,255,255,129,255,255,129,255,255,129,255,240,122,77,51,26,177,119,60,15,10,5,19,12,6,216,144,73,150,100,51,185,124,62,255,212,107,255,225,114,255,248,125,255,250,127,255,250,127,255,248,125,255,245,124,255,245,124,255,206,104,255,194,98,255,230,116,227,152,77,255,248,125,255,253,128,255,250,127,255,255,129,255,255,129,255,255,129,255,243,123,255,243,123,255,245,124,255,227,115,255,232,118,255,222,112,255,248,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,61,61,139,139,174,142,142,178,126,158,158,81,81,102,48,60,60,138,138,173,141,141,176,125,156,156,81,81,101,48,60,60,137,137,171,139,139,174,124,155,155,80,80,100,47,59,59,136,136,170,138,138,173,123,153,153,79,79,99,47,59,59,134,134,168,137,137,171,121,152,152,78,78,98,46,58,58,133,133,167,136,136,170,120,150,150,78,78,97,46,58,58,132,132,165,134,134,168,119,149,149,77,77,96,45,57,57,130,130,163,133,133,166,118,147,147,76,76,95,45,56,56,129,129,161,131,131,164,117,146,146,75,75,94,45,56,56,128,128,160,130,130,163,115,144,144,74,74,93,44,55,55,126,126,158,129,129,161,114,143,143,73,73,92,44,55,55,125,125,156,127,127,159,113,141,141,73,73,91,43,54,54,123,123,154,126,126,157,111,139,139,72,72,90,43,53,53,122,122,153,124,124,155,110,138,138,71,71,89,42,53,53,120,120,151,123,123,153,109,136,136,70,70,88,41,52,52,119,119,149,121,121,152,107,134,134,69,69,87,41,51,51,118,118,147,120,120,150,106,133,133,68,68,86,40,51,51,116,116,145,118,118,148,105,131,131,67,67,84,40,50,50,115,115,143,117,117,146,103,129,129,67,67,83,39,49,49,113,113,142,115,115,144,102,128,128,66,66,82,39,49,49,112,112,140,114,114,142,101,126,126,65,65,81,38,48,48,110,110,138,112,112,140,99,124,124,64,64,80,38,48,48,109,109,136,111,111,139,98,123,123,63,63,79,37,47,47,107,107,134,109,109,137,97,121,121,62,62,78,37,46,46,106,106,133,255,255,156,255,255,161,255,255,161,255,255,160,25,17,9,117,81,45,188,130,73,104,72,40,37,26,14,255,186,104,255,255,148,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,253,128,193,129,65,135,90,45,251,168,85,208,139,70,7,5,2,7,5,2,73,49,24,235,157,80,212,142,72,247,165,83,255,194,98,255,245,124,255,250,127,255,204,103,216,144,73,119,80,40,212,142,72,255,238,120,208,139,70,7,5,2,92,62,31,255,243,123,255,255,129,255,255,129,255,255,129,255,255,129,255,250,127,255,253,128,255,245,124,255,245,124,255,235,119,255,248,125,255,248,125,54,54,68,32,40,40,92,92,115,88,110,110,83,104,104,54,54,67,32,40,40,91,91,114,87,109,109,83,103,103,53,53,67,31,39,39,91,91,113,87,108,108,82,102,102,53,53,66,31,39,39,90,90,112,86,108,108,81,102,102,52,52,65,31,39,39,89,89,111,85,107,107,80,101,101,52,52,65,31,38,38,88,88,111,85,106,106,80,100,100,51,51,64,30,38,38,88,88,110,84,105,105,79,99,99,51,51,64,30,38,38,87,87,109,83,104,104,79,98,98,51,51,64,30,38,38,86,86,108,83,104,104,78,98,98,50,50,63,30,37,37,86,86,107,82,103,103,78,97,97,50,50,63,30,37,37,85,85,107,82,102,102,77,97,97,50,50,62,29,37,37,85,85,106,81,102,102,77,96,96,49,49,62,29,37,37,84,84,106,81,101,101,76,96,96,49,49,62,29,37,37,84,84,105,80,101,101,76,95,95,49,49,61,29,36,36,83,83,104,80,100,100,76,95,95,49,49,61,29,36,36,83,83,104,80,100,100,75,94,94,48,48,61,29,36,36,83,83,104,79,99,99,75,94,94,48,48,60,29,36,36,82,82,103,79,99,99,75,93,93,48,48,60,28,36,36,82,82,103,79,98,98,74,93,93,48,48,60,28,36,36,82,82,102,78,98,98,74,93,93,48,48,60,28,35,35,81,81,102,78,98,98,74,92,92,48,48,60,28,35,35,81,81,102,78,97,97,74,92,92,47,47,59,28,35,35,81,81,101,78,97,97,73,92,92,47,47,59,28,35,35,81,81,101,77,97,97,73,91,91,47,47,59,127,159,159,49,61,61,142,142,178,82,82,102,139,139,174,126,158,158,48,60,60,141,141,177,81,81,101,138,138,172,125,156,156,48,60,60,140,140,175,80,80,100,137,137,171,124,155,155,47,59,59,139,139,174,80,80,100,135,135,169,123,153,153,47,59,59,137,137,172,79,79,99,134,134,168,121,152,152,47,58,58,136,136,170,78,78,98,133,133,166,120,150,150,46,58,58,135,135,169,77,77,97,132,132,165,119,149,149,46,57,57,133,133,167,76,76,96,130,130,163,118,147,147,45,57,57,132,132,165,76,76,95,129,129,161,117,146,146,45,56,56,131,131,163,75,75,94,127,127,159,115,144,144,44,55,55,129,129,162,74,74,93,126,126,158,114,143,143,44,55,55,128,128,160,73,73,92,125,125,156,113,141,141,43,54,54,126,126,158,72,72,91,123,123,154,111,139,139,43,53,53,125,125,156,71,71,89,122,122,152,110,138,138,42,53,53,123,123,154,71,71,88,120,120,150,109,136,136,42,52,52,122,122,152,70,70,87,119,119,149,107,134,134,41,52,52,120,120,151,69,69,86,117,117,147,106,133,133,41,51,51,119,119,149,68,68,85,116,116,145,105,131,131,40,50,50,117,117,147,67,67,84,114,114,143,103,129,129,40,50,50,116,116,145,66,66,83,113,113,141,102,128,128,39,49,49,114,114,143,65,65,82,112,112,140,101,126,126,39,48,48,113,113,141,65,65,81,110,110,138,100,125,125,38,48,48,111,111,139,64,64,80,109,109,136,98,123,123,38,47,47,110,110,138,63,63,79,107,107,134,97,121,121,37,46,46,255,255,158,255,255,155,255,255,160,205,142,80,58,40,22,255,183,102,83,58,32,25,17,9,46,32,17,108,75,42,255,226,127,255,255,129,255,253,128,255,255,129,255,255,129,255,255,129,255,255,129,255,253,128,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,248,125,212,142,72,131,87,44,255,243,123,255,250,127,255,255,129,166,111,56,15,10,5,34,23,11,34,23,11,19,12,6,30,20,10,255,181,91,255,175,89,208,139,70,255,240,122,255,248,125,255,248,125,255,243,123,255,178,90,112,75,38,255,196,99,255,188,95,142,95,48,255,230,116,255,255,129,255,255,129,255,248,125,255,248,125,255,248,125,255,245,124,255,248,125,255,245,124,255,248,125,255,250,127,84,106,106,32,40,40,89,111,111,54,54,68,92,92,116,84,105,105,32,40,40,88,110,110,54,54,67,92,92,115,83,104,104,32,40,40,87,109,109,53,53,67,91,91,114,82,103,103,31,39,39,87,108,108,53,53,66,90,90,113,81,102,102,31,39,39,86,107,107,52,52,66,89,89,112,81,101,101,31,39,39,85,107,107,52,52,65,89,89,111,80,100,100,31,38,38,84,106,106,52,52,65,88,88,110,80,100,100,30,38,38,84,105,105,51,51,64,87,87,109,79,99,99,30,38,38,83,104,104,51,51,64,87,87,108,78,98,98,30,38,38,83,104,104,50,50,63,86,86,108,78,98,98,30,37,37,82,103,103,50,50,63,86,86,107,78,97,97,30,37,37,82,102,102,50,50,62,85,85,107,77,96,96,29,37,37,81,102,102,50,50,62,85,85,106,77,96,96,29,37,37,81,101,101,49,49,62,84,84,105,76,95,95,29,37,37,80,101,101,49,49,61,84,84,105,76,95,95,29,36,36,80,100,100,49,49,61,83,83,104,76,95,95,29,36,36,80,100,100,49,49,61,83,83,104,75,94,94,29,36,36,79,99,99,48,48,61,83,83,103,75,94,94,29,36,36,79,99,99,48,48,60,82,82,103,75,93,93,28,36,36,79,99,99,48,48,60,82,82,103,74,93,93,28,36,36,78,98,98,48,48,60,82,82,102,74,93,93,28,35,35,78,98,98,48,48,60,81,81,102,74,92,92,28,35,35,78,98,98,48,48,60,81,81,102,74,92,92,28,35,35,78,97,97,47,47,59,81,81,101,142,178,178,49,61,61,49,61,61,138,173,173,140,140,175,40,40,50,10,10,12,139,139,174,141,177,177,35,44,44,28,35,35,25,32,32,140,140,176,17,17,21,39,39,49,5,5,7,135,135,169,124,155,155,4,5,5,2,3,3,137,171,171,137,137,171,79,79,99,20,20,26,133,133,167,136,170,170,47,58,58,47,58,58,132,165,165,133,133,167,38,38,48,9,9,12,133,133,166,135,169,169,34,42,42,27,34,34,24,30,30,134,134,168,16,16,20,37,37,47,5,5,6,129,129,161,118,147,147,4,5,5,2,3,3,130,163,163,130,130,163,75,75,94,19,19,24,127,127,158,129,161,161,44,56,56,44,55,55,126,157,157,127,127,158,36,36,45,9,9,11,126,126,157,128,160,160,32,40,40,25,32,32,23,29,29,127,127,159,15,15,19,35,35,44,5,5,6,122,122,153,111,139,139,3,4,4,2,3,3,123,154,154,123,123,154,71,71,89,18,18,23,120,120,150,122,152,152,42,52,52,42,52,52,118,148,148,119,119,149,34,34,43,8,8,10,119,119,148,121,151,151,30,38,38,24,30,30,21,27,27,120,120,150,14,14,18,33,33,42,4,4,6,115,115,144,105,131,131,3,4,4,2,2,2,116,145,145,116,116,145,67,67,84,17,17,22,112,112,141,115,143,143,39,49,49,39,49,49,111,139,139,112,112,140,32,32,40,8,8,10,111,111,139,113,142,142,28,35,35,22,28,28,20,25,25,112,112,140,13,13,17,31,31,39,4,4,5,108,108,135,98,123,123,3,4,4,2,2,2,109,136,136,109,109,136,255,255,158,255,255,147,255,255,160,16,11,6,0,0,0,125,87,49,41,29,16,29,20,11,54,37,21,87,61,34,167,116,65,255,255,161,255,255,129,255,255,129,255,255,129,255,255,129,255,248,125,255,253,128,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,225,114,50,33,17,255,238,120,255,227,115,255,227,115,255,243,123,255,253,128,255,253,128,150,100,51,0,0,0,7,5,2,11,7,3,27,18,9,69,46,23,69,46,23,34,23,11,46,31,15,46,31,15,139,93,47,181,121,61,73,49,24,255,250,127,255,250,127,255,243,123,216,144,73,255,245,124,255,255,129,255,248,125,255,243,123,255,243,123,255,245,124,255,248,125,255,248,125,255,250,127,255,255,129,255,248,125,93,93,117,95,119,119,24,30,30,19,24,24,17,21,21,89,111,111,11,11,14,26,26,33,3,3,4,91,91,114,83,104,104,2,3,3,1,2,2,92,115,115,92,92,115,53,53,67,14,14,17,90,90,112,91,114,114,31,39,39,31,39,39,89,111,111,90,90,112,26,26,32,6,6,8,89,89,112,91,114,114,23,28,28,18,23,23,16,20,20,85,106,106,11,11,13,25,25,32,3,3,4,87,87,109,80,100,100,2,3,3,1,2,2,89,111,111,89,89,111,51,51,64,13,13,16,86,86,108,88,110,110,30,38,38,30,38,38,86,108,108,87,87,109,25,25,31,6,6,7,86,86,108,88,110,110,22,27,27,17,22,22,16,20,20,82,103,103,10,10,13,24,24,31,3,3,4,85,85,106,77,97,97,2,3,3,1,2,2,86,108,108,86,86,107,50,50,62,13,13,16,84,84,105,86,107,107,29,37,37,29,37,37,84,105,105,84,84,106,24,24,30,6,6,7,84,84,105,86,107,107,21,27,27,17,21,21,15,19,19,80,100,100,10,10,13,24,24,30,3,3,4,83,83,103,76,95,95,2,3,3,1,2,2,84,105,105,84,84,105,49,49,61,12,12,16,82,82,103,84,105,105,29,36,36,29,36,36,82,102,102,83,83,103,23,23,29,5,5,7,82,82,103,84,105,105,21,26,26,17,21,21,15,19,19,79,98,98,10,10,12,23,23,29,3,3,4,81,81,101,74,93,93,2,3,3,1,2,2,82,103,103,82,82,103,48,48,60,12,12,15,81,81,101,102,127,127,138,172,172,82,103,103,139,174,174,143,143,179,138,138,173,141,141,176,110,110,138,132,132,165,129,129,161,141,177,177,17,21,21,135,169,169,129,162,162,135,169,169,126,158,158,139,139,173,5,5,7,132,132,166,132,132,165,125,125,156,126,126,158,138,173,173,5,7,7,137,171,171,136,171,171,121,151,151,137,137,172,136,136,170,8,8,10,136,136,171,120,120,150,130,130,163,134,168,168,135,169,169,95,119,119,129,162,162,77,97,97,130,163,163,134,134,168,130,130,162,132,132,165,103,103,129,123,123,154,121,121,151,132,166,166,16,20,20,126,158,158,121,151,151,126,158,158,118,147,147,129,129,162,5,5,6,124,124,155,123,123,154,116,116,146,117,117,147,129,161,161,5,6,6,127,159,159,127,159,159,112,140,140,128,128,160,126,126,158,7,7,9,127,127,158,111,111,139,121,121,151,125,156,156,125,157,157,88,111,111,120,150,150,72,90,90,121,151,151,124,124,155,120,120,150,122,122,153,96,96,120,114,114,143,111,111,139,122,153,153,14,18,18,117,146,146,112,140,140,116,145,145,109,136,136,119,119,149,4,4,6,114,114,142,114,114,142,107,107,134,108,108,135,119,149,149,4,6,6,117,146,146,117,146,146,103,129,129,117,117,147,116,116,145,7,7,8,116,116,146,102,102,128,111,111,139,114,143,143,115,144,144,81,102,102,110,138,138,66,82,82,111,138,138,114,114,142,110,110,138,112,112,140,88,88,110,105,105,131,102,102,128,112,140,140,13,17,17,107,134,134,102,128,128,106,133,133,99,124,124,109,109,137,255,255,160,255,255,158,255,255,158,29,20,11,58,40,22,83,58,32,96,66,37,75,52,29,75,52,29,25,17,9,255,226,127,255,255,161,255,255,156,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,253,128,255,217,110,255,188,95,255,230,116,255,243,123,255,250,127,255,238,120,255,222,112,255,227,115,255,232,118,57,38,19,42,28,14,146,98,49,23,15,7,23,15,7,65,43,22,57,38,19,158,106,53,96,64,32,139,93,47,108,72,36,255,238,120,255,227,115,255,240,122,255,232,118,255,199,101,247,165,83,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,253,128,255,253,128,255,250,127,255,250,127,255,253,128,89,89,111,87,87,109,95,119,119,11,14,14,92,115,115,87,109,109,91,114,114,85,106,106,93,93,117,17,17,21,89,89,112,89,89,112,84,84,105,85,85,106,93,117,117,3,4,4,92,115,115,92,115,115,82,102,102,87,109,109,92,92,115,5,5,7,92,92,115,81,81,101,86,86,108,91,114,114,92,115,115,65,81,81,88,110,110,70,88,88,88,111,111,91,91,114,88,88,110,90,90,112,70,70,88,84,84,105,82,82,103,90,113,113,10,13,13,87,109,109,82,103,103,86,108,108,80,101,101,89,89,111,16,16,20,85,85,106,85,85,106,80,80,100,81,81,101,89,111,111,3,4,4,88,110,110,88,110,110,78,97,97,83,104,104,87,87,109,5,5,6,88,88,110,77,77,97,82,82,103,87,109,109,88,110,110,62,77,77,84,105,105,67,84,84,84,106,106,87,87,109,84,84,106,86,86,108,67,67,84,81,81,101,79,79,98,87,108,108,10,13,13,84,105,105,79,99,99,83,103,103,77,97,97,85,85,107,15,15,19,82,82,102,81,81,102,77,77,96,78,78,97,86,107,107,3,4,4,85,106,106,84,106,106,75,94,94,80,100,100,84,84,105,5,5,6,85,85,106,75,75,93,80,80,100,84,105,105,85,106,106,60,75,75,81,102,102,65,81,81,82,103,103,84,84,106,82,82,102,83,83,104,65,65,82,78,78,98,76,76,96,84,105,105,10,12,12,81,102,102,77,96,96,80,101,101,75,94,94,83,83,104,15,15,19,79,79,99,79,79,99,140,175,175,128,160,160,37,47,47,17,21,21,49,61,61,5,7,7,141,177,177,143,143,178,142,142,178,40,40,50,82,82,102,28,28,35,2,2,3,138,138,173,137,137,171,136,171,171,125,156,156,36,46,46,17,21,21,48,60,60,5,7,7,138,172,172,139,139,174,139,139,174,39,39,49,79,79,99,27,27,34,2,2,3,135,135,168,133,133,166,133,166,166,121,152,152,35,44,44,16,20,20,46,58,58,5,6,6,134,168,168,135,135,169,135,135,169,38,38,47,77,77,97,27,27,33,2,2,3,131,131,164,129,129,162,129,161,161,118,147,147,34,43,43,16,20,20,45,56,56,5,6,6,130,163,163,131,131,164,131,131,164,37,37,46,75,75,94,26,26,32,2,2,3,127,127,158,125,125,156,125,156,156,114,143,143,33,42,42,15,19,19,43,54,54,5,6,6,126,157,157,127,127,159,126,126,158,35,35,44,72,72,90,25,25,31,2,2,3,122,122,153,121,121,151,121,151,151,110,138,138,32,40,40,15,18,18,42,53,53,4,6,6,121,152,152,122,122,153,122,122,153,34,34,43,70,70,87,24,24,30,2,2,3,118,118,148,117,117,146,116,146,146,106,133,133,31,39,39,14,18,18,40,51,51,4,6,6,117,146,146,118,118,148,118,118,147,33,33,41,67,67,84,23,23,29,2,2,2,114,114,142,112,112,141,112,140,140,102,128,128,30,37,37,13,17,17,39,49,49,4,5,5,113,141,141,114,114,142,113,113,142,32,32,40,65,65,81,22,22,28,2,2,2,110,110,137,108,108,135,108,135,135,99,123,123,255,255,158,255,255,148,255,255,160,12,8,4,87,61,34,133,93,52,205,142,80,58,40,22,4,2,1,33,23,13,255,212,119,255,255,158,255,255,151,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,253,128,255,248,125,255,227,115,255,173,87,166,111,56,231,155,78,255,217,110,142,95,48,255,188,95,255,206,104,255,243,123,255,248,125,255,175,89,255,183,93,255,214,108,162,108,55,255,248,125,255,191,97,112,75,38,247,165,83,208,139,70,135,90,45,135,90,45,193,129,65,255,191,97,154,103,52,255,209,106,255,248,125,255,235,119,255,212,107,255,235,119,255,238,120,255,183,93,255,230,116,255,255,129,255,255,129,255,255,129,255,255,129,255,253,128,255,245,124,255,243,123,255,253,128,255,250,127,33,41,41,3,4,4,95,119,119,90,113,113,96,96,120,27,27,33,55,55,68,19,19,24,2,2,3,93,93,116,92,92,115,92,115,115,84,105,105,26,33,33,11,14,14,32,40,40,3,4,4,93,116,116,88,110,110,93,93,117,26,26,33,53,53,67,18,18,23,2,2,3,91,91,113,89,89,112,89,112,112,82,102,102,26,32,32,11,13,13,31,39,39,3,4,4,90,113,113,86,107,107,91,91,114,25,25,32,52,52,65,18,18,23,2,2,3,89,89,111,88,88,110,87,109,109,80,100,100,25,31,31,10,13,13,30,38,38,3,4,4,89,111,111,84,105,105,89,89,112,25,25,31,51,51,64,18,18,22,2,2,3,87,87,109,86,86,107,86,107,107,78,98,98,25,31,31,10,13,13,30,38,38,3,4,4,87,109,109,82,103,103,88,88,110,24,24,31,50,50,63,17,17,22,2,2,3,85,85,107,84,84,106,84,106,106,77,97,97,24,30,30,10,13,13,29,37,37,3,4,4,86,107,107,81,102,102,86,86,108,24,24,30,49,49,62,17,17,21,2,2,3,84,84,105,83,83,104,83,104,104,76,95,95,24,30,30,10,13,13,29,36,36,3,4,4,85,106,106,80,100,100,85,85,107,24,24,30,49,49,61,17,17,21,2,2,3,83,83,104,82,82,103,82,103,103,75,94,94,24,30,30,10,12,12,29,36,36,3,4,4,84,105,105,79,99,99,84,84,106,23,23,29,48,48,60,17,17,21,2,2,3,82,82,103,81,81,102,150,120,150,181,145,181,173,138,173,180,180,180,116,116,116,176,176,176,112,112,112,81,81,81,110,110,110,171,171,171,176,176,176,176,176,176,178,142,178,172,137,172,168,134,168,130,104,130,162,130,162,78,62,78,169,135,169,158,126,158,175,140,175,173,138,173,175,175,175,134,134,134,165,165,165,165,165,165,73,73,73,155,155,155,160,160,160,172,172,172,170,170,170,172,137,172,124,99,124,138,110,138,112,89,112,75,60,75,77,62,77,137,110,137,169,135,169,160,128,160,169,169,169,109,109,109,158,158,158,96,96,96,38,38,38,60,60,60,153,153,153,166,166,166,149,149,149,166,132,166,110,88,110,95,76,95,116,93,116,41,33,41,63,50,63,135,108,135,163,130,163,156,125,156,162,162,162,105,105,105,158,158,158,101,101,101,73,73,73,99,99,99,154,154,154,158,158,158,158,158,158,159,127,159,154,123,154,151,120,151,117,93,117,145,116,145,70,56,70,151,120,151,141,113,141,156,125,156,154,123,154,156,156,156,119,119,119,147,147,147,147,147,147,65,65,65,138,138,138,143,143,143,153,153,153,151,151,151,152,122,152,110,88,110,122,98,122,99,79,99,67,53,67,68,54,68,121,97,121,150,120,150,142,113,142,149,149,149,96,96,96,139,139,139,85,85,85,34,34,34,53,53,53,135,135,135,147,147,147,131,131,131,146,117,146,97,77,97,83,67,83,102,82,102,36,29,36,55,44,55,119,95,119,143,115,143,137,110,137,143,143,143,92,92,92,139,139,139,88,88,88,64,64,64,87,87,87,135,135,135,139,139,139,138,138,138,255,255,158,255,255,156,255,255,160,16,11,6,255,206,116,37,26,14,87,61,34,71,49,27,12,8,4,255,194,109,255,194,109,255,255,160,255,255,156,255,255,150,255,255,129,255,255,129,255,255,129,255,255,129,255,255,129,255,250,127,200,134,68,224,150,76,189,126,64,255,188,95,220,147,74,254,170,86,255,225,114,255,222,112,220,147,74,255,240,122,255,186,94,255,212,107,220,147,74,212,142,72,255,191,97,247,165,83,251,168,85,255,219,111,255,248,125,146,98,49,65,43,22,224,150,76,255,196,99,112,75,38,115,77,39,96,64,32,255,219,111,255,240,122,255,232,118,255,225,114,255,230,116,255,230,116,255,188,95,251,168,85,255,245,124,255,253,128,255,255,129,255,255,129,255,253,128,255,243,123,255,245,124,255,250,127,255,253,128,121,97,121,120,96,120,121,121,121,92,92,92,114,114,114,114,114,114,51,51,51,107,107,107,111,111,111,119,119,119,118,118,118,119,95,119,86,69,86,96,76,96,77,62,77,52,42,52,53,42,53,95,76,95,117,94,117,111,89,111,117,117,117,75,75,75,110,110,110,67,67,67,27,27,27,42,42,42,106,106,106,116,116,116,104,104,104,115,92,115,77,61,77,66,53,66,81,65,81,29,23,29,44,35,44,95,76,95,114,91,114,109,87,109,114,114,114,73,73,73,111,111,111,71,71,71,51,51,51,69,69,69,108,108,108,112,112,112,112,112,112,110,110,110,109,87,109,107,85,107,83,66,83,103,82,103,49,39,49,107,86,107,100,80,100,111,89,111,110,88,110,111,111,111,85,85,85,105,105,105,105,105,105,47,47,47,99,99,99,103,103,103,110,110,110,109,109,109,110,88,110,80,64,80,89,71,89,72,57,72,48,39,48,50,40,50,88,71,88,109,87,109,104,83,104,109,109,109,70,70,70,102,102,102,62,62,62,25,25,25,39,39,39,100,100,100,108,108,108,97,97,97,108,86,108,72,57,72,62,49,62,76,61,76,27,21,27,41,33,41,89,71,89,108,86,108,103,82,103,107,107,107,69,69,69,105,105,105,67,67,67,48,48,48,66,66,66,103,103,103,106,106,106,106,106,106,104,104,104,103,83,103,101,81,101,78,63,78,98,78,98,47,37,47,102,81,102,95,76,95,106,85,106,105,84,105,106,106,106,81,81,81,100,100,100,141,176,176,32,40,40,123,154,154,60,75,75,144,181,181,21,27,27,112,140,140,138,172,172,140,176,176,143,143,179,141,141,177,112,112,141,10,10,12,93,93,117,63,63,79,142,142,177,4,4,5,140,140,175,131,131,164,136,136,171,141,176,176,139,174,174,9,12,12,4,5,5,52,65,65,62,77,77,139,174,174,12,15,15,139,173,173,135,169,169,137,171,171,138,138,172,138,138,172,9,9,12,49,49,62,41,41,51,94,94,117,133,133,167,37,37,46,136,136,170,130,130,163,135,135,169,135,169,169,135,168,168,9,11,11,125,156,156,37,47,47,131,164,164,114,143,143,44,55,55,129,161,161,130,162,162,131,131,164,132,132,165,132,132,165,11,11,14,114,114,142,64,64,81,130,130,163,46,46,57,5,5,6,118,118,147,123,123,154,128,160,160,129,161,161,125,156,156,28,35,35,108,136,136,53,66,66,127,159,159,19,24,24,99,123,123,121,152,152,124,155,155,126,126,158,124,124,156,99,99,123,8,8,11,82,82,102,55,55,69,124,124,155,3,3,4,122,122,153,115,115,143,119,119,149,123,154,154,121,152,152,8,10,10,3,4,4,45,57,57,54,67,67,121,151,151,11,13,13,120,151,151,118,147,147,119,148,148,120,120,150,119,119,149,8,8,10,43,43,54,36,36,45,81,81,101,115,115,144,32,32,40,117,117,147,112,112,140,117,117,146,116,146,146,116,145,145,8,10,10,107,134,134,32,40,40,113,141,141,98,123,123,38,47,47,111,138,138,112,140,140,112,112,141,113,113,142,113,113,141,10,10,12,98,98,122,255,255,156,255,255,155,255,255,161,255,206,116,255,192,107,54,37,21,41,29,16,71,49,27,12,8,4,150,104,58,150,104,58,255,255,158,255,255,158,255,255,153,255,255,155,255,255,129,255,255,129,255,253,128,247,165,83,193,129,65,235,157,80,200,134,68,255,194,98,255,225,114,255,240,122,255,230,116,255,238,120,255,222,112,255,222,112,255,204,103,247,165,83,255,194,98,243,162,82,255,191,97,154,103,52,255,219,111,255,243,123,196,131,66,255,209,106,255,250,127,255,245,124,255,186,94,92,62,31,131,87,44,227,152,77,81,54,27,255,188,95,255,245,124,255,219,111,255,243,123,255,245,124,255,230,116,255,204,103,255,222,112,255,245,124,255,245,124,200,134,68,166,111,56,255,186,94,255,188,95,255,186,94,255,250,127,255,245,124,255,250,127,255,248,125,48,48,60,97,97,121,34,34,42,3,3,4,88,88,110,91,91,114,95,119,119,96,120,120,93,116,116,21,26,26,81,101,101,39,49,49,95,119,119,14,18,18,74,92,92,91,114,114,92,116,116,94,94,118,93,93,117,74,74,93,6,6,8,61,61,77,41,41,52,93,93,117,2,2,3,92,92,115,86,86,108,90,90,113,93,116,116,92,115,115,6,8,8,2,3,3,34,43,43,41,51,51,92,115,115,8,10,10,92,115,115,90,112,112,90,113,113,91,91,114,91,91,114,6,6,8,33,33,41,27,27,34,62,62,78,89,89,111,24,24,30,90,90,113,86,86,108,90,90,113,90,113,113,90,112,112,6,7,7,83,104,104,25,31,31,88,110,110,77,96,96,29,37,37,86,108,108,87,109,109,89,111,111,89,89,111,89,89,111,8,8,10,77,77,96,44,44,55,88,88,111,31,31,39,3,3,4,80,80,100,83,83,104,87,109,109,88,110,110,85,106,106,19,24,24,74,93,93,36,45,45,87,109,109,13,16,16,68,85,85,84,105,105,85,107,107,87,87,109,86,86,108,68,68,85,6,6,7,57,57,71,38,38,48,86,86,108,2,2,3,85,85,107,80,80,100,84,84,105,86,108,108,85,107,107,6,7,7,2,3,3,32,40,40,38,47,47,86,107,107,7,9,9,86,107,107,84,105,105,85,106,106,85,85,107,85,85,107,6,6,7,31,31,38,25,25,32,58,58,73,83,83,104,23,23,29,85,85,106,146,182,182,144,180,180,129,161,161,36,45,45,49,62,62,4,5,5,29,36,36,49,62,62,2,3,3,26,32,32,139,174,174,142,177,177,143,143,179,140,140,175,141,141,176,17,17,21,40,40,50,81,81,102,40,40,50,10,10,12,21,21,26,5,5,7,138,138,172,136,136,170,136,136,170,140,175,175,138,173,173,124,155,155,35,44,44,47,59,59,4,5,5,28,35,35,47,59,59,2,3,3,25,31,31,133,166,166,136,170,170,137,137,171,134,134,167,135,135,169,16,16,20,38,38,48,78,78,97,38,38,47,9,9,11,20,20,25,5,5,6,131,131,164,130,130,162,129,129,162,133,167,167,132,165,165,118,148,148,33,41,41,45,56,56,4,5,5,26,33,33,45,56,56,2,3,3,23,29,29,127,158,158,129,161,161,130,130,163,127,127,159,128,128,160,15,15,19,36,36,45,74,74,92,36,36,45,9,9,11,19,19,24,5,5,6,125,125,156,123,123,154,123,123,153,126,158,158,125,156,156,112,140,140,31,39,39,43,53,53,3,4,4,25,31,31,42,53,53,2,3,3,22,28,28,120,150,150,122,152,152,123,123,154,120,120,150,121,121,151,14,14,18,34,34,43,70,70,87,34,34,42,8,8,10,18,18,22,4,4,6,117,117,147,116,116,145,116,116,145,119,149,149,118,147,147,105,132,132,29,37,37,40,50,50,3,4,4,23,29,29,40,50,50,2,2,2,21,26,26,113,141,141,115,144,144,116,116,145,113,113,141,114,114,143,13,13,17,32,32,40,66,66,82,32,32,40,8,8,10,17,17,21,4,4,5,255,255,158,255,255,151,255,255,158,255,255,148,255,203,114,255,238,134,100,69,39,50,34,19,29,20,11,221,154,86,46,32,17,255,232,130,255,255,161,255,255,156,255,255,150,255,255,161,255,222,112,173,116,59,135,90,45,127,85,43,255,194,98,255,217,110,255,248,125,255,235,119,255,238,120,255,243,123,255,248,125,255,230,116,254,170,86,255,235,119,255,186,94,173,116,59,220,147,74,169,113,57,158,106,53,255,206,104,255,173,87,255,248,125,255,232,118,255,245,124,255,217,110,255,238,120,255,227,115,255,248,125,255,238,120,255,178,90,255,181,91,255,181,91,255,253,128,255,253,128,255,245,124,255,235,119,255,245,124,255,181,91,216,144,73,255,243,123,255,250,127,255,238,120,255,232,118,255,219,111,115,77,39,177,119,60,243,162,82,255,245,124,255,196,99,255,243,123,96,96,120,96,96,121,11,11,14,27,27,34,56,56,70,27,27,34,6,6,8,14,14,18,3,3,4,94,94,118,93,93,116,93,93,116,96,120,120,94,118,118,85,106,106,24,30,30,32,40,40,2,3,3,19,24,24,32,40,40,1,2,2,17,21,21,91,114,114,93,116,116,88,110,110,92,92,115,92,92,116,11,11,14,26,26,33,53,53,67,26,26,33,6,6,8,14,14,17,3,3,4,90,90,113,89,89,112,89,89,112,92,115,115,91,114,114,81,102,102,23,29,29,31,39,39,2,3,3,18,23,23,31,39,39,1,2,2,16,20,20,88,110,110,90,112,112,85,106,106,89,89,111,89,89,112,10,10,13,25,25,32,52,52,65,25,25,31,6,6,7,13,13,17,3,3,4,88,88,110,87,87,108,87,87,108,89,112,112,88,110,110,79,99,99,22,28,28,30,38,38,2,3,3,17,22,22,30,38,38,1,2,2,16,20,20,86,107,107,87,109,109,83,103,103,86,86,108,87,87,109,10,10,13,24,24,31,50,50,63,24,24,31,6,6,7,13,13,16,3,3,4,85,85,107,84,84,106,84,84,106,87,109,109,86,108,108,77,97,97,22,27,27,29,37,37,2,3,3,17,21,21,29,37,37,1,2,2,15,19,19,84,105,105,85,107,107,81,101,101,84,84,106,85,85,107,10,10,13,24,24,30,49,49,62,24,24,30,6,6,7,13,13,16,3,3,4,84,84,105,83,83,104,83,83,104,157,125,157,181,144,181,79,63,79,154,123,154,182,145,182,178,142,178,174,139,174,172,137,172,181,181,181,180,180,180,180,180,180,180,180,180,50,50,50,76,76,76,152,152,152,177,177,177,59,59,59,142,142,142,178,178,178,176,176,176,170,170,170,173,173,173,176,141,176,176,141,176,176,141,176,176,140,176,35,28,35,74,59,74,113,90,113,173,138,173,40,32,40,138,111,138,149,119,149,169,135,169,166,132,166,160,128,160,162,129,162,172,172,172,171,171,171,171,171,171,34,34,34,8,8,8,94,94,94,165,165,165,78,78,78,68,68,68,17,17,17,165,165,165,161,161,161,156,156,156,162,162,162,167,134,167,163,131,163,165,132,165,156,125,156,6,5,6,92,73,92,157,125,157,76,61,76,49,39,49,61,49,61,164,131,164,160,128,160,158,126,158,144,115,144,162,162,162,162,162,162,160,160,160,161,161,161,6,6,6,92,92,92,137,137,137,90,90,90,69,69,69,59,59,59,159,159,159,155,155,155,150,150,150,140,140,140,157,126,157,157,125,157,153,123,153,156,125,156,72,58,72,129,103,129,133,106,133,153,122,153,67,53,67,131,104,131,154,123,154,150,120,150,147,117,147,145,116,145,152,152,152,152,152,152,152,152,152,151,151,151,42,42,42,64,64,64,127,127,127,148,148,148,49,49,49,119,119,119,149,149,149,147,147,147,142,142,142,145,145,145,147,118,147,147,117,147,147,117,147,146,117,146,29,23,29,61,49,61,94,75,94,143,115,143,33,26,33,115,92,115,123,99,123,141,112,141,137,110,137,133,106,133,134,107,134,255,250,140,255,229,129,255,255,156,112,78,44,255,255,161,255,255,161,71,49,27,33,23,13,238,165,93,79,55,31,75,52,29,255,255,155,255,255,160,255,255,158,255,255,156,255,255,156,193,129,65,204,137,69,255,204,103,255,248,125,255,235,119,247,165,83,255,219,111,255,227,115,255,219,111,255,248,125,255,250,127,255,235,119,255,222,112,255,243,123,255,212,107,255,222,112,255,243,123,255,227,115,216,144,73,162,108,55,231,155,78,239,160,81,255,212,107,255,199,101,255,212,107,254,170,86,255,186,94,255,178,90,255,219,111,255,214,108,255,206,104,255,248,125,247,165,83,146,98,49,255,248,125,255,253,128,255,240,122,255,201,102,166,111,56,255,199,101,255,248,125,255,248,125,255,245,124,255,248,125,255,250,127,255,209,106,204,137,69,255,191,97,255,212,107,221,110,0,232,116,0,121,121,121,118,118,118,120,120,120,115,115,115,122,97,122,122,97,122,121,97,121,24,19,24,51,41,51,78,62,78,119,95,119,28,22,28,96,77,96,103,82,103,117,94,117,115,92,115,111,89,111,112,89,112,119,119,119,119,119,119,119,119,119,24,24,24,5,5,5,65,65,65,114,114,114,54,54,54,47,47,47,11,11,11,115,115,115,112,112,112,108,108,108,113,113,113,116,93,116,114,91,114,115,92,115,109,87,109,4,3,4,64,51,64,110,88,110,53,43,53,35,28,35,43,34,43,115,92,115,112,90,112,111,89,111,102,81,102,114,114,114,114,114,114,113,113,113,114,114,114,4,4,4,65,65,65,97,97,97,64,64,64,49,49,49,42,42,42,113,113,113,110,110,110,107,107,107,100,100,100,112,90,112,112,90,112,110,88,110,112,89,112,52,41,52,92,74,92,96,77,96,110,88,110,48,38,48,94,75,94,111,89,111,109,87,109,106,85,106,105,84,105,111,111,111,111,111,111,110,110,110,110,110,110,31,31,31,46,46,46,93,93,93,109,109,109,36,36,36,87,87,87,110,110,110,108,108,108,105,105,105,107,107,107,103,103,103,109,87,109,109,87,109,109,87,109,22,17,22,46,37,46,70,56,70,108,86,108,25,20,25,86,69,86,93,74,93,106,85,106,104,83,104,100,80,100,101,81,101,108,108,108,108,108,108,108,108,108,21,21,21,5,5,5,60,60,60,104,104,104,50,50,50,71,89,89,10,12,12,142,177,177,141,177,177,144,180,180,140,175,175,144,180,180,145,145,181,145,145,181,145,145,181,144,144,181,62,62,78,140,140,175,99,99,123,0,0,0,52,52,65,69,69,86,10,10,12,138,138,173,138,138,173,141,141,176,136,136,170,140,140,175,141,177,177,140,175,175,141,176,176,141,176,176,81,101,101,136,170,170,9,12,12,14,17,17,29,37,37,49,61,61,16,21,21,130,163,163,138,173,173,131,164,164,135,169,169,132,165,165,137,137,172,133,133,166,137,137,171,137,137,171,129,129,162,133,133,167,6,6,8,9,9,12,45,45,56,35,35,44,79,79,98,125,125,156,134,134,168,128,128,161,131,131,164,131,131,163,133,166,166,129,161,161,133,166,166,132,165,165,125,157,157,129,161,161,6,8,8,9,11,11,43,54,54,34,43,43,76,95,95,121,151,151,130,162,162,124,155,155,127,158,158,126,158,158,129,129,161,127,127,159,128,128,160,115,115,144,120,120,150,126,126,158,0,0,0,11,11,14,48,48,60,19,19,23,123,123,154,75,75,93,125,125,157,124,124,155,117,117,146,119,119,149,124,155,155,124,155,155,124,155,155,53,67,67,119,149,149,84,105,105,0,0,0,44,55,55,59,74,74,8,10,10,118,147,147,117,147,147,119,149,149,116,145,145,119,149,149,120,120,150,120,120,150,119,119,149,119,119,149,51,51,64,115,115,144,81,81,101,0,0,0,42,42,53,57,57,71,8,8,10,113,113,142,113,113,141,115,115,144,111,111,139,114,114,143,115,144,144,114,142,142,115,144,144,255,255,155,255,255,147,255,255,145,255,255,156,255,253,142,255,255,151,255,255,161,129,90,50,66,46,26,209,145,81,184,128,71,79,55,31,255,247,138,255,255,155,255,255,161,255,255,161,255,255,156,255,255,156,255,250,127,255,227,115,255,230,116,255,227,115,255,214,108,255,245,124,243,162,82,255,238,120,255,235,119,255,181,91,255,240,122,255,225,114,255,232,118,255,240,122,255,199,101,244,122,0,252,126,0,249,124,0,244,122,0,247,123,0,232,116,0,214,107,0,191,95,0,193,96,0,168,84,0,173,86,0,188,94,0,232,116,0,234,117,0,244,122,0,244,122,0,244,122,0,244,122,0,247,123,0,237,118,0,229,114,0,242,121,0,244,122,0,244,122,0,244,122,0,244,122,0,249,124,0,249,124,0,252,126,0,242,121,0,247,123,0,242,121,0,234,117,0,229,114,0,244,122,0,36,45,45,48,60,60,6,8,8,95,119,119,95,119,119,97,121,121,94,117,117,96,121,121,93,117,117,97,97,122,97,97,121,97,97,121,42,42,52,94,94,117,66,66,83,0,0,0,35,35,43,46,46,58,6,6,8,93,93,116,92,92,116,94,94,118,91,91,114,94,94,118,95,119,119,94,117,117,94,118,118,94,118,118,54,68,68,91,114,114,6,8,8,9,11,11,19,24,24,33,41,41,11,14,14,88,110,110,93,116,116,88,110,110,91,114,114,89,111,111,93,93,116,90,90,112,92,92,116,92,92,115,87,87,109,90,90,113,4,4,5,6,6,8,30,30,38,24,24,30,53,53,67,85,85,106,91,91,114,87,87,109,89,89,112,89,89,111,91,114,114,88,110,110,91,113,113,90,113,113,86,107,107,88,111,111,4,5,5,6,7,7,30,37,37,23,29,29,52,66,66,83,104,104,90,112,112,86,107,107,88,110,110,87,109,109,89,89,112,88,88,110,89,89,111,80,80,100,83,83,104,88,88,110,0,0,0,8,8,10,34,34,42,13,13,16,87,87,108,52,52,66,88,88,110,87,87,109,83,83,103,84,84,106,88,110,110,88,110,110,88,110,110,38,47,47,85,106,106,60,75,75,0,0,0,31,39,39,42,53,53,6,7,7,84,106,106,84,106,106,86,108,108,83,104,104,86,108,108,83,104,104,87,87,108,87,87,108,87,87,108,37,37,47,84,84,105,59,59,74,0,0,0,130,104,130,182,145,182,105,84,105,129,103,129,11,8,11,183,146,183,179,143,179,180,144,180,174,139,174,174,139,174,181,181,181,181,181,181,179,179,179,180,180,180,151,151,151,136,136,136,43,43,43,114,114,114,175,175,175,95,95,95,74,74,74,149,149,149,172,172,172,174,174,174,168,168,168,171,171,171,168,168,168,176,141,176,176,141,176,172,137,172,173,139,173,175,140,175,22,18,22,7,5,7,118,94,118,123,98,123,172,137,172,99,79,99,122,97,122,10,8,10,172,138,172,168,135,168,170,136,170,164,131,164,164,131,164,170,170,170,170,170,170,168,168,168,169,169,169,142,142,142,128,128,128,40,40,40,107,107,107,164,164,164,89,89,89,69,69,69,140,140,140,161,161,161,163,163,163,157,157,157,160,160,160,157,157,157,165,132,165,164,131,164,161,129,161,162,130,162,163,131,163,21,17,21,6,5,6,110,88,110,114,91,114,160,128,160,93,74,93,114,91,114,9,7,9,160,128,160,157,125,157,158,126,158,153,122,153,152,122,152,159,159,159,158,158,158,156,156,156,157,157,157,132,132,132,119,119,119,38,38,38,99,99,99,153,153,153,83,83,83,64,64,64,130,130,130,150,150,150,151,151,151,146,146,146,149,149,149,145,145,145,152,122,152,152,122,152,149,119,149,150,120,150,151,121,151,19,15,19,6,4,6,101,81,101,106,84,106,148,118,148,86,68,86,105,84,105,9,7,9,148,118,148,145,116,145,146,116,146,141,113,141,141,112,141,146,146,146,146,146,146,144,144,144,145,145,145,121,121,121,109,109,109,255,255,155,255,255,153,255,255,151,255,255,156,196,136,76,255,247,138,255,255,161,255,255,160,25,17,9,217,151,84,108,75,42,184,128,71,125,87,49,255,255,153,255,255,156,255,255,156,255,255,158,255,255,158,252,126,0,244,122,0,247,123,0,244,122,0,244,122,0,252,126,0,242,121,0,242,121,0,247,123,0,242,121,0,239,119,0,247,123,0,249,124,0,237,118,0,244,122,0,249,124,0,252,126,0,247,123,0,242,121,0,198,99,0,137,68,0,198,99,0,181,90,0,76,38,0,58,29,0,112,56,0,135,67,0,160,80,0,135,67,0,170,85,0,242,121,0,242,121,0,234,117,0,247,123,0,249,124,0,249,124,0,247,123,0,242,121,0,242,121,0,244,122,0,244,122,0,252,126,0,252,126,0,247,123,0,247,123,0,244,122,0,234,117,0,239,119,0,237,118,0,239,119,0,104,104,104,94,94,94,30,30,30,76,76,76,121,121,121,66,66,66,51,51,51,103,103,103,60,60,60,120,120,120,116,116,116,118,118,118,116,116,116,120,120,120,121,97,121,119,95,119,120,96,120,121,96,121,7,5,7,4,3,4,81,65,81,85,68,85,118,95,118,48,38,48,84,67,84,7,5,7,119,95,119,116,93,116,116,93,116,114,91,114,113,91,113,118,118,118,118,118,118,117,117,117,118,118,118,98,98,98,89,89,89,28,28,28,72,72,72,114,114,114,62,62,62,48,48,48,97,97,97,57,57,57,114,114,114,110,110,110,112,112,112,110,110,110,114,114,114,115,92,115,113,90,113,114,91,114,115,92,115,6,5,6,4,3,4,77,62,77,81,64,81,113,90,113,46,36,46,80,64,80,6,5,6,114,91,114,111,89,111,111,89,111,109,87,109,108,87,108,113,113,113,113,113,113,112,112,112,113,113,113,94,94,94,85,85,85,27,27,27,69,69,69,110,110,110,60,60,60,46,46,46,94,94,94,55,55,55,109,109,109,106,106,106,108,108,108,105,105,105,110,110,110,111,89,111,109,87,109,110,88,110,111,88,111,6,5,6,4,3,4,74,59,74,78,62,78,109,87,109,44,35,44,78,62,78,6,5,6,110,88,110,107,86,107,107,86,107,105,84,105,105,84,105,109,109,109,109,109,109,108,108,108,109,109,109,91,91,91,82,82,82,26,26,26,67,67,67,106,106,106,58,58,58,141,177,177,5,7,7,28,35,35,107,133,133,89,111,111,45,57,57,23,29,29,143,179,179,132,166,166,66,82,82,113,141,141,142,178,178,137,172,172,140,175,175,136,170,170,140,175,175,144,144,180,144,144,180,143,143,179,137,137,172,5,5,7,27,27,34,18,18,23,86,86,108,79,79,98,15,15,19,139,139,174,128,128,161,34,34,42,124,124,155,138,138,172,133,133,167,137,137,172,131,131,164,135,135,169,139,174,174,139,174,174,139,174,174,137,172,172,2,3,3,26,33,33,18,22,22,73,92,92,76,95,95,15,19,19,123,154,154,134,167,167,33,41,41,119,149,149,128,160,160,131,164,164,133,166,166,125,157,157,131,163,163,134,134,168,134,134,168,133,133,166,134,134,167,2,2,3,13,13,16,32,32,40,71,71,89,73,73,92,26,26,33,64,64,80,129,129,161,5,5,6,88,88,111,123,123,154,126,126,158,127,127,159,118,118,148,126,126,157,129,162,162,129,161,161,127,159,159,128,161,161,85,107,107,27,34,34,31,38,38,65,82,82,65,82,82,25,32,32,61,76,76,124,155,155,40,51,51,85,106,106,27,34,34,123,153,153,122,153,153,113,142,142,120,151,151,124,124,155,124,124,155,121,121,151,123,123,154,82,82,102,26,26,32,23,23,29,63,63,78,62,62,78,38,38,47,19,19,24,118,118,148,39,39,48,54,54,68,26,26,33,117,117,147,113,113,142,116,116,145,115,115,144,116,116,145,118,148,148,116,145,145,118,147,147,113,141,141,4,5,5,22,28,28,85,106,106,70,88,88,36,45,45,255,255,155,255,255,156,255,253,142,255,255,156,154,107,60,133,93,52,255,255,161,255,255,161,255,255,147,255,221,124,62,43,24,104,72,40,175,122,68,255,255,156,255,255,150,255,255,158,255,255,156,255,255,158,252,126,0,247,123,0,247,123,0,242,121,0,244,122,0,244,122,0,244,122,0,242,121,0,244,122,0,244,122,0,239,119,0,249,124,0,244,122,0,244,122,0,249,124,0,252,126,0,247,123,0,247,123,0,221,110,0,102,51,0,99,49,0,66,33,0,20,10,0,40,20,0,10,5,0,20,10,0,58,29,0,165,82,0,68,34,0,45,22,0,63,31,0,38,19,0,150,75,0,183,91,0,244,122,0,252,126,0,252,126,0,244,122,0,247,123,0,244,122,0,244,122,0,249,124,0,249,124,0,247,123,0,244,122,0,249,124,0,237,118,0,237,118,0,239,119,0,100,125,125,100,125,125,99,124,124,100,125,125,66,83,83,21,26,26,24,30,30,51,64,64,51,63,63,20,25,25,47,59,59,96,120,120,31,39,39,66,83,83,21,27,27,96,120,120,95,119,119,88,111,111,94,118,118,95,119,119,97,97,121,95,95,118,96,96,121,64,64,80,20,20,25,18,18,23,49,49,62,49,49,61,30,30,37,15,15,19,93,93,117,30,30,38,43,43,54,21,21,26,93,93,116,90,90,112,92,92,115,91,91,114,92,92,115,94,118,118,92,115,115,94,117,117,90,112,112,3,4,4,18,22,22,68,85,85,56,70,70,29,36,36,15,18,18,91,114,114,84,105,105,42,52,52,72,90,90,90,113,113,87,109,109,89,112,112,86,108,108,89,111,111,92,92,115,92,92,115,91,91,114,88,88,110,3,3,4,17,17,21,12,12,15,55,55,69,50,50,63,10,10,12,89,89,111,82,82,103,22,22,27,79,79,99,88,88,111,86,86,107,88,88,110,85,85,106,87,87,109,90,112,112,90,112,112,90,112,112,89,111,111,1,2,2,17,21,21,11,14,14,48,60,60,49,62,62,9,12,12,80,100,100,87,109,109,21,27,27,78,98,98,83,104,104,86,107,107,87,108,108,82,103,103,86,107,107,88,88,110,88,88,110,87,87,109,88,88,110,1,1,2,8,8,11,21,21,26,47,47,59,48,48,61,17,17,22,42,42,53,86,86,107,3,3,4,59,59,74,82,82,103,85,85,106,179,179,179,183,183,183,173,173,173,162,162,162,178,143,178,178,142,178,176,141,176,176,140,176,181,145,181,179,143,179,180,144,180,177,141,177,138,110,138,121,97,121,167,133,167,175,140,175,175,140,175,173,138,173,173,138,173,174,139,174,174,139,174,179,143,179,173,139,173,168,134,168,164,131,164,173,173,173,172,172,172,170,170,170,170,170,170,175,175,175,173,173,173,174,174,174,171,171,171,133,133,133,117,117,117,161,161,161,169,169,169,169,169,169,167,167,167,167,167,167,168,168,168,168,168,168,173,173,173,167,167,167,162,162,162,158,158,158,168,134,168,171,137,171,164,131,164,158,127,158,165,132,165,165,132,165,164,131,164,156,124,156,130,104,130,116,92,116,160,128,160,163,130,163,162,130,162,157,126,157,164,131,164,160,128,160,161,129,161,166,133,166,161,128,161,147,117,147,160,128,160,161,161,161,164,164,164,157,157,157,152,152,152,158,158,158,158,158,158,158,158,158,149,149,149,124,124,124,111,111,111,153,153,153,156,156,156,156,156,156,150,150,150,156,156,156,153,153,153,154,154,154,159,159,159,154,154,154,140,140,140,158,126,158,152,122,152,151,120,151,153,123,153,153,122,153,151,121,151,156,124,156,152,122,152,131,105,131,90,72,90,115,92,115,143,114,143,143,114,143,150,120,150,139,111,139,148,118,148,147,118,147,147,118,147,150,120,150,142,113,142,132,106,132,150,150,150,145,145,145,144,144,144,146,146,146,146,146,146,144,144,144,148,148,148,145,145,145,125,125,125,86,86,86,110,110,110,136,136,136,136,136,136,255,250,140,255,255,155,255,255,145,255,255,150,255,200,112,138,96,53,255,255,161,255,255,161,255,255,160,184,128,71,83,58,32,104,72,40,71,49,27,255,255,156,255,255,156,255,255,158,255,255,156,255,255,156,252,126,0,244,122,0,244,122,0,242,121,0,244,122,0,244,122,0,252,126,0,249,124,0,249,124,0,247,123,0,244,122,0,247,123,0,247,123,0,252,126,0,252,126,0,249,124,0,244,122,0,249,124,0,198,99,0,142,71,0,15,7,0,15,7,0,22,11,0,15,7,0,28,14,0,56,28,0,94,47,0,102,51,0,117,58,0,170,85,0,99,49,0,45,22,0,28,14,0,142,71,0,247,123,0,252,126,0,252,126,0,249,124,0,252,126,0,244,122,0,244,122,0,249,124,0,252,126,0,249,124,0,244,122,0,247,123,0,229,114,0,224,112,0,234,117,0,126,101,126,122,98,122,112,89,112,122,97,122,123,123,123,125,125,125,120,120,120,116,116,116,121,121,121,120,120,120,120,120,120,114,114,114,95,95,95,84,84,84,117,117,117,119,119,119,119,119,119,115,115,115,120,120,120,117,117,117,118,118,118,122,122,122,118,118,118,108,108,108,117,117,117,117,94,117,116,93,116,118,94,118,118,94,118,116,93,116,120,96,120,117,94,117,101,81,101,70,56,70,89,71,89,111,88,111,110,88,110,116,93,116,108,86,108,115,92,115,115,92,115,114,91,114,117,93,117,111,88,111,103,82,103,117,117,117,114,114,114,112,112,112,115,115,115,114,114,114,113,113,113,116,116,116,114,114,114,98,98,98,68,68,68,86,86,86,108,108,108,107,107,107,113,113,113,105,105,105,112,112,112,112,112,112,111,111,111,114,114,114,108,108,108,101,101,101,111,89,111,111,89,111,109,87,109,109,87,109,113,90,113,111,89,111,112,90,112,110,88,110,86,69,86,75,60,75,104,83,104,110,88,110,109,87,109,108,86,108,108,86,108,109,87,109,109,87,109,112,90,112,109,87,109,105,84,105,103,82,103,109,109,109,108,108,108,107,107,107,107,107,107,110,110,110,109,109,109,110,110,110,108,108,108,84,84,84,74,74,74,102,102,102,107,107,107,107,107,107,106,106,106,106,106,106,107,107,107,107,107,107,110,110,110,107,107,107,103,103,103,101,101,101,108,86,108,110,88,110,105,84,105,102,81,102,50,40,50,163,130,163,185,148,185,185,148,185,127,101,127,98,79,98,78,62,78,169,135,169,130,104,130,183,146,183,177,142,177,166,133,166,177,141,177,162,129,162,167,134,167,181,181,181,181,181,181,177,177,177,181,181,181,180,180,180,178,178,178,145,145,145,14,14,14,79,79,79,177,177,177,179,179,179,177,177,177,138,138,138,135,135,135,116,116,116,150,150,150,175,175,175,171,171,171,169,169,169,167,167,167,167,167,167,165,165,165,175,140,175,175,140,175,174,139,174,172,138,172,174,139,174,173,139,173,170,136,170,50,40,50,47,37,47,151,121,151,172,137,172,172,137,172,117,94,117,91,73,91,72,58,72,156,125,156,120,96,120,170,136,170,164,131,164,154,123,154,163,131,163,150,120,150,154,123,154,168,168,168,167,167,167,164,164,164,167,167,167,166,166,166,164,164,164,134,134,134,13,13,13,73,73,73,163,163,163,164,164,164,162,162,162,127,127,127,124,124,124,107,107,107,138,138,138,161,161,161,157,157,157,155,155,155,153,153,153,153,153,153,151,151,151,160,128,160,160,128,160,159,127,159,157,126,157,159,127,159,158,127,158,155,124,155,46,37,46,43,34,43,138,110,138,157,125,157,156,125,156,107,85,107,83,66,83,66,52,66,142,114,142,109,87,109,154,123,154,149,119,149,140,112,140,149,119,149,136,109,136,140,112,140,152,152,152,152,152,152,148,148,148,151,151,151,151,151,151,149,149,149,121,121,121,12,12,12,66,66,66,148,148,148,149,149,149,147,147,147,115,115,115,112,112,112,97,97,97,125,125,125,255,255,143,255,255,155,255,255,147,255,255,150,179,125,70,255,177,99,255,255,145,255,255,160,255,255,161,255,255,150,87,61,34,25,17,9,255,177,99,255,255,161,255,255,156,255,255,156,255,255,156,255,255,156,244,122,0,244,122,0,244,122,0,244,122,0,249,124,0,244,122,0,249,124,0,252,126,0,252,126,0,249,124,0,249,124,0,252,126,0,244,122,0,249,124,0,247,123,0,244,122,0,244,122,0,249,124,0,178,89,0,43,21,0,15,7,0,28,14,0,38,19,0,33,16,0,22,11,0,25,12,0,17,8,0,63,31,0,91,45,0,84,42,0,48,24,0,117,58,0,28,14,0,140,70,0,226,113,0,252,126,0,252,126,0,247,123,0,244,122,0,244,122,0,244,122,0,244,122,0,247,123,0,242,121,0,242,121,0,239,119,0,226,113,0,237,118,0,232,116,0,90,72,90,127,101,127,123,98,123,115,92,115,122,98,122,112,89,112,115,92,115,125,125,125,125,125,125,125,125,125,125,125,125,124,124,124,123,123,123,100,100,100,43,43,43,55,55,55,122,122,122,123,123,123,122,122,122,75,75,75,93,93,93,80,80,80,104,104,104,121,121,121,119,119,119,117,117,117,115,115,115,115,115,115,114,114,114,116,116,116,121,96,121,120,96,120,119,95,119,120,96,120,120,96,120,117,94,117,35,28,35,32,26,32,105,84,105,118,94,118,119,95,119,81,65,81,63,50,63,50,40,50,112,90,112,83,67,83,118,94,118,114,91,114,107,85,107,114,91,114,104,83,104,108,86,108,117,117,117,117,117,117,117,117,117,117,117,117,116,116,116,115,115,115,94,94,94,41,41,41,51,51,51,115,115,115,116,116,116,114,114,114,71,71,71,87,87,87,75,75,75,97,97,97,114,114,114,112,112,112,110,110,110,109,109,109,108,108,108,107,107,107,109,109,109,114,91,114,114,91,114,113,90,113,114,91,114,113,91,113,111,89,111,33,26,33,30,24,30,99,79,99,112,89,112,113,90,113,77,62,77,60,48,60,47,38,47,107,85,107,79,63,79,112,90,112,109,87,109,102,81,102,108,87,108,99,79,99,103,82,103,112,112,112,111,111,111,111,111,111,111,111,111,111,111,111,110,110,110,90,90,90,39,39,39,49,49,49,110,110,110,111,111,111,109,109,109,68,68,68,83,83,83,72,72,72,182,146,182,182,146,182,99,79,99,153,123,153,155,124,155,164,164,164,164,164,164,177,177,177,169,169,169,173,173,173,172,172,172,142,142,142,172,172,172,61,61,61,81,81,81,177,177,177,88,88,88,141,141,141,176,176,176,164,164,164,175,175,175,164,164,164,78,78,78,174,174,174,172,172,172,176,176,176,96,96,96,166,166,166,149,149,149,174,139,174,158,126,158,170,136,170,165,132,165,166,133,166,160,128,160,137,109,137,165,132,165,142,113,142,78,62,78,164,131,164,84,67,84,136,108,136,153,122,153,158,126,158,138,111,138,163,130,163,75,60,75,169,135,169,165,132,165,168,135,168,116,93,116,159,127,159,135,108,135,167,167,167,151,151,151,156,156,156,158,158,158,120,120,120,154,154,154,131,131,131,162,162,162,136,136,136,125,125,125,157,157,157,81,81,81,157,157,157,146,146,146,163,163,163,132,132,132,155,155,155,130,130,130,161,161,161,159,159,159,159,159,159,111,111,111,122,122,122,128,128,128,159,127,159,146,117,146,149,119,149,103,82,103,114,91,114,146,117,146,138,110,138,154,123,154,157,125,157,119,95,119,149,119,149,143,114,143,149,119,149,92,74,92,155,124,155,126,100,126,155,124,155,123,99,123,122,97,122,151,121,151,151,121,151,127,102,127,116,92,116,128,102,128,148,118,148,138,138,138,129,129,129,97,97,97,141,141,141,134,134,134,131,131,131,106,106,106,148,148,148,113,113,113,93,93,93,135,135,135,141,141,141,88,88,88,146,146,146,33,33,33,147,147,147,135,135,135,115,115,115,143,143,143,255,255,153,255,255,156,255,255,156,255,224,125,255,238,134,255,218,122,125,87,49,205,142,80,255,255,160,255,255,153,33,23,13,16,11,6,129,90,50,255,255,161,255,255,156,255,255,156,255,255,161,244,122,0,244,122,0,244,122,0,244,122,0,249,124,0,249,124,0,247,123,0,247,123,0,244,122,0,244,122,0,244,122,0,244,122,0,249,124,0,237,118,0,242,121,0,165,82,0,109,54,0,114,57,0,91,45,0,79,39,0,94,47,0,20,10,0,15,7,0,15,7,0,45,22,0,40,20,0,38,19,0,15,7,0,28,14,0,43,21,0,40,20,0,140,70,0,104,52,0,15,7,0,2,1,0,79,39,0,219,109,0,249,124,0,247,123,0,242,121,0,247,123,0,244,122,0,242,121,0,242,121,0,237,118,0,247,123,0,242,121,0,234,117,0,242,121,0,112,90,112,116,93,116,102,81,102,120,96,120,55,44,55,124,99,124,121,97,121,124,99,124,85,68,85,117,93,117,99,79,99,123,123,123,111,111,111,115,115,115,116,116,116,88,88,88,113,113,113,96,96,96,119,119,119,100,100,100,92,92,92,116,116,116,59,59,59,115,115,115,108,108,108,120,120,120,98,98,98,115,115,115,96,96,96,119,119,119,118,118,118,118,118,118,82,82,82,90,90,90,95,95,95,116,116,116,108,87,108,111,88,111,76,61,76,85,68,85,109,87,109,103,82,103,115,92,115,117,93,117,89,71,89,112,89,112,107,85,107,111,89,111,69,55,69,116,93,116,94,75,94,117,93,117,93,74,93,91,73,91,114,91,114,114,91,114,96,77,96,87,70,87,97,77,97,112,90,112,105,105,105,98,98,98,74,74,74,107,107,107,102,102,102,99,99,99,81,81,81,113,113,113,86,86,86,71,71,71,104,104,104,108,108,108,67,67,67,113,113,113,25,25,25,114,114,114,104,104,104,89,89,89,111,111,111,112,112,112,93,93,93,61,61,61,94,94,94,109,109,109,101,81,101,95,76,95,109,87,109,104,83,104,99,79,99,106,85,106,79,63,79,106,85,106,37,30,37,69,55,69,109,87,109,106,84,106,66,52,66,109,87,109,25,20,25,109,87,109,102,81,102,87,69,87,108,87,108,109,87,109,109,87,109,59,47,59,92,74,92,93,74,93,99,99,99,99,99,99,106,106,106,102,102,102,104,104,104,104,130,130,6,7,7,28,35,35,63,79,79,103,129,129,127,159,159,116,146,146,103,129,129,62,78,78,134,167,167,140,175,175,71,89,89,75,94,94,77,96,96,142,177,177,142,177,177,137,171,171,140,175,175,137,171,171,139,174,174,142,178,178,145,145,181,142,142,177,143,143,179,144,144,180,144,144,180,100,100,125,8,8,10,27,27,34,46,46,57,99,99,124,121,121,151,112,112,140,99,99,124,43,43,53,129,129,161,47,47,59,68,68,85,67,67,83,74,74,92,136,136,170,131,131,164,131,131,164,132,132,166,131,131,164,136,136,170,136,136,170,138,173,173,135,169,169,137,171,171,138,172,172,137,172,172,8,10,10,8,10,10,23,29,29,44,55,55,95,119,119,115,144,144,107,134,134,42,53,53,41,51,51,129,162,162,45,56,56,81,102,102,63,79,79,70,88,88,129,162,162,125,157,157,124,155,155,126,158,158,128,161,161,130,162,162,132,132,165,132,132,165,129,129,161,131,131,164,131,131,164,128,128,160,7,7,9,15,15,19,22,22,27,42,42,52,107,107,134,109,109,137,120,120,150,40,40,50,59,59,74,123,123,153,9,9,11,77,77,96,60,60,75,35,35,44,123,123,153,112,112,140,117,117,146,117,117,146,122,122,152,123,123,153,125,156,156,125,156,156,123,154,154,124,155,155,124,155,155,121,151,151,4,6,6,14,18,18,21,26,26,74,93,93,101,126,126,86,108,108,113,141,141,51,64,64,56,70,70,116,145,145,8,10,10,73,91,91,48,60,60,33,42,42,116,145,145,106,132,132,114,143,143,255,255,148,255,255,155,255,255,158,255,247,138,255,255,158,255,255,151,255,192,107,129,90,50,255,255,160,255,255,160,20,14,8,46,32,17,242,168,94,255,255,160,255,255,161,255,255,156,255,255,160,244,122,0,247,123,0,252,126,0,252,126,0,252,126,0,247,123,0,239,119,0,234,117,0,237,118,0,244,122,0,242,121,0,239,119,0,234,117,0,216,108,0,135,67,0,25,12,0,40,20,0,28,14,0,96,48,0,117,58,0,170,85,0,81,40,0,10,5,0,2,1,0,2,1,0,22,11,0,45,22,0,20,10,0,38,19,0,61,30,0,51,25,0,186,93,0,107,53,0,71,35,0,0,0,0,5,2,0,38,19,0,247,123,0,252,126,0,247,123,0,244,122,0,244,122,0,239,119,0,224,112,0,247,123,0,249,124,0,244,122,0,239,119,0,244,122,0,81,81,101,71,71,89,31,31,39,93,93,116,34,34,42,49,49,62,48,48,60,53,53,67,98,98,123,95,95,119,95,95,119,96,96,120,95,95,118,98,98,123,98,98,123,100,125,125,98,123,123,99,124,124,100,125,125,100,125,125,6,7,7,6,7,7,17,21,21,32,40,40,69,86,86,84,105,105,77,97,97,30,38,38,29,37,37,94,118,118,32,40,40,59,74,74,46,58,58,51,64,64,94,118,118,91,114,114,90,113,113,92,115,115,94,117,117,94,118,118,94,118,118,96,96,120,94,94,118,96,96,120,96,96,120,94,94,117,5,5,7,11,11,14,16,16,20,30,30,38,79,79,98,80,80,101,88,88,110,29,29,37,44,44,55,91,91,113,6,6,8,57,57,71,44,44,56,26,26,33,91,91,114,83,83,104,87,87,109,87,87,109,90,90,113,91,91,114,93,116,116,93,116,116,92,115,115,93,116,116,93,116,116,91,113,113,3,4,4,11,14,14,15,19,19,56,70,70,76,95,95,65,81,81,85,107,107,39,48,48,42,53,53,88,110,110,6,8,8,55,69,69,37,46,46,25,32,32,88,111,111,81,101,101,87,109,109,84,106,106,88,110,110,87,109,109,91,91,113,89,89,111,89,89,112,90,90,113,90,90,113,63,63,78,3,3,4,10,10,13,38,38,47,54,54,68,77,77,96,63,63,79,62,62,78,38,38,47,41,41,52,85,85,106,6,6,7,46,46,57,36,36,45,86,86,108,86,86,108,18,22,22,63,79,79,28,35,35,146,183,183,140,175,175,84,105,105,148,186,186,142,178,178,140,176,176,143,179,179,143,179,179,144,181,181,147,147,184,147,147,184,144,144,180,145,145,181,146,146,183,146,146,183,146,146,182,103,103,129,129,129,162,138,138,172,143,143,179,2,2,3,2,2,3,8,8,10,26,26,32,13,13,16,17,17,21,52,52,65,108,108,135,140,140,175,135,135,169,141,141,176,138,138,172,135,135,169,139,139,174,137,137,172,138,138,173,141,141,176,141,176,176,140,176,176,133,167,167,140,175,175,140,175,175,139,174,174,122,153,153,129,162,162,123,154,154,130,163,163,54,68,68,0,0,0,4,5,5,9,12,12,11,13,13,16,20,20,58,72,72,26,32,32,133,167,167,128,160,160,77,96,96,135,169,169,130,162,162,128,160,160,131,163,163,130,163,163,131,164,164,134,134,167,134,134,167,131,131,163,132,132,165,133,133,166,133,133,166,132,132,165,93,93,117,117,117,146,125,125,156,130,130,162,2,2,3,2,2,3,7,7,9,23,23,29,11,11,14,15,15,19,47,47,58,98,98,122,126,126,158,122,122,153,127,127,159,124,124,155,121,121,152,125,125,156,123,123,154,124,124,155,127,127,158,126,158,158,126,158,158,119,149,149,125,157,157,125,157,157,125,156,156,109,137,137,116,145,145,110,138,138,116,145,145,48,61,61,0,0,0,3,4,4,8,10,10,9,12,12,14,18,18,51,64,64,23,29,29,119,149,149,114,142,142,68,85,85,121,151,151,115,144,144,114,142,142,116,145,145,116,145,145,255,255,158,255,255,158,255,255,160,255,209,117,255,255,153,255,255,145,255,186,104,255,226,127,255,189,106,255,235,132,46,32,17,25,17,9,255,255,143,255,255,161,255,255,161,255,255,153,255,255,156,244,122,0,249,124,0,252,126,0,249,124,0,247,123,0,249,124,0,244,122,0,244,122,0,244,122,0,244,122,0,244,122,0,247,123,0,229,114,0,76,38,0,51,25,0,53,26,0,45,22,0,96,48,0,63,31,0,71,35,0,91,45,0,40,20,0,7,3,0,5,2,0,7,3,0,102,51,0,35,17,0,17,8,0,53,26,0,45,22,0,25,12,0,137,68,0,158,79,0,17,8,0,5,2,0,10,5,0,10,5,0,56,28,0,252,126,0,252,126,0,249,124,0,247,123,0,242,121,0,247,123,0,244,122,0,249,124,0,239,119,0,239,119,0,244,122,0,103,103,128,2,2,2,2,2,2,6,6,7,18,18,23,9,9,11,12,12,15,37,37,46,77,77,97,100,100,125,97,97,121,100,100,126,98,98,123,96,96,120,99,99,124,98,98,122,99,99,123,100,100,126,100,125,125,100,125,125,95,119,119,100,125,125,100,125,125,99,124,124,87,109,109,92,115,115,88,110,110,93,116,116,39,48,48,0,0,0,2,3,3,6,8,8,7,9,9,11,14,14,41,52,52,18,23,23,95,119,119,91,114,114,55,69,69,97,121,121,93,116,116,92,115,115,94,117,117,94,117,117,94,118,118,93,117,117,96,96,120,94,94,118,95,95,119,96,96,120,96,96,120,95,95,119,67,67,84,85,85,106,90,90,113,94,94,118,1,1,2,1,1,2,5,5,7,17,17,21,8,8,10,11,11,14,34,34,42,71,71,89,92,92,115,89,89,111,93,93,116,91,91,113,89,89,111,91,91,114,90,90,113,91,91,114,93,93,116,93,116,116,93,116,116,88,110,110,93,116,116,92,116,116,92,116,116,81,101,101,86,107,107,82,102,102,86,108,108,36,45,45,0,0,0,2,3,3,6,8,8,7,9,9,11,13,13,38,48,48,17,22,22,89,112,112,85,107,107,51,64,64,91,114,114,87,109,109,86,108,108,88,110,110,88,110,110,89,111,111,88,110,110,90,90,113,88,88,111,89,89,112,90,90,113,90,90,113,90,90,112,63,63,79,80,80,100,85,85,107,89,89,111,1,1,2,1,1,2,182,182,182,186,186,186,178,178,178,179,179,179,181,145,181,185,148,185,181,144,181,186,149,186,184,147,184,178,142,178,181,145,181,185,148,185,179,143,179,182,146,182,104,83,104,11,8,11,7,5,7,29,23,29,18,14,18,49,39,49,33,26,33,27,22,27,108,86,108,176,141,176,181,145,181,176,140,176,175,140,175,175,140,175,180,144,180,176,141,176,176,141,176,170,136,170,172,137,172,173,173,173,177,177,177,171,171,171,172,172,172,176,176,176,170,170,170,173,173,173,177,177,177,175,175,175,171,171,171,138,138,138,10,10,10,7,7,7,28,28,28,17,17,17,68,68,68,70,70,70,26,26,26,103,103,103,168,168,168,173,173,173,171,171,171,169,169,169,166,166,166,171,171,171,168,168,168,167,167,167,160,160,160,163,163,163,165,132,165,168,134,168,162,130,162,164,131,164,167,133,167,165,132,165,163,130,163,167,134,167,165,132,165,162,129,162,131,105,131,45,36,45,10,8,10,26,21,26,16,13,16,65,52,65,66,53,66,41,33,41,48,38,48,159,127,159,163,130,163,161,129,161,159,127,159,157,126,157,160,128,160,158,126,158,158,126,158,151,121,151,154,123,154,150,120,150,155,155,155,155,155,155,154,154,154,157,157,157,155,155,155,153,153,153,155,155,155,157,157,157,152,152,152,123,123,123,42,42,42,9,9,9,9,9,9,14,14,14,61,61,61,62,62,62,39,39,39,45,45,45,112,112,112,153,153,153,151,151,151,150,150,150,148,148,148,150,150,150,150,150,150,147,147,147,149,149,149,144,144,144,255,255,156,255,255,156,255,255,158,255,255,161,205,142,80,179,125,70,255,224,125,255,255,148,251,174,98,221,154,86,251,174,98,29,20,11,33,23,13,255,235,132,255,255,161,255,255,158,255,255,156,255,255,158,244,122,0,244,122,0,247,123,0,244,122,0,244,122,0,244,122,0,244,122,0,247,123,0,244,122,0,244,122,0,242,121,0,249,124,0,107,53,0,22,11,0,61,30,0,48,24,0,35,17,0,48,24,0,81,40,0,124,62,0,89,44,0,53,26,0,17,8,0,20,10,0,22,11,0,43,21,0,89,44,0,45,22,0,79,39,0,58,29,0,22,11,0,53,26,0,135,67,0,56,28,0,48,24,0,35,17,0,30,15,0,10,5,0,249,124,0,252,126,0,244,122,0,247,123,0,249,124,0,244,122,0,249,124,0,244,122,0,244,122,0,242,121,0,131,104,131,129,103,129,129,103,129,73,58,73,7,6,7,5,4,5,20,16,20,13,10,13,35,28,35,23,18,23,19,15,19,76,61,76,124,99,124,128,102,128,123,99,123,123,98,123,123,98,123,127,101,127,124,99,124,124,99,124,120,96,120,121,96,121,122,122,122,124,124,124,120,120,120,121,121,121,124,124,124,120,120,120,122,122,122,124,124,124,123,123,123,120,120,120,97,97,97,7,7,7,4,4,4,19,19,19,12,12,12,48,48,48,49,49,49,18,18,18,73,73,73,118,118,118,122,122,122,120,120,120,119,119,119,118,118,118,121,121,121,118,118,118,118,118,118,113,113,113,115,115,115,113,113,113,119,95,119,115,92,115,116,93,116,118,95,118,117,93,117,116,92,116,119,95,119,118,94,118,115,92,115,93,75,93,32,25,32,7,5,7,19,15,19,11,9,11,46,37,46,47,38,47,29,23,29,34,27,34,114,91,114,117,94,117,116,93,116,115,92,115,113,91,113,116,92,116,115,92,115,114,91,114,109,87,109,111,89,111,109,87,109,112,112,112,112,112,112,112,112,112,114,114,114,113,113,113,112,112,112,113,113,113,115,115,115,111,111,111,90,90,90,31,31,31,6,6,6,6,6,6,10,10,10,45,45,45,46,46,46,28,28,28,33,33,33,83,83,83,114,114,114,114,114,114,111,111,111,110,110,110,112,112,112,112,112,112,110,110,110,112,112,112,108,108,108,106,106,106,109,87,109,109,87,109,109,87,109,112,90,112,188,150,188,184,147,184,138,111,138,34,27,34,20,16,20,15,12,15,113,90,113,183,146,183,184,147,184,177,141,177,184,147,184,185,148,185,185,148,185,185,148,185,185,148,185,173,138,173,141,113,141,128,102,128,16,13,16,172,138,172,183,146,183,173,139,173,160,128,160,177,141,177,178,142,178,178,142,178,180,144,180,177,177,177,179,179,179,181,181,181,178,178,178,180,180,180,176,176,176,132,132,132,5,5,5,16,16,16,16,16,16,162,162,162,178,178,178,174,174,174,176,176,176,175,175,175,177,177,177,176,176,176,176,176,176,176,176,176,165,165,165,134,134,134,122,122,122,15,15,15,164,164,164,174,174,174,165,165,165,152,152,152,168,168,168,169,169,169,169,169,169,169,135,169,172,137,172,171,137,171,171,137,171,169,135,169,170,136,170,131,104,131,24,19,24,5,4,5,15,12,15,15,12,15,153,122,153,168,134,168,164,131,164,166,133,166,166,132,166,167,133,167,167,133,167,166,133,166,166,133,166,155,124,155,127,101,127,115,92,115,15,12,15,163,130,163,161,128,161,157,125,157,150,120,150,158,126,158,156,125,156,159,127,159,159,159,159,162,162,162,161,161,161,161,161,161,159,159,159,160,160,160,123,123,123,22,22,22,4,4,4,14,14,14,14,14,14,144,144,144,158,158,158,154,154,154,156,156,156,155,155,155,156,156,156,156,156,156,156,156,156,154,154,154,139,139,139,84,84,84,98,98,98,54,54,54,152,152,152,150,150,150,147,147,147,140,140,140,148,148,148,146,146,146,149,149,149,148,119,148,255,255,161,255,255,156,255,255,161,255,255,161,255,224,125,175,122,68,255,238,134,255,255,158,158,110,62,255,238,134,12,8,4,71,49,27,33,23,13,255,255,155,255,255,160,255,255,161,255,255,156,255,255,158,247,123,0,244,122,0,244,122,0,249,124,0,249,124,0,252,126,0,252,126,0,244,122,0,249,124,0,242,121,0,242,121,0,229,114,0,43,21,0,45,22,0,63,31,0,89,44,0,109,54,0,89,44,0,89,44,0,56,28,0,94,47,0,137,68,0,30,15,0,5,2,0,28,14,0,71,35,0,130,65,0,51,25,0,53,26,0,56,28,0,86,43,0,51,25,0,38,19,0,7,3,0,0,0,0,5,2,0,10,5,0,45,22,0,229,114,0,247,123,0,247,123,0,252,126,0,249,124,0,247,123,0,252,126,0,237,118,0,244,122,0,237,118,0,129,103,129,97,77,97,23,19,23,14,11,14,10,8,10,79,63,79,127,102,127,128,103,128,123,98,123,128,102,128,129,103,129,129,103,129,129,103,129,128,103,128,120,96,120,98,78,98,89,71,89,11,9,11,119,95,119,127,101,127,120,96,120,111,89,111,122,98,122,124,99,124,123,99,123,124,99,124,123,123,123,124,124,124,125,125,125,124,124,124,125,125,125,122,122,122,92,92,92,3,3,3,11,11,11,11,11,11,112,112,112,123,123,123,121,121,121,122,122,122,122,122,122,123,123,123,122,122,122,122,122,122,122,122,122,114,114,114,93,93,93,85,85,85,11,11,11,114,114,114,121,121,121,115,115,115,106,106,106,117,117,117,118,118,118,118,118,118,119,119,119,120,96,120,120,96,120,120,96,120,118,95,118,119,95,119,91,73,91,16,13,16,3,2,3,10,8,10,10,8,10,108,86,108,118,95,118,116,93,116,117,93,117,117,93,117,118,94,118,118,94,118,117,94,117,117,94,117,110,88,110,90,72,90,81,65,81,10,8,10,115,92,115,114,91,114,112,89,112,107,85,107,113,90,113,111,89,111,114,91,114,113,113,113,116,116,116,116,116,116,115,115,115,114,114,114,115,115,115,88,88,88,16,16,16,3,3,3,10,10,10,10,10,10,104,104,104,114,114,114,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,113,113,113,102,102,102,62,62,62,72,72,72,40,40,40,112,112,112,111,111,111,108,108,108,101,81,101,143,114,143,186,149,186,188,150,188,188,150,188,180,144,180,178,142,178,176,140,176,175,140,175,135,108,135,182,146,182,186,149,186,184,147,184,182,145,182,185,148,185,179,143,179,177,142,177,177,141,177,173,138,173,178,143,178,184,184,184,183,183,183,181,181,181,177,177,177,181,181,181,180,180,180,180,180,180,182,182,182,180,180,180,27,27,27,5,5,5,91,91,91,89,89,89,107,107,107,169,169,169,179,179,179,179,179,179,170,170,170,173,173,173,158,158,158,171,171,171,134,134,134,138,138,138,177,177,177,177,177,177,173,173,173,176,176,176,169,169,169,170,170,170,161,161,161,161,161,161,169,169,169,174,139,174,174,139,174,170,136,170,172,137,172,171,137,171,167,134,167,169,135,169,172,138,172,172,137,172,158,126,158,29,23,29,38,30,38,69,55,69,91,73,91,129,103,129,168,134,168,169,135,169,169,135,169,162,129,162,160,128,160,158,126,158,157,126,157,122,97,122,164,131,164,167,133,167,165,132,165,163,130,163,166,132,166,160,128,160,158,127,158,158,126,158,154,123,154,159,127,159,164,164,164,163,163,163,161,161,161,158,158,158,161,161,161,160,160,160,160,160,160,161,161,161,159,159,159,24,24,24,4,4,4,81,81,81,79,79,79,95,95,95,149,149,149,159,159,159,158,158,158,150,150,150,153,153,153,140,140,140,151,151,151,118,118,118,121,121,121,156,156,156,156,156,156,152,152,152,155,155,155,148,148,148,150,150,150,141,141,141,141,141,141,149,149,149,153,122,153,153,122,153,149,119,149,255,255,160,255,255,156,255,255,156,255,255,161,246,171,96,142,98,55,255,253,142,255,255,160,255,255,145,255,212,119,100,69,39,46,32,17,37,26,14,255,255,160,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,247,123,0,244,122,0,247,123,0,252,126,0,252,126,0,249,124,0,247,123,0,252,126,0,249,124,0,242,121,0,79,39,0,33,16,0,71,35,0,63,31,0,104,52,0,137,68,0,66,33,0,86,43,0,66,33,0,122,61,0,12,6,0,7,3,0,38,19,0,84,42,0,56,28,0,63,31,0,25,12,0,43,21,0,71,35,0,81,40,0,33,16,0,7,3,0,10,5,0,45,22,0,25,12,0,10,5,0,5,2,0,249,124,0,252,126,0,252,126,0,252,126,0,249,124,0,247,123,0,244,122,0,239,119,0,244,122,0,252,126,0,131,105,131,128,102,128,129,103,129,131,105,131,131,105,131,120,96,120,22,18,22,29,23,29,52,42,52,69,55,69,98,78,98,128,102,128,129,103,129,129,103,129,124,99,124,122,98,122,121,96,121,120,96,120,93,74,93,125,100,125,128,102,128,126,101,126,125,100,125,127,101,127,123,98,123,121,97,121,121,97,121,118,95,118,122,98,122,126,126,126,125,125,125,124,124,124,121,121,121,124,124,124,123,123,123,123,123,123,124,124,124,123,123,123,18,18,18,3,3,3,62,62,62,61,61,61,73,73,73,115,115,115,123,123,123,123,123,123,116,116,116,119,119,119,108,108,108,117,117,117,92,92,92,94,94,94,121,121,121,121,121,121,119,119,119,121,121,121,116,116,116,117,117,117,111,111,111,111,111,111,116,116,116,116,116,116,120,96,120,117,94,117,118,95,118,118,94,118,116,92,116,117,93,117,119,95,119,119,95,119,109,87,109,20,16,20,26,21,26,47,38,47,63,50,63,89,71,89,117,93,117,118,94,118,118,94,118,113,90,113,111,89,111,110,88,110,110,88,110,85,68,85,114,91,114,117,93,117,115,92,115,114,91,114,116,93,116,113,90,113,111,89,111,111,89,111,109,87,109,112,90,112,116,116,116,115,115,115,114,114,114,112,112,112,114,114,114,114,114,114,114,114,114,115,115,115,114,114,114,17,17,17,3,3,3,58,58,58,56,56,56,68,68,68,107,107,107,114,114,114,114,114,114,108,108,108,110,110,110,101,101,101,155,124,155,183,147,183,164,131,164,169,135,169,171,137,171,177,141,177,188,150,188,188,150,188,187,150,187,185,148,185,179,143,179,175,140,175,186,149,186,186,186,186,186,186,186,185,185,185,185,185,185,183,183,183,164,164,164,80,80,80,156,156,156,68,68,68,135,135,135,174,174,174,152,152,152,131,131,131,77,77,77,177,177,177,136,136,136,47,47,47,99,99,99,64,64,64,91,91,91,73,73,73,147,147,147,175,175,175,165,165,165,161,161,161,163,163,163,168,168,168,179,179,179,178,178,178,178,178,178,176,176,176,170,170,170,166,166,166,177,177,177,176,141,176,176,141,176,176,141,176,176,140,176,173,139,173,155,124,155,76,60,76,105,84,105,144,115,144,128,102,128,165,132,165,143,115,143,124,99,124,145,116,145,141,113,141,128,103,128,45,36,45,93,74,93,60,48,60,86,69,86,127,102,127,79,63,79,164,131,164,156,124,156,152,121,152,153,123,153,121,96,121,166,133,166,168,134,168,167,134,167,165,132,165,160,128,160,156,125,156,161,129,161,162,130,162,165,165,165,165,165,165,165,165,165,163,163,163,159,159,159,111,111,111,99,99,99,135,135,135,120,120,120,154,154,154,157,157,157,111,111,111,135,135,135,132,132,132,120,120,120,42,42,42,87,87,87,56,56,56,61,61,61,119,119,119,73,73,73,154,154,154,145,145,145,137,137,137,133,133,133,112,112,112,155,155,155,156,156,156,156,156,156,154,154,154,152,152,152,153,153,153,150,150,150,151,151,151,154,123,154,154,123,154,153,123,153,151,121,151,255,255,158,255,255,160,255,255,160,255,255,160,154,107,60,255,255,151,255,177,99,255,255,160,255,255,153,255,255,147,71,49,27,29,20,11,255,244,137,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,244,122,0,244,122,0,247,123,0,247,123,0,252,126,0,252,126,0,247,123,0,214,107,0,147,73,0,20,10,0,28,14,0,15,7,0,66,33,0,68,34,0,114,57,0,38,19,0,79,39,0,71,35,0,114,57,0,12,6,0,10,5,0,33,16,0,96,48,0,33,16,0,94,47,0,33,16,0,112,56,0,30,15,0,22,11,0,96,48,0,122,61,0,53,26,0,33,16,0,12,6,0,28,14,0,10,5,0,221,110,0,252,126,0,249,124,0,242,121,0,242,121,0,244,122,0,252,126,0,234,117,0,247,123,0,133,106,133,133,106,133,131,105,131,131,105,131,117,94,117,57,46,57,112,89,112,49,39,49,106,85,106,127,102,127,108,86,108,93,75,93,55,44,55,126,101,126,38,30,38,84,67,84,70,56,70,45,36,45,65,52,65,52,41,52,105,84,105,124,99,124,111,89,111,115,92,115,116,93,116,120,96,120,127,102,127,127,101,127,127,101,127,125,100,125,121,97,121,118,95,118,126,101,126,126,126,126,126,126,126,125,125,125,125,125,125,124,124,124,111,111,111,54,54,54,105,105,105,46,46,46,91,91,91,118,118,118,102,102,102,88,88,88,52,52,52,119,119,119,92,92,92,32,32,32,67,67,67,43,43,43,62,62,62,49,49,49,100,100,100,118,118,118,112,112,112,109,109,109,110,110,110,114,114,114,121,121,121,121,121,121,121,121,121,119,119,119,115,115,115,113,113,113,120,120,120,117,117,117,120,96,120,120,96,120,119,95,119,118,94,118,106,85,106,51,41,51,72,57,72,98,79,98,87,70,87,112,90,112,98,78,98,85,68,85,99,79,99,96,77,96,88,70,88,31,24,31,64,51,64,41,33,41,59,47,59,87,70,87,54,43,54,113,91,113,107,86,107,105,84,105,106,85,106,83,67,83,115,92,115,116,93,116,116,93,116,115,92,115,111,89,111,109,87,109,112,90,112,113,90,113,115,115,115,115,115,115,115,115,115,114,114,114,111,111,111,78,78,78,69,69,69,95,95,95,84,84,84,109,109,109,111,111,111,78,78,78,96,96,96,152,152,190,152,152,190,147,147,184,142,142,178,134,134,168,132,132,166,146,146,183,146,182,182,146,182,182,145,182,182,144,180,180,143,179,179,143,179,179,146,183,183,147,184,184,144,180,180,144,180,180,147,184,184,144,180,180,143,179,179,125,157,157,113,141,141,86,108,108,101,126,126,135,169,169,136,170,170,142,178,178,136,170,170,142,177,177,140,175,175,137,171,171,139,174,174,141,176,176,139,174,174,140,175,175,140,175,175,144,180,180,142,178,178,139,174,174,135,169,169,127,159,159,131,164,164,143,143,179,138,138,173,138,138,173,142,142,178,136,136,170,136,136,170,136,136,170,138,138,173,137,137,171,136,136,171,136,136,170,139,139,174,137,137,171,135,135,169,118,118,148,107,107,134,92,92,116,95,95,119,127,127,159,128,128,161,134,134,167,128,128,160,133,133,167,132,132,165,124,124,156,131,131,164,132,132,165,131,131,163,132,132,165,132,132,165,135,135,169,134,134,167,131,131,164,126,126,158,119,119,149,123,123,154,134,167,167,131,164,164,129,162,162,133,166,166,127,159,159,130,162,162,127,159,159,129,162,162,128,160,160,129,161,161,127,159,159,130,162,162,128,160,160,120,150,150,110,138,138,100,125,125,86,108,108,97,121,121,119,148,148,120,150,150,125,156,156,124,156,156,124,155,155,123,153,153,116,145,145,125,156,156,123,154,154,122,152,152,123,153,153,122,153,153,126,157,157,124,156,156,121,152,152,117,147,147,110,137,137,114,143,143,124,124,155,121,121,152,120,120,150,123,123,154,118,118,148,120,120,151,255,255,156,255,255,155,255,255,161,255,255,160,225,157,88,255,255,155,255,203,114,255,255,161,255,255,156,255,192,107,142,98,55,87,61,34,255,212,119,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,224,112,0,112,56,0,7,3,0,61,30,0,10,5,0,38,19,0,38,19,0,53,26,0,160,80,0,109,54,0,193,96,0,158,79,0,12,6,0,22,11,0,25,12,0,73,36,0,20,10,0,33,16,0,170,85,0,183,91,0,209,104,0,188,94,0,127,63,0,119,59,0,181,90,0,33,16,0,10,5,0,17,8,0,10,5,0,252,126,0,252,126,0,252,126,0,252,126,0,247,123,0,244,122,0,244,122,0,244,122,0,249,124,0,104,130,130,104,104,130,105,105,131,103,103,129,102,102,128,102,102,127,104,104,130,98,98,123,104,104,131,102,102,128,103,103,129,105,105,131,102,102,127,101,101,127,88,88,111,79,79,99,61,61,76,71,71,89,95,95,119,98,98,123,100,100,125,96,96,120,100,100,125,101,101,126,96,96,121,98,98,123,99,99,124,99,99,124,99,99,124,99,99,123,102,102,127,101,101,127,98,98,123,95,95,119,90,90,112,88,88,111,98,98,122,97,122,122,97,122,122,97,121,121,96,120,120,96,120,120,96,120,120,98,122,122,98,123,123,96,120,120,96,120,120,98,123,123,96,120,120,96,120,120,84,105,105,75,94,94,57,72,72,67,84,84,90,113,113,91,114,114,95,119,119,91,113,113,94,118,118,93,117,117,91,114,114,93,117,117,94,118,118,93,116,116,94,117,117,94,117,117,96,121,121,95,119,119,93,117,117,90,113,113,85,107,107,88,110,110,93,116,116,93,93,116,93,93,116,95,95,119,91,91,114,91,91,114,91,91,114,93,93,116,92,92,115,92,92,115,92,92,115,94,94,117,92,92,116,91,91,114,80,80,100,72,72,90,63,63,78,64,64,81,86,86,108,87,87,109,91,91,114,87,87,109,91,91,113,90,90,112,85,85,106,89,89,112,90,90,113,89,89,112,90,90,113,90,90,113,93,93,116,92,92,115,90,90,112,87,87,109,82,82,103,85,85,106,92,115,115,90,113,113,89,112,112,92,115,115,88,110,110,90,112,112,88,110,110,152,190,190,152,190,190,147,184,184,148,186,186,150,187,187,150,187,187,149,187,187,134,168,168,19,24,24,18,22,22,38,47,47,82,102,102,39,49,49,51,64,64,72,90,90,7,9,9,4,5,5,18,22,22,45,56,56,30,37,37,31,39,39,32,41,41,50,63,63,29,37,37,4,5,5,2,3,3,2,3,3,5,7,7,26,33,33,145,181,181,143,179,179,141,177,177,144,180,180,141,176,176,144,180,180,140,176,176,139,174,174,144,144,181,144,144,180,140,140,175,141,141,176,141,141,176,143,143,179,142,142,177,141,141,177,44,44,55,17,17,21,40,40,50,58,58,73,40,40,50,37,37,46,37,37,46,81,81,101,7,7,8,7,7,8,39,39,49,42,42,53,28,28,35,9,9,12,31,31,38,53,53,66,21,21,26,2,2,3,0,0,0,5,5,6,25,25,31,125,125,156,134,134,168,133,133,166,137,137,171,132,132,165,135,135,169,132,132,165,132,132,165,127,127,159,135,169,169,135,169,169,131,163,163,132,165,165,133,166,166,133,166,166,132,165,165,118,148,148,17,21,21,16,20,20,33,42,42,72,90,90,34,43,43,45,56,56,64,80,80,6,8,8,3,4,4,15,19,19,39,49,49,26,33,33,27,34,34,28,36,36,44,55,55,26,32,32,3,4,4,2,3,3,2,3,3,5,6,6,23,29,29,126,158,158,125,156,156,123,154,154,125,157,157,123,153,153,125,156,156,122,153,153,121,151,151,125,125,157,125,125,157,121,121,151,122,122,153,122,122,152,124,124,155,123,123,153,122,122,153,255,255,160,255,255,161,255,255,161,255,235,132,87,61,34,179,125,70,255,255,153,255,255,161,255,255,156,154,107,60,154,107,60,16,11,6,255,255,156,255,255,161,255,255,161,255,255,158,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,249,124,0,249,124,0,153,76,0,104,52,0,7,3,0,15,7,0,43,21,0,66,33,0,20,10,0,22,11,0,94,47,0,112,56,0,221,110,0,239,119,0,28,14,0,15,7,0,158,79,0,160,80,0,239,119,0,249,124,0,249,124,0,252,126,0,249,124,0,242,121,0,158,79,0,168,84,0,142,71,0,191,95,0,10,5,0,25,12,0,237,118,0,247,123,0,247,123,0,249,124,0,249,124,0,229,114,0,239,119,0,247,123,0,249,124,0,244,122,0,104,131,131,103,129,129,101,126,126,107,107,134,104,104,130,105,105,131,104,104,131,106,106,133,105,105,131,105,105,131,33,33,41,12,12,16,29,29,37,43,43,54,29,29,37,27,27,34,27,27,34,60,60,75,5,5,6,5,5,6,29,29,36,31,31,39,21,21,26,7,7,9,23,23,28,39,39,49,15,15,19,3,3,3,0,0,0,4,4,5,18,18,23,93,93,116,100,100,125,99,99,123,101,101,127,98,98,123,100,100,125,98,98,123,98,98,122,95,95,118,101,126,126,100,126,126,97,122,122,98,123,123,99,124,124,99,124,124,99,123,123,88,111,111,13,16,16,12,15,15,25,31,31,54,67,67,28,35,35,34,42,42,48,60,60,4,6,6,2,3,3,11,14,14,29,37,37,19,24,24,20,26,26,21,27,27,33,42,42,19,24,24,2,3,3,1,2,2,1,2,2,3,4,4,17,22,22,96,120,120,95,118,118,93,117,117,95,119,119,93,117,117,95,119,119,93,116,116,92,115,115,90,112,112,96,96,120,93,93,116,93,93,117,93,93,117,95,95,119,94,94,118,94,94,118,29,29,37,11,11,14,26,26,33,39,39,49,26,26,33,24,24,31,24,24,31,54,54,68,4,4,5,4,4,5,26,26,33,28,28,35,19,19,23,6,6,8,20,20,26,36,36,45,14,14,17,2,2,3,0,0,0,3,3,4,16,16,21,84,84,105,91,91,114,90,90,112,93,93,116,90,90,112,91,91,114,89,89,112,89,89,112,86,86,108,151,189,189,101,127,127,3,3,3,32,40,40,15,19,19,29,36,36,19,24,24,110,137,137,81,101,101,77,97,97,83,104,104,47,59,59,30,38,38,24,30,30,135,168,168,147,183,183,146,183,183,136,170,170,6,7,7,67,84,84,100,126,126,115,144,144,33,41,41,145,181,181,143,179,179,140,175,175,144,181,181,144,180,180,133,167,167,138,172,172,142,178,178,142,177,177,146,146,183,146,146,182,146,146,182,145,145,182,142,142,178,145,145,181,145,145,181,143,143,179,138,138,173,2,2,3,30,30,38,14,14,18,27,27,34,34,34,43,104,104,130,76,76,95,86,86,108,79,79,99,79,79,98,28,28,35,22,22,28,68,68,85,138,138,173,138,138,172,128,128,160,5,5,7,34,34,42,94,94,118,108,108,136,31,31,38,136,136,170,136,136,170,131,131,164,135,135,169,135,135,169,125,125,157,128,128,160,133,133,166,133,133,166,134,134,168,136,171,171,136,170,170,136,170,170,133,166,166,134,168,168,135,169,169,135,169,169,129,162,162,2,3,3,5,6,6,13,16,16,25,32,32,32,40,40,97,121,121,68,85,85,80,100,100,73,92,92,73,92,92,26,33,33,14,18,18,63,79,79,128,161,161,128,160,160,119,148,148,42,52,52,31,39,39,88,110,110,114,142,142,28,36,36,121,151,151,126,158,158,122,152,152,122,152,152,125,157,157,116,145,145,118,148,148,123,154,154,123,154,154,124,155,155,126,126,158,126,126,158,126,126,157,125,125,157,124,124,155,125,125,156,125,125,156,119,119,149,83,83,103,255,255,161,255,255,161,255,255,161,255,255,151,154,107,60,238,165,93,255,255,158,255,255,158,255,255,158,25,17,9,25,17,9,79,55,31,255,255,155,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,242,121,0,211,105,0,99,49,0,20,10,0,28,14,0,35,17,0,33,16,0,12,6,0,51,25,0,214,107,0,234,117,0,252,126,0,252,126,0,249,124,0,252,126,0,249,124,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,249,124,0,181,90,0,17,8,0,114,57,0,247,123,0,249,124,0,244,122,0,242,121,0,232,116,0,247,123,0,242,121,0,239,119,0,249,124,0,105,132,132,101,126,126,102,127,127,105,131,131,104,131,131,107,107,134,107,107,134,107,107,134,107,107,134,105,105,131,107,107,133,106,106,133,105,105,131,70,70,88,4,4,5,22,22,28,20,20,25,20,20,25,13,13,17,54,54,67,56,56,70,54,54,67,58,58,72,32,32,40,11,11,14,16,16,21,93,93,116,101,101,127,101,101,127,33,33,41,4,4,5,46,46,58,69,69,87,80,80,100,96,96,120,100,100,125,99,99,124,97,97,121,100,100,125,98,98,123,92,92,115,95,95,119,98,98,122,98,98,122,101,126,126,100,126,126,100,126,126,100,125,125,98,123,123,100,125,125,100,125,125,99,123,123,66,83,83,2,2,2,21,26,26,10,12,12,19,23,23,13,16,16,72,90,90,53,66,66,50,63,63,54,68,68,30,38,38,19,24,24,15,19,19,88,110,110,96,120,120,95,119,119,88,111,111,3,4,4,44,55,55,65,82,82,75,94,94,21,27,27,95,118,118,94,117,117,92,115,115,94,118,118,94,118,118,87,109,109,90,113,113,93,116,116,93,116,116,94,117,117,95,95,119,95,95,119,95,95,119,93,93,117,95,95,119,95,95,119,94,94,117,91,91,114,1,1,2,20,20,25,9,9,11,18,18,22,22,22,28,68,68,86,50,50,63,57,57,71,52,52,65,52,52,65,19,19,23,15,15,19,45,45,56,92,92,115,91,91,114,85,85,106,3,3,4,22,22,28,63,63,79,72,72,90,20,20,25,91,91,114,91,91,114,88,88,110,12,15,15,41,52,52,81,102,102,134,167,167,151,188,188,152,190,190,152,190,190,150,188,188,104,130,130,118,147,147,81,101,101,132,166,166,64,80,80,143,179,179,138,173,173,106,133,133,148,186,186,150,187,187,145,181,181,145,181,181,143,179,179,135,169,169,144,180,180,144,180,180,132,165,165,131,164,164,136,170,170,148,148,185,147,147,184,147,147,184,147,147,184,147,147,183,144,144,180,146,146,183,146,146,183,146,146,182,146,146,182,144,144,180,142,142,178,117,117,146,51,51,64,11,11,14,64,64,80,77,77,96,142,142,178,142,142,178,143,143,179,143,143,179,141,141,177,98,98,122,111,111,138,108,108,135,125,125,156,93,93,116,134,134,168,120,120,150,100,100,125,139,139,174,140,140,176,136,136,170,136,136,170,134,134,168,132,132,166,135,135,169,132,132,165,123,123,154,130,130,163,127,127,159,138,173,173,138,172,172,138,172,172,137,172,172,137,171,171,134,168,168,137,171,171,136,170,170,136,170,170,136,170,170,134,168,168,130,162,162,109,136,136,47,59,59,10,13,13,59,74,74,71,89,89,132,166,166,133,167,167,133,167,167,133,166,166,131,164,164,81,102,102,103,128,128,100,125,125,116,145,145,86,108,108,124,156,156,111,139,139,125,157,157,129,161,161,127,159,159,126,157,157,124,155,155,124,155,155,122,153,153,125,156,156,122,153,153,114,143,143,120,150,150,117,147,147,127,127,159,127,127,159,127,127,159,127,127,158,126,126,158,125,125,156,126,126,157,126,126,157,125,125,157,125,125,156,124,124,155,255,255,155,255,255,161,255,255,160,255,255,151,41,29,16,255,255,158,255,255,160,255,255,153,221,154,86,29,20,11,16,11,6,37,26,14,255,255,161,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,247,123,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,186,93,0,86,43,0,28,14,0,7,3,0,38,19,0,28,14,0,22,11,0,224,112,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,247,123,0,249,124,0,247,123,0,160,80,0,22,11,0,237,118,0,249,124,0,247,123,0,239,119,0,221,110,0,232,116,0,244,122,0,239,119,0,244,122,0,252,126,0,99,124,124,103,129,129,105,132,132,103,129,129,96,120,120,102,127,127,104,130,130,108,108,135,108,108,135,107,107,134,107,107,134,105,105,131,106,106,132,107,107,133,106,106,133,106,106,133,106,106,133,104,104,130,101,101,127,31,31,38,8,8,10,28,28,35,56,56,70,92,92,115,103,103,129,104,104,131,104,104,130,104,104,130,71,71,89,64,64,80,55,55,69,91,91,114,43,43,54,98,98,122,94,94,118,72,72,91,98,98,123,102,102,128,100,100,125,99,99,124,98,98,122,92,92,116,98,98,123,98,98,123,90,90,112,90,90,112,93,93,116,97,97,121,101,126,126,100,126,126,100,126,126,100,125,125,98,123,123,99,124,124,100,125,125,100,125,125,99,124,124,98,123,123,97,122,122,80,100,100,29,36,36,8,10,10,27,33,33,53,66,66,86,108,108,97,122,122,98,123,123,98,123,123,97,121,121,67,84,84,76,95,95,52,65,65,86,107,107,41,51,51,92,115,115,89,112,112,68,86,86,96,120,120,97,121,121,94,117,117,93,117,117,92,116,116,87,109,109,93,117,117,93,116,116,85,107,107,85,106,106,88,110,110,92,115,115,95,95,119,95,95,119,95,95,119,95,95,119,93,93,116,95,95,119,95,95,119,95,95,119,95,95,118,94,94,117,93,93,116,76,76,95,33,33,41,7,7,9,42,42,52,50,50,63,93,93,116,93,93,116,94,94,117,94,94,117,93,93,116,64,64,80,72,72,91,71,71,88,82,82,102,61,61,76,88,88,110,107,134,134,119,149,149,151,189,189,151,189,189,153,191,191,151,189,189,143,179,179,57,71,71,113,142,142,89,111,111,52,65,65,150,187,187,151,189,189,151,189,189,148,185,185,150,188,188,146,182,182,149,186,186,148,186,186,147,183,183,148,185,185,148,185,185,149,149,186,149,149,186,149,149,186,148,148,186,148,148,185,148,148,185,148,148,185,148,148,185,147,147,184,147,147,184,144,144,180,25,25,31,35,35,44,143,143,179,145,145,181,11,11,14,2,2,3,30,30,38,11,11,14,101,101,126,108,108,135,112,112,140,127,127,159,143,143,178,144,144,180,142,142,178,142,142,178,53,53,67,10,10,12,107,107,133,59,59,73,49,49,61,142,142,178,142,142,177,140,140,175,138,138,173,137,137,171,136,136,171,139,139,174,139,139,174,137,137,172,138,138,173,140,140,175,139,174,174,139,174,174,139,174,174,139,173,173,138,173,173,138,173,173,138,172,172,138,172,172,137,172,172,134,168,168,110,138,138,33,41,41,114,143,143,135,168,168,92,115,115,10,13,13,1,1,1,28,35,35,32,40,40,94,117,117,93,117,117,104,130,130,132,166,166,132,165,165,133,167,167,132,165,165,125,156,156,49,62,62,99,123,123,77,96,96,45,56,56,130,163,163,131,164,164,131,164,164,128,160,160,130,163,163,126,158,158,129,161,161,128,160,160,127,159,159,128,160,160,127,159,159,129,129,161,128,128,160,128,128,160,128,128,160,127,127,159,127,127,159,127,127,159,127,127,158,126,126,158,126,126,158,123,123,154,21,21,27,255,255,153,255,255,147,255,255,161,255,255,158,255,255,148,25,17,9,255,255,161,255,255,160,255,238,134,255,180,101,58,40,22,75,52,29,16,11,6,255,255,161,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,168,84,0,22,11,0,10,5,0,5,2,0,43,21,0,63,31,0,43,21,0,206,103,0,244,122,0,252,126,0,252,126,0,249,124,0,249,124,0,249,124,0,249,124,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,237,118,0,38,19,0,22,11,0,68,34,0,84,42,0,196,98,0,249,124,0,252,126,0,244,122,0,247,123,0,247,123,0,229,114,0,234,117,0,244,122,0,244,122,0,247,123,0,108,135,135,110,137,137,106,133,133,108,135,135,108,135,135,106,133,133,107,134,134,107,134,134,108,135,135,108,108,135,108,108,135,108,108,135,107,107,134,107,107,134,107,107,134,107,107,134,107,107,133,106,106,133,104,104,130,18,18,22,25,25,32,103,103,129,104,104,131,8,8,10,2,2,2,22,22,27,8,8,10,73,73,91,78,78,97,81,81,101,91,91,114,103,103,129,104,104,130,102,102,128,102,102,128,38,38,48,7,7,9,77,77,96,42,42,53,35,35,44,102,102,128,102,102,128,101,101,126,100,100,125,99,99,123,98,98,123,100,100,126,100,100,125,99,99,124,100,100,125,101,101,126,101,126,126,101,126,126,100,126,126,100,125,125,100,125,125,100,125,125,100,125,125,100,125,125,100,125,125,97,122,122,80,100,100,24,30,30,83,104,104,98,122,122,67,83,83,8,10,10,1,1,1,20,26,26,23,29,29,68,85,85,68,85,85,76,95,95,97,121,121,97,121,121,98,122,122,96,121,121,91,114,114,36,45,45,72,91,91,57,71,71,33,41,41,96,120,120,97,121,121,96,121,121,94,118,118,96,120,120,93,117,117,95,119,119,95,119,119,94,117,117,95,119,119,95,118,118,95,119,119,95,95,119,95,95,119,95,95,119,95,95,119,95,95,119,95,95,119,95,95,119,95,95,118,95,95,118,93,93,116,16,16,20,22,22,28,92,92,116,93,93,117,7,7,9,1,1,2,20,20,25,7,7,9,65,65,82,70,70,87,73,73,91,82,82,103,40,50,50,146,182,182,147,184,184,147,184,184,139,174,174,139,174,174,109,137,137,149,187,187,152,190,190,152,190,190,152,190,190,152,190,190,148,186,186,148,185,185,151,189,189,148,185,185,151,188,188,150,150,188,150,150,188,150,150,188,150,150,187,150,150,187,149,149,187,149,149,187,149,149,186,123,123,154,100,100,126,126,126,157,39,39,48,135,135,168,116,116,146,140,140,175,143,143,179,134,134,167,114,114,143,142,142,178,65,65,81,13,13,16,39,39,49,51,51,64,35,35,44,26,26,33,82,82,103,64,64,80,38,38,47,68,68,86,138,138,173,132,132,166,131,131,164,131,131,163,103,103,128,140,140,175,143,143,179,143,143,178,142,142,178,142,142,178,139,139,174,139,139,174,142,142,177,131,131,164,141,141,176,139,139,174,141,176,176,140,176,176,140,175,175,140,175,175,140,175,175,139,174,174,139,174,174,115,144,144,94,117,117,117,147,147,36,45,45,96,120,120,108,136,136,130,163,163,133,166,166,124,156,156,106,133,133,132,165,165,129,162,162,12,15,15,37,46,46,48,60,60,32,41,41,30,37,37,76,95,95,111,139,139,35,44,44,63,79,79,128,160,160,122,153,153,128,160,160,121,151,151,107,134,134,130,162,162,132,165,165,132,165,165,131,164,164,131,164,164,128,161,161,129,162,162,130,163,163,121,151,151,130,163,163,128,161,161,129,129,162,129,129,162,129,129,161,129,129,161,128,128,161,128,128,160,128,128,160,120,120,150,86,86,108,72,72,90,33,33,41,88,88,110,99,99,124,255,255,155,255,255,148,255,255,158,255,206,116,255,255,151,150,104,58,255,255,151,255,218,122,255,244,137,104,72,40,146,101,57,255,192,107,255,255,158,255,255,160,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,247,123,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,214,107,0,35,17,0,45,22,0,7,3,0,22,11,0,20,10,0,22,11,0,153,76,0,247,123,0,252,126,0,165,82,0,94,47,0,71,35,0,124,62,0,104,52,0,173,86,0,247,123,0,252,126,0,247,123,0,247,123,0,81,40,0,10,5,0,114,57,0,170,85,0,221,110,0,56,28,0,244,122,0,244,122,0,237,118,0,237,118,0,234,117,0,239,119,0,234,117,0,244,122,0,244,122,0,239,119,0,247,123,0,110,138,138,110,138,138,110,138,138,110,137,137,110,137,137,108,135,135,107,134,134,101,127,127,106,133,133,107,134,134,108,108,135,108,108,135,108,108,135,108,108,135,108,108,135,107,107,134,107,107,134,100,100,126,88,88,111,60,60,75,90,90,113,74,74,92,96,96,121,100,100,126,102,102,128,102,102,128,69,69,86,82,82,102,100,100,125,46,46,58,28,28,35,5,5,6,37,37,46,23,23,29,18,18,23,86,86,107,46,46,57,27,27,34,98,98,123,99,99,124,99,99,124,93,93,117,83,83,104,73,73,92,100,100,125,102,102,128,102,102,128,102,102,127,102,102,127,100,100,126,99,99,124,101,101,127,99,99,124,101,101,126,101,126,126,101,126,126,101,126,126,100,126,126,100,125,125,100,125,125,100,125,125,94,117,117,82,103,103,56,70,70,84,105,105,26,32,32,90,113,113,78,98,98,96,120,120,96,120,120,65,81,81,77,96,96,95,119,119,43,54,54,8,11,11,4,6,6,34,43,43,21,27,27,17,22,22,55,69,69,43,54,54,25,32,32,92,115,115,93,117,117,93,116,116,88,110,110,88,110,110,69,87,87,95,118,118,96,121,121,96,120,120,96,120,120,96,120,120,94,118,118,94,118,118,96,120,120,94,117,117,96,120,120,94,118,118,95,95,119,95,95,119,95,95,119,95,95,119,95,95,119,95,95,119,95,95,119,78,78,98,64,64,80,80,80,100,24,24,31,86,86,107,74,74,93,89,89,112,91,91,114,85,85,107,73,73,91,96,121,121,146,183,183,149,186,186,147,184,184,107,134,134,79,98,98,110,137,137,109,137,137,140,175,175,142,177,177,149,187,187,149,186,186,136,136,171,79,79,99,82,82,103,82,82,103,143,143,179,128,128,160,138,138,173,140,140,175,144,144,180,146,146,182,135,135,169,138,138,172,109,109,136,134,134,168,86,86,107,66,66,82,61,61,77,100,100,126,121,121,152,135,135,168,142,142,177,143,143,179,143,143,179,141,141,177,131,131,163,117,117,146,89,89,111,136,136,170,137,137,172,144,144,181,126,126,158,88,88,110,142,142,178,136,136,170,90,90,113,142,142,177,140,140,175,138,138,173,100,100,125,74,74,92,103,103,129,103,103,128,131,131,164,133,133,166,140,140,175,139,139,174,128,160,160,74,93,93,77,96,96,77,96,96,134,168,168,137,171,171,129,162,162,130,163,163,133,166,166,136,170,170,125,157,157,128,160,160,101,126,126,63,79,79,80,100,100,61,77,77,112,140,140,93,117,117,113,141,141,125,156,156,132,165,165,124,156,156,133,166,166,131,164,164,124,155,155,108,136,136,82,103,103,126,157,157,127,159,159,134,167,167,117,146,146,81,102,102,131,164,164,126,157,157,83,104,104,131,163,163,129,161,161,123,154,154,92,115,115,68,85,85,120,150,150,94,118,118,121,151,151,122,153,153,128,161,161,129,162,162,117,117,147,68,68,85,52,52,65,71,71,88,123,123,154,125,125,157,118,118,148,123,123,154,122,122,153,124,124,155,85,85,107,117,117,147,93,93,116,58,58,72,73,73,91,52,52,65,154,107,60,163,113,63,246,171,96,255,255,148,100,69,39,255,194,109,225,157,88,255,177,99,167,116,65,117,81,45,255,255,153,255,255,161,255,255,158,255,255,160,255,255,158,255,255,161,247,123,0,247,123,0,252,126,0,249,124,0,252,126,0,252,126,0,249,124,0,249,124,0,252,126,0,252,126,0,244,122,0,198,99,0,17,8,0,17,8,0,22,11,0,56,28,0,17,8,0,7,3,0,183,91,0,130,65,0,135,67,0,153,76,0,140,70,0,140,70,0,79,39,0,28,14,0,107,53,0,117,58,0,229,114,0,242,121,0,84,42,0,17,8,0,122,61,0,130,65,0,94,47,0,127,63,0,119,59,0,244,122,0,242,121,0,229,114,0,224,112,0,232,116,0,232,116,0,239,119,0,244,122,0,239,119,0,234,117,0,69,87,87,105,132,132,108,136,136,106,133,133,102,128,128,77,96,96,79,98,98,100,125,125,101,126,126,102,127,127,101,127,127,107,133,133,108,135,135,97,97,122,59,59,74,43,43,54,102,102,128,91,91,114,104,104,130,100,100,125,103,103,129,102,102,127,96,96,120,71,71,89,77,77,97,95,95,119,48,48,60,47,47,59,43,43,54,85,85,107,86,86,108,102,102,128,101,101,126,102,102,127,95,95,119,100,100,125,93,93,116,95,95,118,63,63,79,47,47,59,97,97,122,102,102,128,102,102,128,62,62,78,101,101,126,101,101,126,64,64,80,97,97,122,99,99,124,98,98,123,95,95,119,52,52,65,73,73,91,92,92,116,93,93,117,94,94,118,99,99,124,99,99,124,100,100,125,53,66,66,55,68,68,40,50,50,95,119,119,85,106,106,92,115,115,93,116,116,96,120,120,97,121,121,89,112,112,66,83,83,72,90,90,89,111,111,57,71,71,44,55,55,41,51,51,67,83,83,81,101,101,95,119,119,94,118,118,95,119,119,95,119,119,94,118,118,87,109,109,78,97,97,59,74,74,44,55,55,91,114,114,96,120,120,84,105,105,59,73,73,95,119,119,91,114,114,60,76,76,92,115,115,93,117,117,92,116,116,67,84,84,49,62,62,69,86,86,69,86,86,88,110,110,89,111,111,94,117,117,94,117,117,94,118,118,50,50,62,52,52,65,52,52,65,90,90,113,80,80,101,87,87,109,88,88,110,91,91,114,92,92,115,85,85,106,87,87,109,68,68,86,191,191,191,189,189,189,187,187,187,187,187,187,183,183,183,182,182,182,180,180,180,192,153,192,188,150,188,189,151,189,187,150,187,185,148,185,185,148,185,184,147,184,184,147,184,184,147,184,180,144,180,187,150,187,183,147,183,183,146,183,189,151,189,184,147,184,182,146,182,165,132,165,75,60,75,73,59,73,49,39,49,15,12,15,30,24,30,24,19,24,15,12,15,43,34,43,118,94,118,86,69,86,56,44,56,173,139,173,170,136,170,175,140,175,182,146,182,182,145,182,183,147,183,176,140,176,172,137,172,175,140,175,177,141,177,176,141,176,182,145,182,180,144,180,177,142,177,177,142,177,175,140,175,168,134,168,171,137,171,169,135,169,170,136,170,179,179,179,175,175,175,175,175,175,173,173,173,173,173,173,172,172,172,170,170,170,172,172,172,168,168,168,173,173,173,174,174,174,171,171,171,174,174,174,175,175,175,170,170,170,171,171,171,153,153,153,68,68,68,73,73,73,45,45,45,28,28,28,7,7,7,22,22,22,40,40,40,113,113,113,109,109,109,52,52,52,93,93,93,160,160,160,162,162,162,167,167,167,168,168,168,169,169,169,166,166,166,162,162,162,162,162,162,163,163,163,163,163,163,168,168,168,167,167,167,165,165,165,163,163,163,161,161,161,161,161,161,157,157,157,157,157,157,155,155,155,165,132,165,161,129,161,162,130,162,160,128,160,158,127,158,158,126,158,158,126,158,157,126,157,157,126,157,154,123,154,160,128,160,156,125,156,156,125,156,160,128,160,157,125,157,155,124,155,140,112,140,64,51,64,255,180,101,217,151,84,255,244,137,255,255,148,163,113,63,138,96,53,175,122,68,255,212,119,255,189,106,37,26,14,255,255,160,255,255,161,255,255,160,255,255,158,255,255,156,255,255,161,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,252,126,0,252,126,0,249,124,0,242,121,0,168,84,0,5,2,0,53,26,0,25,12,0,48,24,0,43,21,0,81,40,0,153,76,0,175,87,0,209,104,0,214,107,0,178,89,0,153,76,0,168,84,0,160,80,0,168,84,0,89,44,0,196,98,0,155,77,0,76,38,0,66,33,0,15,7,0,175,87,0,109,54,0,140,70,0,244,122,0,247,123,0,239,119,0,224,112,0,224,112,0,232,116,0,229,114,0,242,121,0,229,114,0,229,114,0,244,122,0,137,137,137,134,134,134,134,134,134,135,135,135,135,135,135,138,138,138,138,138,138,137,137,137,135,135,135,133,133,133,133,133,133,130,130,130,130,130,130,128,128,128,136,109,136,133,106,133,134,107,134,133,106,133,131,105,131,131,105,131,131,104,131,130,104,130,130,104,130,127,102,127,132,106,132,130,104,130,129,103,129,133,106,133,130,104,130,129,103,129,116,93,116,53,42,53,52,41,52,34,27,34,10,8,10,21,17,21,17,13,17,10,8,10,30,24,30,83,66,83,60,48,60,39,31,39,122,98,122,119,95,119,123,98,123,128,102,128,128,102,128,129,103,129,124,99,124,121,96,121,123,98,123,124,99,124,124,99,124,128,102,128,126,101,126,125,100,125,125,100,125,123,98,123,118,94,118,120,96,120,119,95,119,120,96,120,126,126,126,123,123,123,123,123,123,122,122,122,122,122,122,122,122,122,120,120,120,121,121,121,119,119,119,122,122,122,123,123,123,121,121,121,123,123,123,124,124,124,120,120,120,121,121,121,109,109,109,48,48,48,52,52,52,32,32,32,19,19,19,4,4,4,16,16,16,28,28,28,80,80,80,78,78,78,37,37,37,66,66,66,114,114,114,115,115,115,119,119,119,120,120,120,121,121,121,119,119,119,116,116,116,116,116,116,117,117,117,117,117,117,120,120,120,120,120,120,119,119,119,118,118,118,116,116,116,116,116,116,114,114,114,114,114,114,112,112,112,113,113,113,117,93,117,118,94,118,117,93,117,115,92,115,115,92,115,115,92,115,115,92,115,184,184,184,186,186,186,189,151,189,187,150,187,187,149,187,183,146,183,187,149,187,186,149,186,186,149,186,188,150,188,186,148,186,185,148,185,183,147,183,81,64,81,17,13,17,46,37,46,82,66,82,26,21,26,36,29,36,57,46,57,44,35,44,49,39,49,21,16,21,5,4,5,7,6,7,5,4,5,76,60,76,13,10,13,11,9,11,39,31,39,34,27,34,43,34,43,101,81,101,116,93,116,13,10,13,3,3,3,7,5,7,5,4,5,147,118,147,180,144,180,184,147,184,182,145,182,178,142,178,176,140,176,174,139,174,175,140,175,179,143,179,180,144,180,176,141,176,172,138,172,174,139,174,175,140,175,175,175,175,175,175,175,171,171,171,174,174,174,174,174,174,174,174,174,175,175,175,173,173,173,173,173,173,171,171,171,176,176,176,16,16,16,43,43,43,77,77,77,25,25,25,33,33,33,53,53,53,94,94,94,46,46,46,19,19,19,5,5,5,3,3,3,5,5,5,70,70,70,24,24,24,10,10,10,36,36,36,31,31,31,17,17,17,94,94,94,107,107,107,109,109,109,3,3,3,6,6,6,5,5,5,25,25,25,166,166,166,169,169,169,167,167,167,164,164,164,162,162,162,160,160,160,149,149,149,164,164,164,166,166,166,162,162,162,158,158,158,160,160,160,161,161,161,162,130,162,160,128,160,157,125,157,160,128,160,159,127,159,159,127,159,160,128,160,158,127,158,158,126,158,156,125,156,161,129,161,68,55,68,39,31,39,70,56,70,31,24,31,30,24,30,48,39,48,86,68,86,37,29,37,255,194,109,255,255,158,255,255,153,255,255,155,104,72,40,33,23,13,25,17,9,96,66,37,25,17,9,62,43,24,255,255,161,255,255,161,255,255,161,255,255,161,255,255,155,255,255,161,252,126,0,252,126,0,252,126,0,247,123,0,249,124,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,247,123,0,175,87,0,48,24,0,10,5,0,7,3,0,51,25,0,89,44,0,107,53,0,204,102,0,186,93,0,175,87,0,94,47,0,96,48,0,17,8,0,158,79,0,234,117,0,226,113,0,201,100,0,244,122,0,237,118,0,201,100,0,102,51,0,63,31,0,117,58,0,242,121,0,232,116,0,244,122,0,244,122,0,247,123,0,226,113,0,239,119,0,244,122,0,226,113,0,219,109,0,211,105,0,237,118,0,242,121,0,2,2,2,4,4,4,21,21,21,111,111,111,139,139,139,138,138,138,138,138,138,134,134,134,131,131,131,123,123,123,132,132,132,136,136,136,133,133,133,133,133,133,130,130,130,133,133,133,134,107,134,132,106,132,132,105,132,132,105,132,131,105,131,131,105,131,132,106,132,131,104,131,130,104,130,130,104,130,133,106,133,57,45,57,12,9,12,58,46,58,25,20,25,18,15,18,25,20,25,71,56,71,30,24,30,34,27,34,4,3,4,2,2,2,5,4,5,3,3,3,18,14,18,9,7,9,7,6,7,23,19,23,13,10,13,30,24,30,71,56,71,82,66,82,9,7,9,2,2,2,5,4,5,19,15,19,103,82,103,126,101,126,127,101,127,127,101,127,124,99,124,123,98,123,113,91,113,122,98,122,125,100,125,123,98,123,123,98,123,120,96,120,121,97,121,124,124,124,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,121,121,121,121,121,121,121,121,121,121,121,121,123,123,123,53,53,53,11,11,11,30,30,30,23,23,23,17,17,17,23,23,23,37,37,37,28,28,28,32,32,32,13,13,13,2,2,2,4,4,4,3,3,3,49,49,49,8,8,8,7,7,7,26,26,26,12,12,12,28,28,28,66,66,66,76,76,76,8,8,8,2,2,2,4,4,4,18,18,18,96,96,96,118,118,118,121,121,121,119,119,119,117,117,117,115,115,115,107,107,107,115,115,115,117,117,117,119,119,119,116,116,116,113,113,113,115,115,115,116,116,116,116,92,116,115,92,115,194,155,194,194,155,194,194,155,194,194,155,194,191,153,191,191,153,191,158,126,158,117,93,117,79,63,79,5,4,5,13,10,13,44,35,44,27,21,27,23,18,23,121,97,121,83,66,83,75,60,75,146,117,146,9,7,9,15,12,15,17,13,17,19,15,19,55,44,55,32,26,32,24,19,24,43,35,43,55,44,55,24,19,24,49,39,49,72,57,72,68,54,68,39,31,39,24,19,24,22,18,22,9,7,9,11,9,11,7,6,7,163,130,163,185,148,185,183,146,183,181,145,181,177,141,177,173,138,173,178,142,178,178,142,178,174,139,174,161,128,161,177,142,177,182,182,182,182,182,182,182,182,182,182,182,182,181,181,181,181,181,181,181,181,181,179,179,179,178,178,178,147,147,147,109,109,109,74,74,74,19,19,19,12,12,12,41,41,41,25,25,25,37,37,37,113,113,113,77,77,77,69,69,69,135,135,135,8,8,8,14,14,14,16,16,16,17,17,17,14,14,14,30,30,30,22,22,22,40,40,40,12,12,12,22,22,22,45,45,45,66,66,66,83,83,83,36,36,36,22,22,22,20,20,20,19,19,19,10,10,10,6,6,6,150,150,150,170,170,170,168,168,168,166,166,166,162,162,162,159,159,159,163,163,163,163,163,163,159,159,159,147,147,147,167,167,167,167,134,167,167,133,167,166,133,166,166,133,166,166,132,166,165,132,165,165,132,165,163,130,163,163,130,163,134,107,134,99,79,99,4,3,4,18,14,18,11,9,11,37,30,37,19,15,19,34,27,34,103,82,103,70,56,70,63,50,63,100,80,100,8,6,8,255,255,161,255,229,129,255,255,143,255,238,134,37,26,14,41,29,16,87,61,34,29,20,11,158,110,62,255,255,161,255,255,161,255,255,160,255,255,160,255,255,155,255,255,160,252,126,0,249,124,0,244,122,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,249,124,0,249,124,0,242,121,0,22,11,0,30,15,0,7,3,0,2,1,0,61,30,0,28,14,0,109,54,0,168,84,0,252,126,0,244,122,0,191,95,0,112,56,0,127,63,0,181,90,0,247,123,0,244,122,0,175,87,0,237,118,0,249,124,0,206,103,0,244,122,0,242,121,0,239,119,0,158,79,0,234,117,0,244,122,0,234,117,0,226,113,0,221,110,0,242,121,0,244,122,0,229,114,0,234,117,0,224,112,0,229,114,0,51,51,51,68,68,68,30,30,30,18,18,18,7,7,7,15,15,15,8,8,8,5,5,5,139,139,139,139,139,139,138,138,138,136,136,136,130,130,130,131,131,131,134,134,134,133,133,133,121,121,121,133,133,133,137,137,137,137,109,137,136,109,136,136,109,136,136,109,136,136,108,136,136,108,136,134,107,134,134,107,134,133,107,133,110,88,110,55,44,55,4,3,4,14,11,14,9,7,9,18,15,18,16,12,16,28,22,28,84,67,84,52,41,52,101,81,101,83,66,83,6,5,6,12,9,12,13,10,13,38,30,38,10,8,10,17,13,17,30,24,30,38,30,38,9,7,9,34,27,34,50,40,50,47,37,47,63,50,63,27,22,27,15,12,15,6,5,6,14,11,14,7,6,7,113,90,113,128,102,128,128,102,128,127,101,127,122,98,122,120,96,120,121,97,121,123,98,123,121,96,121,111,89,111,123,98,123,126,101,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,125,125,125,124,124,124,124,124,124,124,124,124,75,75,75,51,51,51,3,3,3,13,13,13,28,28,28,17,17,17,15,15,15,26,26,26,53,53,53,48,48,48,95,95,95,77,77,77,9,9,9,11,11,11,12,12,12,36,36,36,21,21,21,16,16,16,28,28,28,35,35,35,8,8,8,32,32,32,46,46,46,44,44,44,59,59,59,15,15,15,14,14,14,6,6,6,13,13,13,4,4,4,106,106,106,120,120,120,120,120,120,118,118,118,115,115,115,113,113,113,114,114,114,116,116,116,114,114,114,195,156,195,194,155,194,149,119,149,143,114,143,27,21,27,35,28,35,5,4,5,17,14,17,15,12,15,17,14,17,116,93,116,175,140,175,192,154,192,190,152,190,188,150,188,182,145,182,189,151,189,189,151,189,189,151,189,190,152,190,190,152,190,190,152,190,190,152,190,189,151,189,189,151,189,187,150,187,177,142,177,145,116,145,102,82,102,131,105,131,119,95,119,17,13,17,176,141,176,185,148,185,187,149,187,183,146,183,177,141,177,163,131,163,171,136,171,180,144,180,179,143,179,181,145,181,181,145,181,181,144,181,182,146,182,180,180,180,180,180,180,181,181,181,183,183,183,183,183,183,182,182,182,180,180,180,182,182,182,182,182,182,178,178,178,139,139,139,133,133,133,32,32,32,5,5,5,20,20,20,16,16,16,14,14,14,108,108,108,162,162,162,175,175,175,178,178,178,176,176,176,169,169,169,175,175,175,175,175,175,175,175,175,175,175,175,176,176,176,176,176,176,175,175,175,175,175,175,175,175,175,173,173,173,164,164,164,156,156,156,133,133,133,94,94,94,110,110,110,15,15,15,61,61,61,162,162,162,170,170,170,168,168,168,163,163,163,164,164,164,150,150,150,156,156,156,165,165,165,166,166,166,162,162,162,166,166,166,165,165,165,165,132,165,165,132,165,168,134,168,166,132,166,167,134,167,167,133,167,165,132,165,164,131,164,166,133,166,165,132,165,127,101,127,121,97,121,23,18,23,29,23,29,4,3,4,14,11,14,13,10,13,14,11,14,98,79,98,148,118,148,162,129,162,160,128,160,158,126,158,153,122,153,255,255,160,255,255,158,255,255,153,158,110,62,71,49,27,12,8,4,37,26,14,87,61,34,83,58,32,255,255,161,255,255,161,255,255,161,255,255,161,255,255,160,252,126,0,252,126,0,247,123,0,242,121,0,249,124,0,252,126,0,249,124,0,252,126,0,252,126,0,249,124,0,244,122,0,102,51,0,38,19,0,10,5,0,0,0,0,15,7,0,20,10,0,91,45,0,107,53,0,221,110,0,252,126,0,249,124,0,232,116,0,239,119,0,244,122,0,247,123,0,252,126,0,242,121,0,191,95,0,196,98,0,211,105,0,239,119,0,249,124,0,234,117,0,221,110,0,196,98,0,249,124,0,244,122,0,232,116,0,226,113,0,242,121,0,234,117,0,242,121,0,237,118,0,239,119,0,226,113,0,226,113,0,142,142,142,133,133,133,127,127,127,109,109,109,77,77,77,90,90,90,12,12,12,49,49,49,132,132,132,138,138,138,140,140,140,132,132,132,134,134,134,122,122,122,127,127,127,134,134,134,135,135,135,132,132,132,135,135,135,135,135,135,136,136,136,134,107,134,137,109,137,135,108,135,136,109,136,136,109,136,134,107,134,134,107,134,135,108,135,135,108,135,132,106,132,99,79,99,19,15,19,24,19,24,4,3,4,14,11,14,10,8,10,12,9,12,80,64,80,121,96,121,130,104,130,131,105,131,130,104,130,125,100,125,130,104,130,130,104,130,130,104,130,131,105,131,131,105,131,131,105,131,131,104,131,130,104,130,130,104,130,129,103,129,122,97,122,116,93,116,70,56,70,90,72,90,82,65,82,11,9,11,45,36,45,127,102,127,128,103,128,126,100,126,121,97,121,123,98,123,117,94,117,124,99,124,123,99,123,124,99,124,122,97,122,124,99,124,125,100,125,124,124,124,124,124,124,126,126,126,126,126,126,126,126,126,126,126,126,124,124,124,124,124,124,125,125,125,122,122,122,96,96,96,92,92,92,17,17,17,3,3,3,13,13,13,11,11,11,10,10,10,11,11,11,112,112,112,121,121,121,123,123,123,122,122,122,120,120,120,122,122,122,121,121,121,121,121,121,121,121,121,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,114,114,114,109,109,109,93,93,93,66,66,66,84,84,84,11,11,11,42,42,42,113,113,113,119,119,119,120,120,120,114,114,114,115,115,115,7,6,7,0,0,0,5,4,5,17,14,17,9,7,9,41,33,41,129,103,129,178,142,178,193,155,193,187,150,187,146,117,146,64,51,64,97,77,97,153,123,153,173,138,173,172,138,172,182,145,182,153,122,153,185,148,185,179,143,179,152,122,152,117,94,117,77,61,77,48,38,48,88,70,88,176,141,176,113,90,113,132,105,132,183,146,183,185,148,185,179,143,179,167,134,167,169,135,169,167,133,167,172,138,172,174,139,174,170,136,170,183,146,183,182,146,182,177,141,177,176,141,176,180,144,180,185,185,185,183,183,183,177,177,177,181,181,181,182,182,182,180,180,180,180,180,180,183,183,183,181,181,181,177,177,177,179,179,179,73,73,73,27,27,27,0,0,0,5,5,5,16,16,16,9,9,9,38,38,38,78,78,78,165,165,165,180,180,180,174,174,174,136,136,136,59,59,59,79,79,79,142,142,142,160,160,160,160,160,160,168,168,168,141,141,141,121,121,121,166,166,166,140,140,140,108,108,108,71,71,71,44,44,44,83,83,83,162,162,162,104,104,104,121,121,121,168,168,168,170,170,170,171,171,171,164,164,164,155,155,155,153,153,153,158,158,158,159,159,159,156,156,156,164,164,164,167,167,167,162,162,162,161,161,161,165,165,165,169,135,169,169,135,169,162,129,162,165,132,165,166,133,166,164,131,164,164,131,164,167,134,167,165,132,165,161,129,161,163,130,163,67,53,67,25,20,25,6,5,6,5,4,5,15,12,15,8,6,8,34,27,34,71,57,71,109,87,109,163,130,163,158,126,158,123,98,123,54,43,54,72,57,72,255,255,156,255,255,155,255,250,140,255,215,120,146,101,57,37,26,14,12,8,4,255,255,160,25,17,9,255,255,161,255,255,161,255,255,158,255,255,161,255,255,160,252,126,0,252,126,0,249,124,0,242,121,0,247,123,0,252,126,0,252,126,0,252,126,0,252,126,0,247,123,0,247,123,0,142,71,0,102,51,0,25,12,0,10,5,0,17,8,0,22,11,0,66,33,0,94,47,0,178,89,0,224,112,0,244,122,0,242,121,0,239,119,0,249,124,0,252,126,0,249,124,0,242,121,0,209,104,0,226,113,0,226,113,0,239,119,0,239,119,0,221,110,0,122,61,0,216,108,0,252,126,0,244,122,0,244,122,0,242,121,0,229,114,0,239,119,0,244,122,0,224,112,0,234,117,0,242,121,0,237,118,0,134,134,134,114,114,114,57,57,57,36,36,36,67,67,67,66,66,66,131,131,131,84,84,84,137,137,137,138,138,138,139,139,139,133,133,133,124,124,124,125,125,125,128,128,128,129,129,129,126,126,126,133,133,133,136,136,136,135,135,135,131,131,131,133,133,133,137,110,137,137,110,137,136,108,136,131,105,131,135,108,135,133,107,133,133,106,133,136,108,136,136,108,136,134,107,134,132,106,132,54,43,54,20,16,20,5,4,5,0,0,0,4,3,4,12,9,12,28,22,28,58,46,58,89,71,89,122,98,122,133,106,133,128,103,128,44,35,44,58,47,58,66,53,66,105,84,105,118,94,118,118,94,118,104,83,104,90,72,90,127,101,127,122,98,122,104,83,104,80,64,80,32,26,32,61,49,61,60,48,60,120,96,120,77,61,77,90,72,90,126,101,126,127,102,127,122,97,122,114,91,114,115,92,115,114,91,114,119,95,119,116,93,116,122,98,122,125,100,125,124,99,124,120,96,120,123,98,123,126,126,126,126,126,126,125,125,125,121,121,121,123,123,123,123,123,123,123,123,123,125,125,125,125,125,125,124,124,124,121,121,121,122,122,122,18,18,18,5,5,5,0,0,0,3,3,3,11,11,11,6,6,6,53,53,53,82,82,82,113,113,113,123,123,123,119,119,119,93,93,93,54,54,54,62,62,62,98,98,98,110,110,110,110,110,110,116,116,116,84,84,84,118,118,118,114,114,114,97,97,97,75,75,75,49,49,49,57,57,57,56,56,56,112,112,112,72,72,72,84,84,84,117,117,117,27,22,27,47,37,47,47,37,47,59,47,59,145,116,145,191,152,191,194,155,194,194,155,194,194,155,194,194,155,194,193,155,193,193,154,193,191,153,191,169,135,169,97,78,97,179,143,179,171,136,171,83,66,83,131,105,131,182,145,182,168,134,168,92,74,92,164,131,164,189,151,189,190,152,190,184,147,184,176,141,176,172,138,172,178,142,178,183,147,183,175,140,175,171,137,171,181,144,181,177,141,177,161,129,161,178,142,178,168,135,168,168,134,168,187,187,187,185,185,185,184,184,184,184,184,184,186,186,186,184,184,184,181,181,181,185,185,185,185,185,185,184,184,184,184,184,184,184,184,184,184,184,184,183,183,183,183,183,183,122,122,122,31,31,31,35,35,35,25,25,25,44,44,44,44,44,44,55,55,55,177,177,177,179,179,179,180,180,180,180,180,180,180,180,180,179,179,179,179,179,179,179,179,179,157,157,157,153,153,153,90,90,90,165,165,165,158,158,158,77,77,77,121,121,121,168,168,168,146,146,146,85,85,85,151,151,151,173,173,173,175,175,175,169,169,169,162,162,162,158,158,158,172,172,172,168,168,168,161,161,161,157,157,157,166,166,166,162,162,162,148,148,148,163,163,163,147,147,147,154,154,154,171,136,171,169,135,169,168,135,168,168,134,168,169,135,169,166,132,166,169,135,169,168,135,168,168,134,168,168,134,168,168,134,168,167,134,167,167,133,167,167,133,167,158,126,158,110,88,110,28,22,28,31,25,31,23,18,23,40,32,40,39,31,39,123,98,123,160,128,160,162,129,162,163,130,163,163,130,163,162,130,162,162,130,162,255,255,150,255,255,155,255,215,120,255,186,104,50,34,19,255,255,160,255,255,161,87,61,34,255,255,161,255,255,160,255,255,158,255,255,161,255,255,160,252,126,0,252,126,0,249,124,0,244,122,0,249,124,0,252,126,0,252,126,0,252,126,0,249,124,0,252,126,0,252,126,0,252,126,0,244,122,0,30,15,0,45,22,0,10,5,0,56,28,0,17,8,0,22,11,0,132,66,0,244,122,0,249,124,0,247,123,0,252,126,0,252,126,0,252,126,0,249,124,0,221,110,0,127,63,0,191,95,0,107,53,0,165,82,0,239,119,0,214,107,0,178,89,0,252,126,0,252,126,0,249,124,0,244,122,0,242,121,0,214,107,0,242,121,0,234,117,0,244,122,0,244,122,0,242,121,0,124,124,124,72,72,72,133,133,133,127,127,127,98,98,98,135,135,135,125,125,125,118,118,118,69,69,69,122,122,122,140,140,140,141,141,141,131,131,131,128,128,128,132,132,132,139,139,139,136,136,136,130,130,130,127,127,127,133,133,133,119,119,119,132,132,132,124,124,124,118,118,118,124,124,124,138,110,138,136,109,136,136,108,136,137,109,137,135,108,135,134,107,134,136,109,136,136,109,136,136,108,136,136,108,136,135,108,135,135,108,135,135,108,135,135,108,135,128,102,128,89,71,89,23,18,23,25,20,25,32,25,32,32,25,32,40,32,40,99,79,99,130,104,130,131,105,131,132,106,132,132,106,132,132,105,132,132,105,132,131,105,131,130,104,130,115,92,115,112,90,112,66,53,66,121,97,121,56,45,56,89,71,89,123,99,123,114,91,114,107,86,107,62,50,62,111,89,111,129,103,129,125,100,125,120,96,120,117,93,117,120,96,120,127,101,127,124,99,124,119,95,119,122,98,122,120,96,120,109,87,109,121,96,121,114,91,114,109,87,109,114,91,114,126,126,126,125,125,125,125,125,125,126,126,126,125,125,125,123,123,123,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,124,124,124,118,118,118,83,83,83,21,21,21,17,17,17,30,30,30,30,30,30,37,37,37,92,92,92,121,121,121,122,122,122,123,123,123,123,123,123,123,123,123,122,122,122,122,122,122,121,121,121,107,107,107,105,105,105,113,113,113,108,108,108,53,53,53,83,83,83,115,115,115,106,106,106,95,76,95,117,93,117,162,129,162,172,137,172,189,151,189,191,153,191,191,153,191,191,152,191,173,138,173,186,149,186,186,149,186,186,149,186,156,125,156,146,117,146,117,93,117,173,139,173,115,92,115,112,90,112,186,149,186,192,153,192,188,150,188,191,153,191,191,153,191,191,153,191,191,152,191,189,151,189,181,144,181,180,144,180,182,146,182,182,145,182,180,144,180,172,137,172,164,131,164,179,143,179,183,146,183,188,188,188,188,188,188,188,188,188,185,185,185,185,185,185,183,183,183,187,187,187,186,186,186,186,186,186,182,182,182,180,180,180,183,183,183,185,185,185,185,185,185,184,184,184,180,180,180,70,70,70,39,39,39,7,7,7,35,35,35,120,120,120,103,103,103,71,71,71,88,88,88,108,108,108,150,150,150,176,176,176,177,177,177,177,177,177,177,177,177,160,160,160,174,174,174,172,172,172,172,172,172,172,172,172,144,144,144,135,135,135,160,160,160,106,106,106,104,104,104,172,172,172,175,175,175,177,177,177,173,173,173,176,176,176,176,176,176,175,175,175,173,173,173,166,166,166,166,166,166,167,167,167,167,167,167,154,154,154,164,164,164,157,157,157,150,150,150,164,164,164,172,137,172,172,137,172,171,137,171,169,135,169,169,135,169,167,133,167,167,133,167,170,136,170,169,135,169,169,135,169,165,132,165,167,133,167,168,134,168,168,134,168,168,134,168,164,131,164,93,74,93,64,51,64,35,28,35,6,5,6,31,25,31,93,75,93,65,52,65,80,64,80,98,78,98,136,109,136,144,115,144,159,127,159,160,128,160,160,128,160,255,255,151,255,255,151,184,128,71,96,66,37,255,224,125,255,255,158,255,241,135,71,49,27,255,255,161,255,255,161,255,255,160,255,255,161,255,255,156,252,126,0,249,124,0,249,124,0,252,126,0,252,126,0,249,124,0,244,122,0,249,124,0,252,126,0,252,126,0,252,126,0,249,124,0,247,123,0,239,119,0,168,84,0,43,21,0,35,17,0,61,30,0,61,30,0,188,94,0,221,110,0,249,124,0,252,126,0,252,126,0,252,126,0,249,124,0,178,89,0,99,49,0,43,21,0,20,10,0,112,56,0,191,95,0,181,90,0,124,62,0,249,124,0,252,126,0,252,126,0,247,123,0,252,126,0,252,126,0,244,122,0,244,122,0,232,116,0,229,114,0,219,109,0,244,122,0,140,140,140,139,139,139,138,138,138,138,138,138,116,116,116,109,109,109,129,129,129,85,85,85,83,83,83,138,138,138,141,141,141,142,142,142,139,139,139,141,141,141,141,141,141,141,141,141,139,139,139,133,133,133,133,133,133,134,134,134,134,134,134,124,124,124,132,132,132,126,126,126,120,120,120,131,131,131,134,134,134,138,110,138,138,110,138,136,109,136,136,108,136,134,107,134,134,107,134,136,109,136,136,109,136,136,109,136,133,106,133,134,107,134,135,108,135,135,108,135,135,108,135,132,105,132,74,59,74,51,41,51,28,22,28,5,4,5,25,20,25,75,60,75,52,42,52,64,51,64,79,63,79,110,88,110,116,93,116,128,102,128,129,103,129,129,103,129,129,103,129,117,93,117,126,101,126,126,100,126,125,100,125,105,84,105,99,79,99,79,63,79,117,93,117,77,62,77,76,60,76,126,100,126,129,103,129,126,101,126,129,103,129,129,103,129,129,103,129,128,103,128,127,101,127,122,97,122,121,97,121,123,98,123,122,98,122,121,97,121,116,92,116,110,88,110,120,96,120,123,98,123,127,127,127,126,126,126,126,126,126,125,125,125,125,125,125,123,123,123,126,126,126,125,125,125,125,125,125,123,123,123,121,121,121,124,124,124,125,125,125,125,125,125,124,124,124,122,122,122,47,47,47,26,26,26,5,5,5,23,23,23,81,81,81,70,70,70,48,48,48,59,59,59,73,73,73,102,102,102,119,119,119,120,120,120,120,120,120,120,120,120,109,109,109,118,118,118,117,117,117,117,117,117,117,117,117,127,101,127,107,85,107,162,130,162,190,152,190,190,152,190,192,153,192,183,147,183,189,151,189,187,149,187,187,149,187,165,132,165,41,33,41,49,39,49,113,91,113,52,42,52,137,109,137,191,153,191,193,154,193,193,154,193,192,154,192,192,154,192,192,153,192,190,152,190,186,148,186,182,145,182,168,134,168,185,148,185,181,145,181,183,146,183,184,147,184,184,147,184,182,145,182,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,188,188,188,188,188,188,188,188,188,187,187,187,187,187,187,187,187,187,187,187,187,186,186,186,186,186,186,178,178,178,39,39,39,24,24,24,125,125,125,170,170,170,39,39,39,16,16,16,3,3,3,7,7,7,42,42,42,98,98,98,127,127,127,123,123,123,118,118,118,99,99,99,150,150,150,174,174,174,176,176,176,175,175,175,170,170,170,175,175,175,173,173,173,172,172,172,152,152,152,38,38,38,45,45,45,104,104,104,48,48,48,126,126,126,176,176,176,177,177,177,177,177,177,177,177,177,177,177,177,176,176,176,174,174,174,170,170,170,166,166,166,154,154,154,169,169,169,166,166,166,167,167,167,169,169,169,168,168,168,166,166,166,173,138,173,173,138,173,172,138,172,172,138,172,172,137,172,171,137,171,171,137,171,171,137,171,170,136,170,170,136,170,170,136,170,170,136,170,169,135,169,169,135,169,162,129,162,35,28,35,22,17,22,113,91,113,122,97,122,154,123,154,15,12,15,3,2,3,6,5,6,38,30,38,88,71,88,115,92,115,111,89,111,106,85,106,89,71,89,136,108,136,157,125,157,158,127,158,217,151,84,142,98,55,255,186,104,255,255,156,255,250,140,255,255,151,230,160,89,255,255,161,255,255,161,255,255,156,255,255,160,255,255,160,249,124,0,244,122,0,252,126,0,252,126,0,249,124,0,247,123,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,247,123,0,242,121,0,73,36,0,89,44,0,25,12,0,112,56,0,158,79,0,122,61,0,234,117,0,247,123,0,252,126,0,249,124,0,247,123,0,224,112,0,160,80,0,89,44,0,237,118,0,242,121,0,191,95,0,183,91,0,247,123,0,249,124,0,247,123,0,252,126,0,252,126,0,252,126,0,239,119,0,242,121,0,244,122,0,234,117,0,239,119,0,244,122,0,249,124,0,141,141,141,141,141,141,142,142,142,136,136,136,140,140,140,138,138,138,138,138,138,122,122,122,36,36,36,84,84,84,39,39,39,101,101,101,141,141,141,142,142,142,142,142,142,141,141,141,141,141,141,141,141,141,141,141,141,139,139,139,136,136,136,133,133,133,123,123,123,132,132,132,134,134,134,135,135,135,135,135,135,133,133,133,138,111,138,138,110,138,138,110,138,138,110,138,137,110,137,137,110,137,137,109,137,137,109,137,136,109,136,136,109,136,136,109,136,136,108,136,136,108,136,135,108,135,130,104,130,28,22,28,17,14,17,91,73,91,97,78,97,123,98,123,28,22,28,12,9,12,2,2,2,5,4,5,31,24,31,71,57,71,90,72,90,85,68,85,72,57,72,109,87,109,126,101,126,128,102,128,127,102,127,129,103,129,123,98,123,127,101,127,125,100,125,125,100,125,110,88,110,27,22,27,32,26,32,35,28,35,91,73,91,128,102,128,129,103,129,129,103,129,129,103,129,129,103,129,128,103,128,128,103,128,127,101,127,124,99,124,121,97,121,112,90,112,124,99,124,121,97,121,122,97,122,123,98,123,122,97,122,127,127,127,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,119,119,119,26,26,26,16,16,16,84,84,84,90,90,90,114,114,114,26,26,26,11,11,11,2,2,2,5,5,5,28,28,28,66,66,66,86,86,86,83,83,83,79,79,79,101,101,101,117,117,117,119,119,119,17,14,17,23,19,23,23,19,23,83,66,83,71,57,71,93,74,93,37,30,37,148,118,148,191,153,191,191,153,191,183,146,183,185,148,185,110,88,110,186,149,186,192,154,192,194,155,194,188,150,188,186,148,186,183,147,183,183,146,183,189,151,189,185,148,185,186,149,186,186,149,186,188,150,188,188,150,188,191,153,191,185,148,185,191,191,191,191,191,191,190,190,190,190,190,190,186,186,186,180,180,180,187,187,187,189,189,189,189,189,189,189,189,189,188,188,188,188,188,188,188,188,188,188,188,188,165,165,165,24,24,24,132,132,132,173,173,173,166,166,166,165,165,165,176,176,176,174,174,174,183,183,183,183,183,183,3,3,3,0,0,0,3,3,3,5,5,5,11,11,11,13,13,13,33,33,33,33,33,33,14,14,14,16,16,16,22,22,22,22,22,22,77,77,77,66,66,66,86,86,86,34,34,34,137,137,137,176,176,176,176,176,176,169,169,169,170,170,170,101,101,101,171,171,171,177,177,177,178,178,178,172,172,172,170,170,170,168,168,168,173,173,173,169,169,169,171,171,171,171,171,171,170,170,170,172,172,172,172,172,172,175,175,175,169,169,169,174,139,174,174,139,174,174,139,174,173,139,173,169,135,169,164,131,164,171,136,171,172,138,172,172,137,172,171,137,171,171,137,171,171,137,171,171,136,171,170,136,170,149,119,149,22,17,22,120,96,120,157,126,157,150,120,150,160,128,160,158,126,158,166,133,166,166,132,166,66,52,66,3,2,3,0,0,0,3,2,3,5,4,5,10,8,10,11,9,11,30,24,30,30,24,30,13,10,13,14,11,14,255,186,104,255,255,147,255,255,155,255,189,106,255,253,142,255,255,143,167,116,65,255,255,161,255,255,160,255,255,158,255,255,158,255,255,161,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,102,51,0,22,11,0,28,14,0,114,57,0,63,31,0,137,68,0,150,75,0,191,95,0,237,118,0,252,126,0,252,126,0,239,119,0,244,122,0,242,121,0,242,121,0,204,102,0,153,76,0,214,107,0,25,12,0,216,108,0,252,126,0,252,126,0,249,124,0,247,123,0,239,119,0,247,123,0,244,122,0,237,118,0,232,116,0,244,122,0,244,122,0,26,26,26,26,26,26,11,11,11,13,13,13,17,17,17,17,17,17,61,61,61,52,52,52,68,68,68,27,27,27,109,109,109,141,141,141,135,135,135,136,136,136,81,81,81,137,137,137,141,141,141,142,142,142,137,137,137,136,136,136,134,134,134,134,134,134,138,138,138,135,135,135,136,136,136,136,136,136,135,135,135,137,137,137,136,136,136,139,139,139,134,134,134,138,111,138,138,110,138,138,110,138,138,110,138,135,108,135,130,104,130,136,108,136,137,109,137,137,109,137,136,109,136,136,109,136,136,109,136,136,108,136,119,95,119,17,14,17,95,76,95,125,100,125,120,96,120,119,95,119,127,102,127,126,101,126,132,106,132,132,106,132,52,42,52,2,2,2,0,0,0,2,2,2,4,3,4,8,6,8,9,7,9,24,19,24,24,19,24,10,8,10,11,9,11,15,12,15,15,12,15,55,44,55,62,49,62,25,20,25,99,79,99,127,102,127,127,102,127,122,97,122,123,98,123,73,58,73,124,99,124,128,102,128,129,103,129,125,100,125,123,99,123,122,97,122,122,97,122,125,100,125,123,98,123,124,99,124,124,99,124,124,99,124,125,100,125,124,99,124,127,101,127,123,98,123,127,127,127,126,126,126,126,126,126,126,126,126,120,120,120,125,125,125,126,126,126,126,126,126,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,110,110,110,16,16,16,88,88,88,115,115,115,110,110,110,110,110,110,118,118,118,116,116,116,122,122,122,122,122,122,48,48,48,2,2,2,0,0,0,2,2,2,3,3,3,51,41,51,93,75,93,187,150,187,189,151,189,181,144,181,188,151,188,178,143,178,178,142,178,158,126,158,140,112,140,191,153,191,195,156,195,195,156,195,195,156,195,195,156,195,194,155,194,194,155,194,190,152,190,192,153,192,189,151,189,193,154,193,179,143,179,189,151,189,193,154,193,190,152,190,192,192,192,192,192,192,192,192,192,191,191,191,191,191,191,191,191,191,191,191,191,190,190,190,190,190,190,190,190,190,178,178,178,157,157,157,128,128,128,107,107,107,160,160,160,49,49,49,131,131,131,171,171,171,148,148,148,178,178,178,181,181,181,181,181,181,170,170,170,122,122,122,145,145,145,180,180,180,176,176,176,82,82,82,16,16,16,50,50,50,9,9,9,65,65,65,44,44,44,40,40,40,33,33,33,103,103,103,151,151,151,81,81,81,48,48,48,86,86,86,173,173,173,174,174,174,167,167,167,174,174,174,164,164,164,164,164,164,145,145,145,129,129,129,176,176,176,179,179,179,179,179,179,179,179,179,178,178,178,178,178,178,178,178,178,174,174,174,175,175,175,173,173,173,177,177,177,164,164,164,172,172,172,176,176,176,175,140,175,175,140,175,175,140,175,175,140,175,174,139,174,174,139,174,174,139,174,173,139,173,173,138,173,173,138,173,162,129,162,142,114,142,116,93,116,97,77,97,145,116,145,45,36,45,119,95,119,155,124,155,134,107,134,161,129,161,164,131,164,164,131,164,153,123,153,110,88,110,131,104,131,163,130,163,159,127,159,74,59,74,15,12,15,45,36,45,8,6,8,58,47,58,40,32,40,36,29,36,30,24,30,93,74,93,255,255,158,255,255,156,255,255,158,255,226,127,255,255,156,255,253,142,255,255,145,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,249,124,0,249,124,0,252,126,0,252,126,0,247,123,0,252,126,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,232,116,0,38,19,0,43,21,0,56,28,0,165,82,0,142,71,0,122,61,0,150,75,0,209,104,0,244,122,0,244,122,0,249,124,0,142,71,0,117,58,0,84,42,0,109,54,0,178,89,0,239,119,0,48,24,0,15,7,0,124,62,0,252,126,0,252,126,0,252,126,0,252,126,0,247,123,0,244,122,0,239,119,0,244,122,0,239,119,0,244,122,0,252,126,0,7,7,7,52,52,52,35,35,35,32,32,32,26,26,26,82,82,82,120,120,120,64,64,64,38,38,38,68,68,68,137,137,137,138,138,138,132,132,132,138,138,138,130,130,130,130,130,130,115,115,115,102,102,102,139,139,139,142,142,142,142,142,142,142,142,142,141,141,141,141,141,141,141,141,141,138,138,138,139,139,139,137,137,137,140,140,140,130,130,130,137,137,137,139,139,139,138,138,138,139,111,139,138,111,138,138,110,138,138,110,138,138,110,138,138,110,138,137,110,137,137,110,137,137,109,137,128,103,128,113,90,113,92,73,92,77,61,77,115,92,115,35,28,35,94,75,94,123,98,123,106,85,106,128,102,128,130,104,130,130,104,130,122,97,122,88,70,88,104,83,104,129,103,129,126,101,126,59,47,59,12,9,12,36,29,36,6,5,6,46,37,46,32,25,32,29,23,29,24,19,24,74,59,74,109,87,109,58,46,58,34,27,34,62,49,62,124,99,124,125,100,125,120,96,120,125,100,125,118,94,118,118,94,118,105,84,105,93,74,93,127,101,127,129,103,129,129,103,129,129,103,129,128,103,128,128,103,128,128,102,128,125,100,125,127,101,127,125,100,125,127,102,127,118,95,118,125,100,125,127,102,127,126,100,126,127,127,127,127,127,127,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,125,125,125,118,118,118,104,104,104,84,84,84,70,70,70,106,106,106,32,32,32,87,87,87,113,113,113,98,98,98,118,118,118,120,120,120,120,120,120,112,112,112,81,81,81,96,96,96,186,149,186,174,139,174,178,142,178,177,142,177,167,134,167,145,116,145,129,103,129,155,124,155,188,151,188,194,155,194,196,157,196,196,156,196,195,156,195,195,156,195,193,154,193,195,156,195,191,152,191,194,155,194,194,155,194,194,155,194,192,153,192,188,150,188,193,193,193,193,193,193,193,193,193,185,185,185,190,190,190,157,157,157,85,85,85,124,124,124,96,96,96,156,156,156,116,116,116,173,173,173,144,144,144,184,184,184,171,171,171,161,161,161,140,140,140,126,126,126,160,160,160,133,133,133,167,167,167,102,102,102,110,110,110,153,153,153,104,104,104,121,121,121,123,123,123,160,160,160,181,181,181,120,120,120,71,71,71,31,31,31,108,108,108,142,142,142,138,138,138,54,54,54,56,56,56,46,46,46,165,165,165,157,157,157,172,172,172,166,166,166,172,172,172,160,160,160,164,164,164,163,163,163,163,163,163,154,154,154,133,133,133,118,118,118,142,142,142,173,173,173,178,178,178,180,180,180,179,179,179,179,179,179,177,177,177,178,178,178,175,175,175,178,178,178,178,178,178,177,177,177,175,175,175,171,171,171,176,141,176,176,141,176,176,141,176,168,135,168,173,139,173,143,114,143,77,62,77,113,90,113,88,70,88,142,114,142,105,84,105,157,126,157,131,105,131,167,134,167,155,124,155,146,117,146,126,101,126,114,91,114,145,116,145,121,96,121,151,121,151,93,74,93,99,79,99,139,111,139,94,75,94,109,87,109,110,88,110,144,115,144,163,130,163,108,86,108,64,51,64,28,23,28,97,78,97,128,102,128,124,99,124,48,38,48,50,40,50,50,40,50,255,255,150,255,255,160,230,160,89,255,238,134,255,255,150,255,253,142,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,249,124,0,247,123,0,249,124,0,244,122,0,249,124,0,249,124,0,244,122,0,247,123,0,249,124,0,252,126,0,252,126,0,247,123,0,140,70,0,96,48,0,10,5,0,12,6,0,107,53,0,145,72,0,140,70,0,155,77,0,178,89,0,204,102,0,247,123,0,249,124,0,229,114,0,142,71,0,79,39,0,140,70,0,234,117,0,229,114,0,63,31,0,147,73,0,178,89,0,249,124,0,252,126,0,252,126,0,247,123,0,244,122,0,244,122,0,249,124,0,244,122,0,229,114,0,247,123,0,247,123,0,95,95,95,56,56,56,25,25,25,86,86,86,113,113,113,109,109,109,42,42,42,44,44,44,36,36,36,131,131,131,125,125,125,136,136,136,131,131,131,136,136,136,127,127,127,129,129,129,129,129,129,122,122,122,105,105,105,94,94,94,112,112,112,137,137,137,141,141,141,142,142,142,142,142,142,141,141,141,140,140,140,141,141,141,138,138,138,140,140,140,140,140,140,140,140,140,138,138,138,135,135,135,139,111,139,139,111,139,139,111,139,133,106,133,137,109,137,113,90,113,61,49,61,89,71,89,69,55,69,112,90,112,83,66,83,124,99,124,103,82,103,132,106,132,122,98,122,115,92,115,100,80,100,90,72,90,90,72,90,114,91,114,95,76,95,119,95,119,73,58,73,78,63,78,109,87,109,74,59,74,86,69,86,87,70,87,114,91,114,129,103,129,86,68,86,51,40,51,22,18,22,77,62,77,101,81,101,98,79,98,38,30,38,39,31,39,33,26,33,118,94,118,112,90,112,123,98,123,119,95,119,122,98,122,114,91,114,117,93,117,117,93,117,110,88,110,95,76,95,85,68,85,102,81,102,124,99,124,127,102,127,129,103,129,128,103,128,128,102,128,127,101,127,128,102,128,125,100,125,128,102,128,127,102,127,127,102,127,126,101,126,123,98,123,127,127,127,127,127,127,127,127,127,121,121,121,125,125,125,103,103,103,56,56,56,81,81,81,63,63,63,63,63,63,102,102,102,76,76,76,114,114,114,95,95,95,121,121,121,112,112,112,106,106,106,92,92,92,83,83,83,105,105,105,88,88,88,110,110,110,186,149,186,124,99,124,188,150,188,194,155,194,192,153,192,189,151,189,183,146,183,137,110,137,101,81,101,141,113,141,178,143,178,141,112,141,180,144,180,182,145,182,182,145,182,191,153,191,191,153,191,193,154,193,175,175,175,102,102,102,106,106,106,78,78,78,78,78,78,105,105,105,183,183,183,164,164,164,187,187,187,177,177,177,179,179,179,184,184,184,182,182,182,186,186,186,172,172,172,127,127,127,175,175,175,139,139,139,171,171,171,86,86,86,109,109,109,84,84,84,78,78,78,153,153,153,128,128,128,154,154,154,183,183,183,183,183,183,171,171,171,180,180,180,182,182,182,170,170,170,181,181,181,179,179,179,166,166,166,169,169,169,148,148,148,112,112,112,84,84,84,172,172,172,174,174,174,183,183,183,182,182,182,160,160,160,111,111,111,180,180,180,180,180,180,172,172,172,114,114,114,173,173,173,178,178,178,178,178,178,176,176,176,174,174,174,168,168,168,126,126,126,93,93,93,129,129,129,164,164,164,129,129,129,165,165,165,166,166,166,166,166,166,175,175,175,175,175,175,176,176,176,160,128,160,93,74,93,96,77,96,71,57,71,96,77,96,167,134,167,149,119,149,170,136,170,170,136,170,161,129,161,162,130,162,167,134,167,165,132,165,168,135,168,156,125,156,115,92,115,159,127,159,125,100,125,155,124,155,78,62,78,99,79,99,76,61,76,71,56,71,138,110,138,115,92,115,139,111,139,165,132,165,154,123,154,162,130,162,164,131,164,153,122,153,153,122,153,163,130,163,161,129,161,149,119,149,152,121,152,133,106,133,101,80,101,75,60,75,154,123,154,255,200,112,255,255,155,255,255,151,255,212,119,255,200,112,255,255,160,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,249,124,0,247,123,0,247,123,0,252,126,0,252,126,0,247,123,0,249,124,0,252,126,0,252,126,0,252,126,0,211,105,0,15,7,0,191,95,0,53,26,0,10,5,0,61,30,0,48,24,0,155,77,0,140,70,0,163,81,0,124,62,0,209,104,0,242,121,0,244,122,0,247,123,0,237,118,0,249,124,0,237,118,0,17,8,0,188,94,0,104,52,0,94,47,0,252,126,0,252,126,0,247,123,0,244,122,0,242,121,0,244,122,0,244,122,0,237,118,0,249,124,0,247,123,0,144,144,144,135,135,135,144,144,144,142,142,142,131,131,131,134,134,134,134,134,134,117,117,117,89,89,89,66,66,66,136,136,136,137,137,137,144,144,144,144,144,144,126,126,126,88,88,88,142,142,142,141,141,141,135,135,135,90,90,90,136,136,136,140,140,140,139,139,139,137,137,137,132,132,132,99,99,99,73,73,73,101,101,101,129,129,129,128,128,128,101,101,101,129,129,129,131,131,131,130,130,130,137,137,137,137,137,137,138,138,138,125,100,125,73,58,73,76,60,76,56,44,56,75,60,75,131,105,131,117,93,117,134,107,134,126,101,126,128,102,128,131,105,131,130,104,130,132,106,132,123,98,123,91,72,91,90,72,90,125,100,125,98,79,98,122,97,122,61,49,61,77,62,77,60,48,60,55,44,55,108,87,108,91,72,91,109,87,109,130,104,130,121,97,121,128,102,128,129,103,129,121,97,121,129,103,129,127,102,127,118,94,118,120,96,120,105,84,105,80,64,80,60,48,60,122,98,122,122,97,122,123,98,123,130,104,130,129,103,129,113,91,113,79,63,79,128,102,128,127,102,127,122,97,122,81,65,81,123,98,123,127,101,127,125,100,125,124,99,124,120,96,120,90,72,90,66,53,66,92,73,92,116,93,116,92,73,92,117,94,117,119,95,119,118,95,118,118,95,118,125,100,125,124,99,124,126,100,126,114,114,114,66,66,66,69,69,69,51,51,51,69,69,69,120,120,120,107,107,107,122,122,122,115,115,115,117,117,117,120,120,120,119,119,119,121,121,121,112,112,112,83,83,83,115,115,115,90,90,90,112,112,112,197,157,197,168,135,168,180,144,180,188,150,188,162,129,162,172,137,172,124,99,124,69,55,69,69,55,69,175,140,175,185,148,185,187,149,187,169,135,169,174,139,174,178,142,178,188,188,188,190,190,190,181,181,181,179,179,179,181,181,181,183,183,183,124,124,124,157,157,157,157,157,157,164,164,164,156,156,156,176,176,176,181,181,181,187,187,187,187,187,187,177,177,177,159,159,159,132,132,132,145,145,145,182,182,182,185,185,185,176,176,176,81,81,81,81,81,81,115,115,115,61,61,61,119,119,119,157,157,157,147,147,147,156,156,156,126,126,126,150,150,150,137,137,137,131,131,131,161,161,161,157,157,157,134,134,134,151,151,151,151,151,151,181,181,181,120,120,120,71,71,71,173,173,173,180,180,180,176,176,176,179,179,179,164,164,164,102,102,102,113,113,113,152,152,152,178,178,178,180,180,180,181,181,181,181,181,181,155,155,155,166,166,166,173,173,173,149,149,149,157,157,157,113,113,113,64,64,64,160,160,160,169,169,169,171,171,171,154,154,154,159,159,159,163,163,163,172,137,172,171,137,171,173,138,173,165,132,165,163,131,163,165,132,165,166,133,166,112,90,112,143,114,143,149,119,149,142,114,142,160,128,160,165,132,165,170,136,170,169,135,169,160,128,160,160,128,160,144,115,144,119,95,119,131,105,131,164,131,164,167,134,167,158,127,158,73,58,73,104,83,104,55,44,55,107,85,107,141,113,141,132,106,132,141,113,141,113,90,113,113,90,113,135,108,135,123,98,123,117,94,117,144,115,144,141,113,141,120,96,120,135,108,135,162,129,162,108,86,108,64,51,64,154,123,154,255,229,129,255,247,138,255,203,114,255,212,119,255,255,160,255,255,161,255,255,161,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,247,123,0,249,124,0,249,124,0,252,126,0,252,126,0,252,126,0,249,124,0,127,63,0,89,44,0,165,82,0,232,116,0,22,11,0,5,2,0,10,5,0,135,67,0,61,30,0,175,87,0,175,87,0,196,98,0,249,124,0,237,118,0,244,122,0,244,122,0,239,119,0,25,12,0,86,43,0,124,62,0,173,86,0,178,89,0,252,126,0,252,126,0,252,126,0,239,119,0,242,121,0,242,121,0,244,122,0,244,122,0,247,123,0,244,122,0,124,124,124,99,99,99,119,119,119,108,108,108,103,103,103,127,127,127,124,124,124,106,106,106,119,119,119,119,119,119,142,142,142,95,95,95,56,56,56,136,136,136,141,141,141,138,138,138,141,141,141,129,129,129,80,80,80,89,89,89,119,119,119,140,140,140,141,141,141,140,140,140,142,142,142,121,121,121,130,130,130,135,135,135,116,116,116,123,123,123,89,89,89,50,50,50,125,125,125,132,132,132,134,134,134,121,121,121,125,125,125,127,127,127,127,127,127,134,107,134,135,108,135,129,103,129,128,102,128,129,103,129,130,104,130,88,70,88,111,89,111,117,93,117,111,89,111,125,100,125,129,103,129,133,106,133,132,106,132,132,106,132,125,100,125,113,90,113,93,74,93,103,82,103,128,103,128,131,105,131,124,99,124,57,45,57,81,65,81,43,34,43,84,67,84,111,89,111,104,83,104,111,88,111,110,88,110,89,71,89,106,85,106,96,77,96,92,74,92,114,91,114,111,88,111,95,76,95,106,85,106,128,102,128,85,68,85,50,40,50,122,97,122,127,101,127,124,99,124,124,99,124,126,101,126,116,92,116,72,58,72,80,64,80,107,86,107,126,100,126,127,101,127,128,102,128,109,87,109,117,94,117,122,98,122,105,84,105,111,89,111,80,64,80,80,64,80,45,36,45,114,91,114,120,96,120,121,97,121,109,87,109,113,90,113,115,92,115,122,122,122,123,123,123,118,118,118,116,116,116,117,117,117,118,118,118,80,80,80,80,80,80,101,101,101,106,106,106,101,101,101,114,114,114,118,118,118,121,121,121,121,121,121,158,158,197,159,159,199,154,154,193,152,152,191,155,155,194,150,150,188,152,152,190,147,147,184,144,144,180,140,140,175,140,140,175,153,153,191,157,197,197,154,193,193,154,192,192,151,188,188,152,190,190,152,190,190,152,190,190,145,181,181,148,185,185,148,185,185,152,191,191,151,189,189,147,184,184,152,190,190,153,192,192,150,188,188,145,182,182,150,187,187,153,191,191,154,193,193,154,192,192,151,188,188,150,188,188,147,184,184,121,151,151,83,104,104,120,150,150,109,137,137,98,123,123,46,57,57,35,44,44,35,44,44,67,84,84,59,74,74,81,101,101,96,120,120,80,101,101,102,127,127,132,165,165,144,180,180,144,180,180,139,174,174,147,183,183,146,183,183,146,183,183,143,179,179,138,173,173,144,180,180,144,180,180,142,178,178,142,177,177,142,177,177,141,177,177,144,180,180,144,180,180,145,182,182,145,181,181,145,181,181,146,183,183,141,177,177,140,175,175,143,178,178,138,172,172,139,174,174,135,168,168,134,168,168,131,164,164,128,160,160,140,175,175,144,144,180,141,141,176,140,140,176,137,137,172,138,138,173,138,138,173,138,138,173,138,138,172,132,132,165,134,134,168,138,138,173,137,137,171,134,134,167,138,138,172,139,139,174,136,136,170,131,131,164,135,135,169,138,138,173,138,138,172,139,139,174,136,136,170,136,136,170,133,133,166,109,109,136,75,75,94,108,108,135,98,98,123,88,88,111,41,41,52,41,41,51,31,31,39,60,60,75,53,53,67,72,72,91,86,86,108,72,72,90,91,91,114,118,118,148,129,129,161,129,129,161,128,128,161,124,124,155,131,131,163,255,224,125,255,232,130,255,215,120,225,157,88,255,241,135,255,255,161,255,255,160,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,242,121,0,61,30,0,211,105,0,247,123,0,170,85,0,20,10,0,5,2,0,25,12,0,22,11,0,12,6,0,107,53,0,178,89,0,99,49,0,137,68,0,170,85,0,188,94,0,66,33,0,17,8,0,30,15,0,247,123,0,244,122,0,239,119,0,142,71,0,249,124,0,252,126,0,242,121,0,244,122,0,252,126,0,239,119,0,239,119,0,239,119,0,244,122,0,252,126,0,77,97,97,36,45,45,27,34,34,53,66,66,47,58,58,63,79,79,75,94,94,63,79,79,80,100,100,104,130,130,104,130,130,113,141,141,113,141,141,109,136,136,115,143,143,114,143,143,112,140,140,108,135,135,113,141,141,112,141,141,111,139,139,111,139,139,111,138,138,110,138,138,110,138,138,112,141,141,113,142,142,113,142,142,113,141,141,114,143,143,110,138,138,109,136,136,111,139,139,111,139,139,107,134,134,108,135,135,105,131,131,102,128,128,100,125,125,109,136,136,112,112,140,109,109,137,109,109,137,107,107,134,107,107,133,108,108,135,107,107,134,107,107,134,103,103,128,105,105,131,108,108,135,107,107,133,104,104,130,107,107,134,108,108,135,108,108,135,106,106,132,102,102,128,105,105,132,107,107,134,108,108,136,106,106,133,106,106,132,103,103,129,85,85,106,58,58,73,58,58,73,84,84,106,77,77,96,69,69,86,32,32,40,24,24,31,47,47,59,42,42,52,57,57,71,67,67,84,56,56,71,71,71,89,71,71,89,93,93,116,101,101,126,101,101,126,98,98,122,103,103,128,103,103,128,100,100,125,97,97,121,101,101,126,101,101,126,101,101,126,100,100,125,100,100,125,99,99,124,99,99,124,101,101,127,102,102,128,102,102,128,102,102,127,103,103,129,100,100,125,99,99,124,98,98,123,100,100,125,97,97,121,98,98,123,95,95,119,93,93,116,90,90,113,98,98,123,101,127,127,99,124,124,99,124,124,99,124,124,97,121,121,98,122,122,98,122,122,98,122,122,93,117,117,95,119,119,98,123,123,97,122,122,155,155,194,155,155,193,156,156,195,156,156,195,145,145,181,141,141,177,149,149,186,147,147,184,154,192,192,153,192,192,153,192,192,153,191,191,153,191,191,156,195,195,156,195,195,154,193,193,154,192,192,152,190,190,152,190,190,152,190,190,152,190,190,151,189,189,151,189,189,154,193,193,146,183,183,141,177,177,125,157,157,97,121,121,97,121,121,109,137,137,97,121,121,104,131,131,109,136,136,35,44,44,26,33,33,9,11,11,17,21,21,17,21,21,23,29,29,9,11,11,20,25,25,13,17,17,15,19,19,10,13,13,52,65,65,38,48,48,38,48,48,55,69,69,50,63,63,19,24,24,29,36,36,70,87,87,16,20,20,22,28,28,83,104,104,83,104,104,134,168,168,145,181,181,146,183,183,149,186,186,149,186,186,149,186,186,147,184,184,147,183,183,146,183,183,143,179,179,144,181,181,146,182,182,147,184,184,145,182,182,142,178,178,142,178,178,143,179,179,143,179,179,143,179,179,132,165,165,129,161,161,136,170,170,135,168,168,140,140,175,140,140,175,140,140,175,140,140,175,139,139,174,142,142,178,142,142,177,140,140,175,140,140,175,138,138,173,138,138,173,138,138,172,138,138,172,137,137,172,137,137,171,140,140,175,132,132,166,128,128,160,113,113,142,88,88,110,99,99,124,99,99,123,87,87,109,94,94,118,98,98,123,32,32,40,23,23,29,8,8,10,15,15,19,20,20,26,20,20,26,8,8,10,18,18,22,12,12,15,13,13,17,9,9,12,46,46,58,34,34,43,49,49,61,49,49,61,45,45,56,17,17,22,25,25,32,62,62,78,14,14,18,20,20,25,255,255,151,184,128,71,171,119,67,255,250,140,255,194,109,255,255,161,255,255,156,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,244,122,0,38,19,0,86,43,0,239,119,0,247,123,0,249,124,0,234,117,0,7,3,0,22,11,0,20,10,0,25,12,0,17,8,0,22,11,0,53,26,0,84,42,0,30,15,0,30,15,0,91,45,0,119,59,0,224,112,0,247,123,0,209,104,0,234,117,0,239,119,0,252,126,0,252,126,0,249,124,0,252,126,0,252,126,0,249,124,0,249,124,0,247,123,0,252,126,0,13,16,16,18,22,22,7,9,9,15,19,19,15,19,19,10,13,13,12,15,15,8,10,10,41,51,51,30,37,37,43,54,54,39,49,49,15,19,19,15,19,19,22,28,28,54,68,68,13,16,16,17,22,22,65,81,81,105,131,131,113,141,141,114,143,143,114,142,142,116,145,145,116,145,145,115,144,144,114,143,143,114,143,143,111,139,139,112,141,141,113,142,142,113,142,142,114,143,143,113,141,141,110,138,138,110,138,138,111,139,139,111,139,139,103,128,128,100,125,125,100,125,125,106,132,132,104,130,130,109,109,136,108,108,136,108,108,135,108,108,135,110,110,138,110,110,138,110,110,137,108,108,136,108,108,135,107,107,134,107,107,134,107,107,133,106,106,133,106,106,133,108,108,136,108,108,135,103,103,128,99,99,124,88,88,110,68,68,85,77,77,96,68,68,85,73,73,91,76,76,95,76,76,95,25,25,31,18,18,23,6,6,8,11,11,14,16,16,20,6,6,8,14,14,17,9,9,12,9,9,12,10,10,13,7,7,9,36,36,45,26,26,33,38,38,48,35,35,44,13,13,17,20,20,25,20,20,25,49,49,61,11,11,14,15,15,19,58,58,72,94,94,117,101,101,127,102,102,128,104,104,130,104,104,130,104,104,130,104,104,130,102,102,128,102,102,128,100,100,125,101,101,126,102,102,128,103,103,129,103,103,129,102,102,127,99,99,124,99,99,124,100,100,125,100,100,125,93,93,116,91,91,113,96,96,120,95,95,119,94,94,118,98,123,123,98,123,123,98,123,123,98,123,123,100,125,125,100,125,125,99,124,124,99,123,123,155,155,194,155,155,194,148,148,186,153,153,191,153,153,191,154,193,193,154,193,193,156,195,195,154,193,193,154,192,192,154,192,192,145,182,182,148,186,186,153,192,192,153,191,191,153,191,191,153,191,191,152,191,191,152,191,191,152,190,190,154,192,192,142,178,178,47,59,59,31,39,39,31,39,39,33,41,41,31,39,39,28,35,35,59,74,74,39,49,49,43,54,54,56,70,70,56,70,70,79,99,99,25,31,31,28,35,35,4,5,5,10,13,13,7,9,9,7,9,9,15,19,19,27,34,34,12,15,15,23,28,28,40,50,50,37,46,46,30,38,38,30,38,38,112,140,140,113,141,141,64,80,80,42,53,53,6,7,7,0,0,0,3,3,3,3,3,3,22,28,28,116,146,146,147,183,183,149,187,187,149,187,187,146,183,183,146,182,182,144,180,180,142,178,178,139,174,174,143,179,179,142,177,177,143,179,179,144,180,180,144,180,180,145,182,182,141,176,176,142,178,178,136,170,170,140,175,175,140,175,175,141,141,177,141,141,176,141,141,176,142,142,178,140,140,175,140,140,175,132,132,166,135,135,169,135,135,169,139,139,174,139,139,174,139,139,173,138,138,173,138,138,173,138,138,173,139,139,174,139,139,174,129,129,161,43,43,53,28,28,35,30,30,37,28,28,35,25,25,32,25,25,31,53,53,67,35,35,44,39,39,49,50,50,63,71,71,89,22,22,28,25,25,31,25,25,31,4,4,5,9,9,12,6,6,8,13,13,17,25,25,31,11,11,13,20,20,25,20,20,25,35,35,44,33,33,41,27,27,34,100,100,125,101,101,126,57,57,71,57,57,71,38,38,47,5,5,6,234,162,91,200,139,78,255,255,145,179,125,70,255,255,161,255,255,153,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,102,51,0,56,28,0,239,119,0,237,118,0,244,122,0,247,123,0,249,124,0,99,49,0,5,2,0,5,2,0,7,3,0,15,7,0,66,33,0,61,30,0,73,36,0,68,34,0,99,49,0,71,35,0,33,16,0,249,124,0,239,119,0,229,114,0,196,98,0,163,81,0,252,126,0,252,126,0,252,126,0,252,126,0,247,123,0,242,121,0,249,124,0,244,122,0,252,126,0,62,78,78,19,24,24,22,27,27,3,4,4,8,10,10,6,7,7,6,7,7,12,15,15,21,27,27,9,12,12,18,22,22,31,39,39,28,36,36,24,30,30,24,30,30,87,109,109,88,110,110,50,62,62,33,41,41,4,5,5,0,0,0,2,2,2,2,2,2,17,22,22,90,113,113,114,142,142,116,145,145,116,145,145,113,141,141,113,141,141,111,139,139,110,138,138,108,135,135,111,139,139,110,137,137,111,138,138,112,140,140,111,139,139,112,140,140,109,136,136,110,137,137,105,131,131,108,135,135,108,135,135,108,135,135,109,109,136,109,109,136,109,109,137,108,108,135,108,108,135,102,102,128,104,104,130,104,104,130,107,107,134,107,107,134,107,107,134,107,107,134,107,107,133,106,106,133,107,107,134,107,107,134,99,99,124,33,33,41,22,22,27,23,23,28,22,22,27,19,19,24,19,19,24,41,41,52,27,27,34,30,30,38,39,39,49,55,55,69,17,17,21,19,19,24,19,19,24,3,3,4,7,7,9,5,5,6,10,10,13,19,19,24,8,8,10,16,16,20,16,16,20,27,27,34,25,25,32,21,21,26,78,78,97,78,78,98,44,44,55,44,44,55,29,29,37,4,4,5,0,0,0,2,2,2,15,15,19,81,81,101,102,102,127,102,102,127,104,104,130,104,104,130,101,101,127,100,100,125,99,99,124,97,97,121,100,100,125,100,100,125,99,99,123,99,99,124,100,100,126,101,101,127,98,98,123,99,99,124,99,99,124,95,95,118,98,98,122,97,97,122,98,123,123,98,123,123,99,124,124,98,123,123,98,123,123,155,155,194,155,155,194,160,200,200,160,200,200,156,196,196,155,194,194,156,195,195,156,195,195,159,199,199,159,199,199,157,197,197,155,194,194,155,194,194,158,198,198,158,198,198,156,196,196,151,189,189,97,121,121,19,23,23,12,15,15,12,15,15,62,77,77,39,49,49,55,69,69,68,85,85,55,69,69,69,87,87,69,86,86,55,69,69,34,43,43,58,72,72,84,106,106,6,7,7,18,23,23,18,23,23,3,3,3,17,21,21,26,33,33,43,54,54,79,99,99,79,99,99,29,36,36,76,95,95,35,44,44,48,60,60,38,48,48,32,40,40,32,40,40,46,57,57,81,101,101,33,42,42,29,36,36,15,19,19,21,26,26,21,26,26,18,22,22,6,7,7,89,112,112,149,186,186,150,187,187,150,187,187,146,183,183,145,181,181,146,183,183,147,184,184,147,184,184,144,180,180,144,180,180,143,179,179,148,185,185,146,183,183,146,182,182,143,178,178,142,178,178,142,178,178,142,178,178,146,146,183,146,146,183,143,143,179,141,141,177,141,141,176,142,142,178,145,145,181,145,145,181,143,143,179,141,141,177,141,141,176,141,141,176,144,144,180,142,142,177,137,137,172,88,88,110,17,17,21,11,11,14,11,11,14,56,56,70,35,35,44,50,50,62,61,61,76,50,50,62,49,49,62,62,62,78,49,49,62,31,31,39,52,52,65,76,76,95,5,5,7,5,5,7,16,16,21,2,2,3,15,15,19,23,23,29,39,39,48,39,39,48,71,71,88,26,26,33,68,68,85,31,31,39,42,42,53,34,34,43,34,34,43,28,28,36,41,41,51,72,72,90,30,30,37,25,25,32,175,122,68,255,255,145,255,255,153,238,165,93,255,255,161,255,255,161,255,255,161,252,126,0,249,124,0,252,126,0,252,126,0,252,126,0,249,124,0,247,123,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,33,16,0,178,89,0,234,117,0,224,112,0,239,119,0,242,121,0,244,122,0,234,117,0,2,1,0,30,15,0,15,7,0,30,15,0,15,7,0,25,12,0,38,19,0,104,52,0,63,31,0,91,45,0,239,119,0,242,121,0,242,121,0,229,114,0,229,114,0,181,90,0,249,124,0,252,126,0,252,126,0,252,126,0,249,124,0,242,121,0,249,124,0,252,126,0,249,124,0,45,57,57,66,83,83,66,83,83,4,6,6,14,18,18,2,3,3,13,16,16,20,25,25,34,42,42,34,42,42,61,77,77,23,28,28,59,74,74,27,34,34,37,46,46,37,46,46,30,37,37,25,31,31,35,44,44,63,79,79,26,32,32,22,28,28,22,28,28,11,14,14,16,20,20,14,17,17,4,5,5,69,86,86,69,86,86,115,143,143,116,145,145,113,141,141,112,140,140,113,141,141,114,142,142,113,142,142,113,142,142,111,138,138,110,138,138,114,142,142,112,141,141,112,140,140,112,140,140,110,137,137,109,137,137,109,137,137,112,112,141,112,112,140,112,112,140,110,110,137,108,108,136,109,109,137,111,111,139,111,111,139,110,110,137,110,110,137,108,108,136,108,108,135,110,110,138,109,109,136,106,106,132,67,67,84,67,67,84,13,13,16,8,8,11,43,43,53,27,27,34,38,38,48,38,38,48,47,47,59,38,38,48,48,48,60,38,38,47,24,24,30,40,40,50,40,40,50,58,58,73,4,4,5,13,13,16,2,2,2,11,11,14,18,18,22,18,18,22,30,30,37,54,54,68,20,20,25,52,52,65,24,24,30,24,24,30,33,33,41,26,26,33,22,22,28,31,31,39,56,56,70,23,23,29,23,23,29,20,20,25,10,10,13,14,14,18,12,12,15,4,4,5,62,62,77,62,62,77,103,103,128,103,103,129,101,101,127,100,100,125,101,101,126,101,101,126,102,102,127,102,102,127,100,100,125,99,99,124,102,102,128,101,101,127,101,101,127,101,101,126,99,99,124,99,99,124,99,99,123,102,127,127,101,127,127,161,201,201,161,201,201,159,199,199,160,200,200,160,200,200,160,200,200,160,200,200,160,200,200,159,199,199,159,199,199,156,195,195,156,195,195,135,168,168,93,116,116,73,92,92,12,16,16,17,22,22,17,22,22,9,11,11,41,51,51,43,53,53,51,63,63,71,89,89,71,89,89,23,29,29,49,61,61,41,51,51,61,77,77,79,98,98,79,98,98,6,7,7,9,11,11,23,29,29,12,15,15,51,64,64,51,64,64,34,43,43,39,48,48,15,19,19,15,19,19,26,33,33,26,33,33,43,54,54,31,38,38,49,62,62,20,25,25,4,5,5,4,5,5,0,0,0,6,7,7,27,34,34,7,9,9,6,7,7,6,7,7,13,17,17,1,1,1,74,93,93,148,185,185,147,184,184,147,184,184,147,184,184,148,186,186,150,187,187,148,185,185,148,185,185,145,181,181,146,182,182,149,186,186,144,180,180,139,174,174,139,174,174,143,179,179,143,179,179,138,173,173,147,147,184,147,147,184,147,147,183,146,146,183,145,145,181,146,146,183,146,146,182,146,146,182,145,145,182,145,145,182,145,145,181,145,145,181,142,142,177,122,122,153,122,122,153,84,84,105,66,66,83,11,11,14,15,15,19,8,8,10,8,8,10,37,37,46,38,38,48,46,46,57,64,64,80,21,21,26,21,21,26,44,44,55,37,37,46,55,55,69,71,71,88,5,5,7,5,5,7,8,8,10,21,21,26,11,11,14,46,46,58,30,30,38,30,30,38,35,35,43,13,13,17,13,13,17,23,23,29,38,38,48,38,38,48,27,27,34,44,44,55,17,17,22,4,4,5,4,4,5,0,0,0,5,5,6,255,255,158,255,238,134,255,255,151,251,174,98,255,255,160,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,249,124,0,244,122,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,209,104,0,51,25,0,173,86,0,239,119,0,247,123,0,198,99,0,219,109,0,224,112,0,201,100,0,196,98,0,28,14,0,30,15,0,12,6,0,89,44,0,56,28,0,45,22,0,188,94,0,102,51,0,206,103,0,244,122,0,232,116,0,209,104,0,204,102,0,234,117,0,226,113,0,247,123,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,252,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,23,23,9,12,12,40,50,50,26,33,33,26,33,33,30,38,38,12,15,15,12,15,15,20,25,25,33,42,42,33,42,42,24,30,30,38,48,48,15,19,19,3,4,4,0,0,0,0,0,0,4,5,5,21,26,26,5,7,7,4,5,5,10,13,13,10,13,13,1,1,1,57,72,72,113,142,142,113,142,142,113,141,141,113,141,141,114,142,142,115,144,144,113,142,142,111,139,139,112,140,140,112,140,140,114,142,142,110,138,138,107,133,133,110,137,137,110,137,137,110,137,137,106,132,132,113,113,141,112,112,141,112,112,140,111,111,139,111,111,139,112,112,140,111,111,139,111,111,139,111,111,139,111,111,139,111,111,139,111,111,138,108,108,135,93,93,117,64,64,81,51,51,64,51,51,64,8,8,11,12,12,15,6,6,8,28,28,35,28,28,35,29,29,37,35,35,44,49,49,61,16,16,20,34,34,42,33,33,42,28,28,35,42,42,53,54,54,68,4,4,5,6,6,8,6,6,8,16,16,20,8,8,10,35,35,44,23,23,29,26,26,33,26,26,33,10,10,13,10,10,13,18,18,22,30,30,37,21,21,26,21,21,26,34,34,42,13,13,17,3,3,3,0,0,0,4,4,5,4,4,5,19,19,23,5,5,6,4,4,5,9,9,11,1,1,1,1,1,1,51,51,64,101,101,127,101,101,127,101,101,127,102,102,128,102,102,128,103,103,129,102,102,127,100,100,125,100,100,126,102,102,128,102,102,128,99,99,124,96,96,120,99,99,124,99,99,124,161,201,201,161,201,201,161,201,201,161,201,201,160,201,201,160,200,200,160,200,200,158,198,198,158,198,198,153,192,192,148,185,185,62,78,78,16,20,20,9,12,12,9,12,12,27,34,34,27,34,34,41,52,52,12,16,16,12,16,16,14,17,17,59,73,73,68,85,85,70,87,87,70,87,87,138,173,173,149,186,186,90,113,113,17,21,21,9,11,11,9,11,11,11,13,13,14,17,17,29,37,37,48,61,61,48,60,60,95,119,119,105,131,131,103,129,129,112,140,140,112,140,140,128,160,160,115,144,144,96,120,120,77,97,97,73,91,91,72,91,91,110,137,137,89,112,112,20,25,25,6,7,7,6,7,7,10,13,13,10,13,13,3,3,3,122,153,153,122,153,153,150,187,187,151,189,189,151,189,189,147,184,184,144,180,180,144,180,180,144,180,180,144,180,180,145,181,181,149,187,187,149,186,186,146,182,182,138,173,173,145,182,182,148,185,185,148,148,185,148,148,185,148,148,185,147,147,184,146,146,182,147,147,184,147,147,184,146,146,183,146,146,183,146,146,183,146,146,182,146,146,182,145,145,182,144,144,180,139,139,174,134,134,168,57,57,71,57,57,71,14,14,18,8,8,10,24,24,30,24,24,30,24,24,30,37,37,47,11,11,14,12,12,16,53,53,66,53,53,66,61,61,77,63,63,78,124,124,155,134,134,167,81,81,101,81,81,101,15,15,19,8,8,10,9,9,12,12,12,15,12,12,15,26,26,33,43,43,54,85,85,107,94,94,117,93,93,117,92,92,115,100,100,125,114,114,142,102,102,128,86,86,107,85,85,107,69,69,86,64,64,81,97,97,122,79,79,99,79,79,99,255,226,127,255,247,138,255,255,151,255,255,156,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,214,107,0,124,62,0,234,117,0,198,99,0,247,123,0,244,122,0,229,114,0,165,82,0,244,122,0,239,119,0,73,36,0,66,33,0,163,81,0,89,44,0,107,53,0,155,77,0,96,48,0,114,57,0,232,116,0,242,121,0,244,122,0,234,117,0,226,113,0,186,93,0,165,82,0,242,121,0,247,123,0,247,123,0,249,124,0,247,123,0,237,118,0,244,122,0,252,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,109,109,87,108,108,99,123,123,89,111,111,74,93,93,60,75,75,56,70,70,56,70,70,84,106,106,69,86,86,15,19,19,4,5,5,4,5,5,8,10,10,8,10,10,2,2,2,94,117,117,94,117,117,115,143,143,116,145,145,115,144,144,113,141,141,110,138,138,110,138,138,110,138,138,110,137,137,111,139,139,114,143,143,114,142,142,111,139,139,105,132,132,111,139,139,113,141,141,113,113,141,113,113,141,113,113,141,112,112,141,111,111,139,112,112,140,112,112,140,112,112,140,111,111,139,111,111,139,111,111,139,111,111,139,111,111,139,109,109,137,106,106,133,102,102,128,43,43,54,43,43,54,11,11,13,6,6,8,18,18,23,18,18,23,18,18,23,28,28,35,8,8,11,9,9,12,40,40,50,40,40,50,47,47,58,48,48,60,95,95,119,102,102,128,62,62,77,62,62,77,11,11,14,6,6,8,7,7,9,9,9,12,9,9,12,20,20,25,33,33,41,65,65,82,72,72,90,72,72,90,70,70,88,77,77,96,87,87,109,79,79,98,66,66,82,66,66,82,53,53,66,50,50,62,75,75,94,61,61,76,61,61,76,13,13,17,4,4,5,7,7,9,7,7,9,7,7,9,2,2,2,84,84,105,102,102,128,103,103,129,103,103,129,103,103,129,101,101,126,99,99,123,99,99,123,98,98,123,98,98,123,99,99,124,102,102,128,161,202,202,161,202,202,161,201,201,161,201,201,161,201,201,161,201,201,160,201,201,107,133,133,89,111,111,14,18,18,14,18,18,6,8,8,3,4,4,4,6,6,11,14,14,11,14,14,25,32,32,20,26,26,141,176,176,157,196,196,157,196,196,158,198,198,158,198,198,158,197,197,158,197,197,157,197,197,157,197,197,157,196,196,157,196,196,157,196,196,157,196,196,156,196,196,156,195,195,156,195,195,156,195,195,156,195,195,155,194,194,155,194,194,155,194,194,155,194,194,155,194,194,155,193,193,154,193,193,154,193,193,152,191,191,152,190,190,152,190,190,149,186,186,110,137,137,10,13,13,10,13,13,6,7,7,69,86,86,149,187,187,152,190,190,152,190,190,150,188,188,147,184,184,147,184,184,147,183,183,145,181,181,145,181,181,137,171,171,143,179,179,143,178,178,145,182,182,147,183,183,148,185,185,148,185,185,148,185,185,144,181,181,149,149,186,148,148,186,148,148,185,148,148,185,148,148,185,148,148,185,147,147,184,147,147,184,147,147,184,147,147,184,147,147,183,146,146,183,146,146,183,146,146,182,146,146,182,97,97,121,80,80,101,13,13,16,13,13,16,5,5,7,2,2,3,4,4,5,10,10,12,10,10,12,23,23,29,18,18,23,127,127,159,141,141,177,141,141,176,142,142,178,142,142,178,142,142,177,142,142,177,141,141,177,141,141,176,141,141,176,141,141,176,140,140,176,140,140,175,140,140,175,140,140,175,139,139,174,139,139,174,139,139,174,139,139,173,138,138,173,138,138,173,138,138,173,138,138,172,137,137,172,137,137,172,137,137,171,137,137,171,135,135,169,135,135,169,132,132,165,255,197,111,255,255,153,255,255,151,255,244,137,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,247,123,0,170,85,0,142,71,0,214,107,0,175,87,0,229,114,0,239,119,0,209,104,0,173,86,0,181,90,0,145,72,0,165,82,0,232,116,0,114,57,0,51,25,0,79,39,0,160,80,0,119,59,0,73,36,0,63,31,0,226,113,0,237,118,0,226,113,0,237,118,0,181,90,0,216,108,0,175,87,0,198,99,0,127,63,0,191,95,0,183,91,0,186,93,0,229,114,0,234,117,0,247,123,0,249,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,146,146,114,143,143,114,142,142,84,105,105,8,10,10,4,5,5,53,66,66,53,66,66,114,142,142,116,145,145,115,143,143,112,140,140,112,140,140,112,140,140,110,138,138,110,138,138,104,130,130,104,130,130,109,136,136,111,138,138,112,140,140,113,141,141,112,141,141,112,140,140,110,137,137,113,113,141,113,113,141,113,113,141,112,112,141,112,112,140,112,112,140,112,112,140,112,112,140,112,112,140,111,111,139,111,111,139,111,111,139,111,111,139,111,111,139,111,111,138,73,73,92,73,73,92,61,61,76,10,10,12,4,4,5,2,2,2,2,2,2,3,3,4,7,7,9,17,17,22,14,14,17,14,14,17,96,96,121,107,107,134,108,108,135,108,108,135,108,108,135,108,108,135,108,108,135,107,107,134,107,107,134,107,107,134,107,107,134,107,107,134,107,107,133,107,107,133,106,106,133,106,106,133,106,106,133,106,106,133,106,106,132,106,106,132,106,106,132,105,105,132,105,105,132,105,105,132,105,105,131,105,105,131,104,104,130,104,104,130,101,101,127,101,101,127,75,75,93,7,7,9,4,4,5,47,47,59,47,47,59,102,102,127,104,104,130,102,102,128,102,102,128,100,100,125,100,100,125,99,99,124,99,99,123,99,99,123,162,202,202,162,202,202,158,198,198,158,198,198,124,155,155,119,148,148,22,28,28,22,28,28,29,36,36,4,6,6,17,22,22,14,18,18,14,18,18,12,16,16,14,18,18,96,121,121,96,121,121,145,181,181,156,195,195,159,199,199,157,196,196,157,196,196,155,194,194,150,188,188,156,196,196,156,195,195,156,195,195,156,195,195,156,195,195,157,196,196,157,196,196,157,196,196,157,196,196,156,196,196,156,195,195,156,195,195,156,195,195,156,195,195,154,193,193,154,192,192,146,182,182,139,174,174,119,149,149,119,148,148,84,105,105,107,134,134,98,122,122,14,17,17,14,17,17,54,68,68,144,180,180,152,190,190,153,191,191,153,191,191,149,187,187,145,181,181,146,183,183,146,182,182,133,167,167,139,174,174,147,184,184,147,183,183,146,183,183,148,185,185,144,181,181,147,184,184,147,184,184,147,184,184,148,185,185,146,146,183,146,146,183,146,146,183,149,149,186,147,147,184,148,148,186,148,148,185,148,148,185,148,148,185,146,146,183,146,146,183,146,146,182,147,147,184,147,147,184,144,144,180,143,143,179,112,112,140,107,107,134,20,20,25,26,26,33,26,26,33,4,4,5,16,16,20,13,13,16,13,13,16,11,11,14,13,13,16,87,87,109,130,130,163,130,130,163,140,140,175,143,143,179,141,141,176,141,141,176,139,139,174,135,135,168,140,140,175,140,140,175,140,140,175,139,139,174,139,139,174,140,140,176,140,140,175,140,140,175,140,140,175,139,139,174,139,139,174,139,139,174,139,139,174,138,138,173,137,137,171,130,130,162,129,129,162,124,124,155,105,105,132,75,75,93,74,74,93,95,95,119,87,87,108,255,255,148,255,255,156,255,235,132,255,255,161,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,224,112,0,109,54,0,153,76,0,214,107,0,137,68,0,145,72,0,237,118,0,239,119,0,186,93,0,145,72,0,188,94,0,198,99,0,196,98,0,216,108,0,244,122,0,96,48,0,43,21,0,168,84,0,112,56,0,56,28,0,124,62,0,237,118,0,209,104,0,186,93,0,242,121,0,201,100,0,170,85,0,242,121,0,244,122,0,234,117,0,175,87,0,181,90,0,94,47,0,89,44,0,206,103,0,232,116,0,239,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,146,146,114,142,142,114,142,142,110,137,137,111,139,139,101,127,127,101,127,127,106,132,132,111,139,139,111,139,139,112,140,140,112,140,140,109,137,137,112,140,140,111,139,139,111,139,139,112,140,140,111,111,139,111,111,138,113,113,141,113,113,141,111,111,139,112,112,140,112,112,140,112,112,140,112,112,140,110,110,138,110,110,138,111,111,139,111,111,139,111,111,139,108,108,136,85,85,106,85,85,106,81,81,102,15,15,19,20,20,25,3,3,4,3,3,4,12,12,15,9,9,12,8,8,11,9,9,12,9,9,12,66,66,82,99,99,123,106,106,133,106,106,133,108,108,135,107,107,134,106,106,132,102,102,128,102,102,128,106,106,133,106,106,133,106,106,133,106,106,132,106,106,132,107,107,133,106,106,133,106,106,133,106,106,133,106,106,133,106,106,132,106,106,132,106,106,132,105,105,132,104,104,130,99,99,124,94,94,118,94,94,118,80,80,101,57,57,71,73,73,91,73,73,91,66,66,83,9,9,11,36,36,46,98,98,122,97,97,122,103,103,128,104,104,130,101,101,127,101,101,127,98,98,123,99,99,124,162,203,203,159,198,198,113,141,141,9,12,12,9,12,12,6,8,8,9,12,12,19,24,24,19,24,24,30,38,38,27,34,34,68,85,85,51,64,64,51,64,64,97,121,121,111,139,139,132,165,165,132,165,165,137,171,171,135,169,169,112,140,140,112,140,140,125,156,156,147,184,184,110,138,138,110,138,138,49,62,62,67,83,83,47,59,59,47,59,59,73,91,91,143,179,179,151,188,188,149,186,186,149,186,186,52,65,65,11,13,13,75,94,94,75,94,94,94,118,118,80,100,100,74,92,92,73,92,92,62,78,78,81,101,101,43,54,54,43,54,54,150,187,187,149,187,187,149,187,187,144,181,181,144,180,180,136,170,170,144,180,180,142,178,178,142,178,178,146,183,183,145,181,181,141,177,177,141,177,177,143,178,178,147,184,184,145,182,182,145,181,181,148,185,185,145,181,181,148,185,185,150,150,188,150,150,188,150,150,188,150,150,187,147,147,183,146,146,183,146,146,183,147,147,184,147,147,184,147,147,184,148,148,185,148,148,185,148,148,185,148,148,185,147,147,184,147,147,184,144,144,180,144,144,180,102,102,128,8,8,11,5,5,7,8,8,11,8,8,11,17,17,22,27,27,34,24,24,31,24,24,31,61,61,76,46,46,58,87,87,109,87,87,109,100,100,125,119,119,149,123,123,154,123,123,153,121,121,151,101,101,126,112,112,140,132,132,165,132,132,165,99,99,123,44,44,55,60,60,75,59,59,74,42,42,53,65,65,81,127,127,159,127,127,159,134,134,168,132,132,166,46,46,58,46,46,58,9,9,12,67,67,84,84,84,105,71,71,89,71,71,89,65,65,81,55,55,69,72,72,90,72,72,90,255,255,151,255,255,148,209,145,81,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,252,126,0,249,124,0,242,121,0,163,81,0,163,81,0,183,91,0,168,84,0,221,110,0,219,109,0,145,72,0,214,107,0,178,89,0,224,112,0,147,73,0,237,118,0,239,119,0,216,108,0,201,100,0,244,122,0,242,121,0,183,91,0,86,43,0,165,82,0,132,66,0,211,105,0,242,121,0,249,124,0,153,76,0,247,123,0,237,118,0,247,123,0,239,119,0,247,123,0,234,117,0,216,108,0,76,38,0,117,58,0,237,118,0,216,108,0,224,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,134,134,108,135,135,111,139,139,110,137,137,110,137,137,112,140,140,109,137,137,111,139,139,111,139,139,113,113,142,113,113,141,113,113,141,110,110,138,110,110,138,110,110,138,111,111,139,111,111,139,111,111,139,112,112,140,112,112,140,111,111,139,111,111,139,111,111,139,111,111,139,108,108,136,108,108,135,77,77,96,6,6,8,4,4,5,6,6,8,6,6,8,13,13,16,21,21,26,18,18,23,18,18,23,46,46,58,35,35,44,66,66,82,66,66,82,75,75,94,90,90,112,93,93,116,93,93,116,91,91,114,76,76,95,85,85,106,100,100,125,100,100,125,74,74,93,33,33,42,45,45,56,45,45,56,32,32,40,49,49,62,96,96,121,96,96,121,102,102,127,100,100,126,35,35,44,35,35,44,7,7,9,51,51,64,64,64,80,63,63,79,54,54,67,49,49,62,42,42,53,55,55,68,55,55,68,29,29,37,101,101,126,101,101,126,101,101,126,101,101,126,97,97,122,92,92,115,14,18,18,14,18,18,19,24,24,4,6,6,1,2,2,1,2,2,60,75,75,39,49,49,17,22,22,17,22,22,61,77,77,143,179,179,146,183,183,146,182,182,146,182,182,111,139,139,59,74,74,59,74,74,61,76,76,37,46,46,11,14,14,11,14,14,99,124,124,148,185,185,102,128,128,102,128,128,142,178,178,89,112,112,113,142,142,113,141,141,153,191,191,119,149,149,47,59,59,47,59,59,41,51,51,14,17,17,9,11,11,9,11,11,109,136,136,112,140,140,67,84,84,67,84,84,86,108,108,96,120,120,151,188,188,150,188,188,150,188,188,153,192,192,147,183,183,146,183,183,140,175,175,135,169,169,123,153,153,122,153,153,141,176,176,141,176,176,134,168,168,134,168,168,145,181,181,148,185,185,148,185,185,147,184,184,144,180,180,141,176,176,148,186,186,148,185,185,151,151,189,151,151,189,151,151,188,147,147,184,144,144,180,148,148,186,148,148,185,150,150,187,148,148,185,148,148,185,147,147,184,149,149,186,149,149,186,148,148,186,148,148,185,146,146,183,142,142,177,85,85,106,85,85,106,13,13,16,17,17,22,4,4,5,4,4,5,1,1,1,54,54,68,35,35,44,35,35,44,16,16,20,55,55,69,129,129,161,128,128,161,131,131,164,131,131,164,100,100,125,100,100,125,53,53,67,55,55,68,33,33,41,33,33,41,10,10,12,89,89,111,132,132,165,132,132,165,91,91,114,127,127,159,80,80,100,79,79,99,101,101,126,136,136,170,106,106,133,106,106,132,42,42,53,36,36,45,12,12,15,12,12,15,8,8,10,96,96,121,99,99,124,99,99,124,60,60,75,76,76,95,84,84,106,255,255,151,255,255,150,255,180,101,255,255,161,252,126,0,252,126,0,252,126,0,252,126,0,247,123,0,214,107,0,132,66,0,124,62,0,153,76,0,229,114,0,244,122,0,226,113,0,211,105,0,234,117,0,175,87,0,188,94,0,188,94,0,102,51,0,216,108,0,239,119,0,237,118,0,249,124,0,247,123,0,249,124,0,224,112,0,229,114,0,153,76,0,178,89,0,244,122,0,249,124,0,242,121,0,244,122,0,214,107,0,168,84,0,237,118,0,249,124,0,214,107,0,239,119,0,247,123,0,170,85,0,188,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,137,137,111,139,139,111,139,139,111,139,139,108,136,136,106,133,133,106,132,132,111,139,139,114,114,142,113,113,142,113,113,142,111,111,139,108,108,135,108,108,135,111,111,139,112,112,141,111,111,139,111,111,139,111,111,138,112,112,140,111,111,139,111,111,139,111,111,139,110,110,137,106,106,133,106,106,133,63,63,79,10,10,12,13,13,16,13,13,16,3,3,4,1,1,1,41,41,51,41,41,51,26,26,33,12,12,15,41,41,52,41,41,52,96,96,121,99,99,123,98,98,123,98,98,123,75,75,94,40,40,50,41,41,51,41,41,51,25,25,31,7,7,9,67,67,84,67,67,84,99,99,124,69,69,86,96,96,120,96,96,120,60,60,75,76,76,95,103,103,129,103,103,129,80,80,100,32,32,40,27,27,34,27,27,34,9,9,12,6,6,8,73,73,91,73,73,91,75,75,94,45,45,57,58,58,72,58,58,72,64,64,80,101,101,126,101,101,126,101,101,126,0,0,0,4,6,6,4,6,6,9,12,12,13,16,16,13,16,16,59,73,73,68,85,85,107,134,134,107,134,134,142,177,177,161,201,201,159,199,199,159,199,199,159,199,199,144,180,180,113,142,142,113,141,141,115,143,143,114,143,143,114,143,143,147,183,183,156,195,195,154,193,193,154,193,193,140,175,175,110,138,138,149,186,186,149,186,186,157,196,196,150,188,188,129,161,161,129,161,161,105,131,131,68,85,85,68,85,85,106,133,133,138,172,172,150,188,188,150,188,188,99,124,124,143,179,179,151,189,189,151,189,189,149,187,187,151,189,189,152,190,190,152,190,190,147,184,184,139,174,174,139,174,174,147,183,183,145,181,181,149,187,187,149,186,186,146,182,182,136,170,170,139,174,174,139,174,174,139,174,174,139,173,173,145,181,181,145,181,181,147,184,184,152,152,190,152,152,190,151,151,189,150,150,187,145,145,181,145,145,181,148,148,185,150,150,188,150,150,188,150,150,188,150,150,187,150,150,187,149,149,187,149,149,187,146,146,183,144,144,180,144,144,180,145,145,182,84,84,105,5,5,7,5,5,7,4,4,5,0,0,0,4,4,5,4,4,5,8,8,11,11,11,14,53,53,66,53,53,66,62,62,77,97,97,121,97,97,121,127,127,159,145,145,181,143,143,179,143,143,179,143,143,178,129,129,162,101,101,127,101,101,127,103,103,128,102,102,128,131,131,164,131,131,164,139,139,174,138,138,172,125,125,156,124,124,156,98,98,123,133,133,166,132,132,166,139,139,174,133,133,167,115,115,143,114,114,143,93,93,116,60,60,75,94,94,118,94,94,118,122,122,152,133,133,166,88,88,110,88,88,110,127,127,158,133,133,167,255,255,143,138,96,53,255,255,161,252,126,0,252,126,0,242,121,0,249,124,0,206,103,0,155,77,0,191,95,0,221,110,0,237,118,0,216,108,0,237,118,0,219,109,0,219,109,0,163,81,0,122,61,0,145,72,0,181,90,0,204,102,0,206,103,0,244,122,0,229,114,0,214,107,0,209,104,0,224,112,0,244,122,0,168,84,0,119,59,0,132,66,0,96,48,0,244,122,0,239,119,0,224,112,0,198,99,0,196,98,0,247,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,128,128,104,131,131,104,130,130,104,130,130,104,130,130,108,136,136,111,138,138,110,138,138,114,114,142,113,113,142,113,113,142,112,112,140,108,108,136,111,111,138,110,110,138,112,112,141,112,112,140,112,112,140,112,112,140,112,112,140,112,112,140,109,109,137,109,109,136,108,108,135,109,109,136,109,109,136,62,62,78,4,4,5,3,3,4,3,3,4,0,0,0,3,3,4,6,6,8,6,6,8,8,8,11,39,39,49,46,46,58,46,46,58,72,72,91,95,95,119,95,95,119,108,108,136,107,107,134,107,107,134,107,107,134,97,97,121,76,76,95,77,77,96,77,77,96,77,77,96,98,98,123,105,105,131,105,105,131,103,103,129,94,94,117,93,93,117,74,74,92,100,100,125,105,105,131,105,105,131,100,100,126,86,86,108,70,70,88,70,70,88,45,45,57,71,71,89,92,92,115,92,92,115,100,100,126,66,66,83,66,66,83,96,96,120,6,8,8,6,8,8,6,8,8,11,14,14,9,12,12,9,12,12,21,26,26,114,143,143,144,180,180,144,180,180,160,200,200,156,196,196,155,193,193,155,193,193,153,191,191,153,191,191,152,191,191,159,199,199,160,201,201,160,200,200,160,200,200,158,198,198,153,192,192,153,191,191,124,155,155,124,155,155,146,183,183,146,183,183,133,166,166,151,188,188,150,188,188,155,194,194,156,196,196,147,184,184,147,183,183,138,173,173,121,151,151,90,113,113,90,113,113,146,182,182,155,194,194,155,194,194,150,188,188,145,181,181,140,175,175,140,175,175,137,171,171,137,171,171,136,171,171,146,182,182,149,186,186,150,188,188,150,187,187,145,181,181,140,175,175,140,175,175,143,179,179,138,173,173,136,171,171,136,170,170,139,174,174,144,180,180,153,153,191,152,152,191,151,151,188,151,151,188,150,150,188,152,152,190,151,151,189,151,151,189,151,151,189,149,149,187,149,149,187,149,149,186,150,150,188,150,150,188,148,148,185,148,148,185,149,149,187,149,149,187,149,149,186,149,149,186,144,144,180,99,99,124,99,99,123,17,17,22,26,26,33,5,5,7,5,5,7,5,5,7,10,10,13,10,10,13,8,8,11,19,19,24,103,103,129,103,103,129,129,129,162,144,144,180,144,144,180,140,140,176,139,139,174,137,137,171,137,137,171,137,137,171,142,142,178,142,142,178,143,143,179,143,143,179,141,141,177,141,141,176,137,137,171,110,110,138,110,110,138,110,110,138,130,130,163,118,118,148,118,118,148,134,134,167,138,138,172,139,139,174,139,139,173,130,130,162,123,123,153,122,122,153,107,107,133,80,80,100,129,129,161,128,128,161,137,137,171,255,232,130,167,116,65,255,255,161,252,126,0,249,124,0,232,116,0,158,79,0,145,72,0,229,114,0,226,113,0,244,122,0,242,121,0,247,123,0,216,108,0,168,84,0,183,91,0,226,113,0,114,57,0,150,75,0,99,49,0,193,96,0,224,112,0,209,104,0,237,118,0,234,117,0,183,91,0,175,87,0,211,105,0,181,90,0,247,123,0,229,114,0,201,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,131,131,105,131,131,107,134,134,103,129,129,102,127,127,102,127,127,104,130,130,107,134,134,107,134,134,114,114,142,112,112,141,112,112,140,112,112,140,113,113,141,113,113,141,113,113,141,113,113,141,111,111,139,111,111,139,111,111,139,112,112,140,112,112,140,110,110,138,110,110,138,111,111,139,111,111,139,111,111,139,111,111,139,107,107,134,73,73,92,73,73,92,13,13,16,20,20,25,20,20,25,4,4,5,4,4,5,7,7,9,7,7,9,6,6,8,14,14,17,77,77,96,77,77,96,96,96,121,107,107,134,107,107,134,105,105,131,103,103,129,102,102,128,102,102,128,102,102,128,106,106,133,106,106,133,107,107,134,107,107,134,106,106,132,106,106,132,102,102,128,83,83,103,83,83,103,82,82,103,97,97,122,89,89,111,89,89,111,100,100,125,103,103,129,104,104,130,104,104,130,98,98,122,92,92,115,92,92,115,80,80,100,23,28,28,39,49,49,39,49,49,39,49,49,49,61,61,49,61,61,121,152,152,159,199,199,160,201,201,160,201,201,162,202,202,162,202,202,162,202,202,161,202,202,161,202,202,161,202,202,161,201,201,161,201,201,159,199,199,159,199,199,141,176,176,137,172,172,137,172,172,81,101,101,148,186,186,142,177,177,142,177,177,69,86,86,109,137,137,109,136,136,151,189,189,139,174,174,139,174,174,131,164,164,76,96,96,136,170,170,135,169,169,156,195,195,157,197,197,157,197,197,152,191,191,146,182,182,142,178,178,142,178,178,147,184,184,155,193,193,154,193,193,151,189,189,145,181,181,144,181,181,141,177,177,149,186,186,146,182,182,145,182,182,133,166,166,147,183,183,146,183,183,138,173,173,132,165,165,138,173,173,138,172,172,153,153,192,151,151,189,151,151,189,151,151,189,151,151,189,152,152,190,152,152,190,150,150,188,149,149,186,148,148,186,151,151,189,151,151,189,151,151,189,151,151,188,150,150,188,150,150,188,150,150,188,150,150,187,150,150,187,149,149,187,149,149,187,149,149,186,141,141,177,141,141,176,99,99,124,25,25,31,25,25,31,28,28,35,20,20,26,20,20,26,35,35,44,35,35,44,44,44,55,44,44,55,109,109,137,143,143,179,143,143,179,144,144,180,145,145,182,145,145,181,145,145,181,145,145,181,144,144,181,144,144,180,144,144,180,144,144,180,143,143,179,142,142,177,126,126,157,123,123,153,122,122,153,72,72,90,132,132,165,132,132,165,126,126,157,61,61,77,97,97,121,97,97,121,134,134,167,123,123,154,123,123,154,116,116,145,67,67,84,67,67,84,120,120,150,138,138,172,139,139,174,139,139,173,255,255,155,255,235,132,255,255,158,252,126,0,114,57,0,89,44,0,84,42,0,242,121,0,244,122,0,232,116,0,234,117,0,239,119,0,239,119,0,214,107,0,193,96,0,168,84,0,219,109,0,224,112,0,142,71,0,107,53,0,81,40,0,158,79,0,196,98,0,244,122,0,122,61,0,237,118,0,237,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111,139,139,108,136,136,99,124,124,99,124,124,109,137,137,103,129,129,98,123,123,98,123,123,103,128,128,114,114,143,114,114,142,113,113,141,112,112,141,112,112,140,112,112,140,113,113,141,112,112,140,112,112,140,110,110,138,112,112,141,112,112,140,112,112,140,112,112,140,112,112,140,112,112,140,111,111,139,111,111,139,111,111,139,111,111,139,111,111,139,111,111,138,110,110,138,105,105,131,73,73,92,73,73,92,18,18,23,21,21,26,15,15,19,15,15,19,26,26,33,26,26,33,26,26,33,33,33,41,81,81,101,81,81,101,106,106,133,107,107,134,108,108,135,108,108,135,108,108,135,108,108,135,107,107,134,107,107,134,107,107,134,107,107,134,107,107,134,106,106,132,94,94,117,94,94,117,91,91,114,53,53,67,53,53,67,98,98,123,94,94,118,46,46,57,46,46,57,72,72,90,100,100,125,100,100,125,92,92,116,44,55,55,72,91,91,72,91,91,102,128,128,79,99,99,79,99,99,143,179,179,151,189,189,151,189,189,159,199,199,162,203,203,162,203,203,162,202,202,162,202,202,157,196,196,157,196,196,114,143,143,37,46,46,37,46,46,63,79,79,27,34,34,27,34,34,13,16,16,30,38,38,30,38,38,71,89,89,121,151,151,137,171,171,137,171,171,133,167,167,90,112,112,90,112,112,115,144,144,154,192,192,154,192,192,158,198,198,158,198,198,158,198,198,158,197,197,156,195,195,153,191,191,152,191,191,156,195,195,151,188,188,150,188,188,133,166,166,145,182,182,145,182,182,150,187,187,146,183,183,146,183,183,144,181,181,146,182,182,144,180,180,144,180,180,147,184,184,148,186,186,148,185,185,145,181,181,154,154,193,154,154,192,154,154,192,152,152,190,152,152,190,152,152,190,153,153,191,153,153,191,152,152,191,152,152,190,149,149,186,149,149,186,152,152,190,151,151,189,151,151,189,151,151,189,151,151,189,151,151,188,150,150,188,150,150,188,150,150,188,150,150,187,150,150,187,149,149,187,149,149,187,147,147,184,131,131,163,131,131,163,42,42,52,21,21,26,14,14,18,14,14,18,40,40,50,65,65,82,65,65,81,92,92,115,71,71,89,71,71,89,128,128,161,136,136,170,135,135,169,143,143,178,145,145,182,145,145,181,145,145,181,145,145,181,140,140,175,140,140,175,102,102,127,33,33,41,33,33,41,56,56,70,24,24,30,24,24,30,11,11,14,27,27,34,63,63,79,63,63,79,107,107,134,121,121,152,121,121,152,118,118,148,79,79,99,79,79,99,102,102,127,136,136,170,140,140,175,140,140,175,139,139,174,139,139,174,139,139,174,255,255,150,255,255,145,132,66,0,137,68,0,102,51,0,122,61,0,239,119,0,244,122,0,234,117,0,244,122,0,247,123,0,232,116,0,232,116,0,209,104,0,173,86,0,239,119,0,237,118,0,247,123,0,84,42,0,188,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,135,135,107,134,134,108,136,136,107,134,134,107,134,134,109,136,136,110,138,138,108,135,135,107,134,134,114,114,143,114,114,143,114,114,142,112,112,141,112,112,141,112,112,140,113,113,142,113,113,141,113,113,141,113,113,141,110,110,138,112,112,140,112,112,140,112,112,140,112,112,140,112,112,140,111,111,139,111,111,139,111,111,139,111,111,139,111,111,139,111,111,138,111,111,138,110,110,138,109,109,136,109,109,136,97,97,121,31,31,38,31,31,38,15,15,19,11,11,13,11,11,13,29,29,37,48,48,60,68,68,85,68,68,85,52,52,66,95,95,119,95,95,119,100,100,126,106,106,132,106,106,132,108,108,135,107,107,134,107,107,134,107,107,134,104,104,130,75,75,94,75,75,94,24,24,31,42,42,52,42,42,52,18,18,22,8,8,10,8,8,10,20,20,25,47,47,59,47,47,58,80,80,100,81,101,101,81,101,101,87,109,109,97,122,122,97,122,122,124,155,155,153,192,192,153,191,191,161,202,202,163,203,203,163,203,203,162,203,203,162,203,203,154,192,192,154,192,192,155,194,194,157,196,196,157,196,196,153,192,192,143,179,179,143,179,179,151,189,189,154,193,193,154,193,193,151,188,188,121,152,152,121,152,152,116,145,145,124,155,155,124,155,155,156,195,195,159,199,199,159,199,199,159,199,199,159,199,199,157,196,196,157,196,196,155,194,194,155,194,194,155,194,194,158,197,197,158,197,197,157,197,197,151,189,189,152,191,191,152,190,190,152,190,190,150,188,188,150,188,188,144,180,180,150,187,187,150,187,187,143,179,179,146,183,183,146,183,183,150,188,188,150,188,188,155,155,194,155,155,193,154,154,193,154,154,193,154,154,193,151,151,189,152,152,190,152,152,190,152,152,190,148,148,186,148,148,185,151,151,189,151,151,189,151,151,189,147,147,184,150,150,188,150,150,188,148,148,186,150,150,187,150,150,187,151,151,189,151,151,188,150,150,188,150,150,188,149,149,186,138,138,172,138,138,172,22,22,28,25,25,32,25,25,32,4,4,5,33,33,41,33,33,41,75,75,93,59,59,74,59,59,74,73,73,91,79,79,98,79,79,98,87,87,109,111,111,139,111,111,139,137,137,172,144,144,181,144,144,180,146,146,182,145,145,182,145,145,181,145,145,181,137,137,172,139,139,173,138,138,173,140,140,175,136,136,171,136,136,170,127,127,159,134,134,168,134,134,168,137,137,171,134,134,167,133,133,167,107,107,134,103,103,129,103,103,129,110,110,137,138,138,173,138,138,172,140,140,176,140,140,175,140,140,175,140,140,175,138,138,173,136,136,171,255,255,145,127,63,0,168,84,0,201,100,0,244,122,0,163,81,0,160,80,0,204,102,0,204,102,0,229,114,0,237,118,0,229,114,0,237,118,0,216,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111,139,139,106,133,133,111,139,139,111,139,139,106,133,133,108,135,135,108,135,135,111,139,139,111,139,139,111,139,139,114,114,143,114,114,143,114,114,143,114,114,142,111,111,139,112,112,140,112,112,140,112,112,140,109,109,137,109,109,137,111,111,139,111,111,139,111,111,139,109,109,136,111,111,139,111,111,138,109,109,137,110,110,138,110,110,138,111,111,139,111,111,139,111,111,139,111,111,138,109,109,137,101,101,127,101,101,127,16,16,20,18,18,23,18,18,23,3,3,4,24,24,30,24,24,30,55,55,69,44,44,55,44,44,55,54,54,67,58,58,72,58,58,72,64,64,81,82,82,102,82,82,102,101,101,127,107,107,133,107,107,133,107,107,134,107,107,134,107,107,134,107,107,134,102,102,127,102,102,128,102,102,128,103,103,129,101,101,126,101,101,126,94,94,118,100,100,125,99,99,124,91,114,114,106,132,132,139,174,174,139,174,174,140,176,176,155,194,194,155,194,194,158,198,198,161,202,202,161,202,202,161,202,202,92,115,115,75,94,94,75,94,94,37,47,47,54,67,67,54,67,67,70,88,88,49,61,61,49,61,61,65,81,81,129,161,161,128,161,161,136,171,171,60,75,75,60,75,75,16,20,20,138,172,172,137,172,172,160,200,200,160,200,200,160,200,200,160,200,200,156,195,195,156,195,195,157,197,197,156,195,195,155,194,194,155,194,194,152,190,190,152,190,190,152,190,190,151,189,189,151,189,189,150,187,187,153,191,191,152,191,191,146,182,182,154,192,192,153,192,192,149,186,186,139,174,174,139,173,173,151,189,189,146,183,183,146,183,183,155,155,194,155,155,194,155,155,194,155,155,194,155,155,193,154,154,193,154,154,193,154,154,193,154,154,192,154,154,192,150,150,188,150,150,188,153,153,191,153,153,191,153,153,191,149,149,187,151,151,189,151,151,188,152,152,190,152,152,190,152,152,190,151,151,189,151,151,189,151,151,189,142,142,177,30,30,38,30,30,38,42,42,53,69,69,87,69,69,87,6,6,7,7,7,9,7,7,9,63,63,79,123,123,154,123,123,154,85,85,106,82,82,103,82,82,102,95,95,119,125,125,156,125,125,156,126,126,158,139,139,174,139,139,174,142,142,177,145,145,181,144,144,180,144,144,180,82,82,103,82,82,102,67,67,84,33,33,42,33,33,42,48,48,60,62,62,78,62,62,78,43,43,54,58,58,72,57,57,72,114,114,142,121,121,151,121,121,151,53,53,66,14,14,17,14,14,17,121,121,152,141,141,177,141,141,176,141,141,176,140,140,176,140,140,175,137,137,172,138,138,173,138,138,173,242,121,0,244,122,0,234,117,0,211,105,0,232,116,0,242,121,0,234,117,0,131,131,163,130,130,163,133,133,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,141,141,108,135,135,108,135,135,113,142,142,110,137,137,110,137,137,102,128,128,112,140,140,111,139,139,108,135,135,115,115,143,114,114,143,114,114,143,114,114,143,114,114,142,114,114,142,114,114,142,113,113,142,113,113,142,113,113,141,113,113,141,110,110,138,113,113,141,112,112,141,112,112,140,110,110,137,110,110,137,111,111,138,112,112,140,111,111,139,111,111,139,111,111,139,111,111,139,111,111,139,104,104,130,104,104,130,22,22,27,31,31,39,31,31,39,51,51,64,4,4,5,4,4,5,5,5,6,46,46,58,46,46,58,90,90,113,62,62,78,62,62,78,60,60,75,70,70,88,70,70,87,92,92,115,93,93,116,93,93,116,102,102,128,104,104,131,104,104,130,106,106,133,106,106,133,60,60,76,60,60,75,49,49,62,24,24,31,24,24,31,35,35,44,46,46,57,104,131,131,116,145,145,133,166,166,133,166,166,161,201,201,162,203,203,162,203,203,162,203,203,162,202,202,148,186,186,87,109,109,87,109,109,66,82,82,93,117,117,93,117,117,67,84,84,72,90,90,72,90,90,114,143,143,154,192,192,154,192,192,135,169,169,31,38,38,31,38,38,9,12,12,79,99,99,79,99,99,156,195,195,160,201,201,160,201,201,160,200,200,157,196,196,157,196,196,158,198,198,156,195,195,156,195,195,156,195,195,151,189,189,151,189,189,155,194,194,157,196,196,157,196,196,153,192,192,153,192,192,148,185,185,151,189,189,151,189,189,149,187,187,149,187,187,149,186,186,152,190,190,150,188,188,150,188,188,155,194,194,156,156,195,156,156,195,156,156,195,156,156,195,155,155,194,155,155,194,155,155,194,155,155,194,155,155,193,154,154,193,154,154,193,151,151,189,152,152,191,152,152,190,152,152,190,152,152,190,152,152,190,153,153,191,153,153,191,153,153,191,152,152,191,152,152,190,152,152,190,150,150,188,150,150,188,127,127,159,9,9,11,9,9,11,19,19,24,114,114,142,114,114,142,31,31,39,6,6,7,6,6,7,9,9,11,36,36,45,36,36,45,102,102,128,100,100,126,100,100,125,91,91,114,94,94,118,94,94,117,104,104,130,119,119,149,119,119,149,144,144,180,145,145,182,145,145,181,145,145,181,133,133,166,132,132,166,78,78,97,58,58,73,58,58,73,83,83,104,60,60,75,60,60,75,64,64,80,102,102,127,101,101,127,136,136,170,136,136,170,120,120,150,27,27,34,27,27,34,8,8,10,70,70,88,70,70,88,137,137,172,141,141,177,141,141,177,141,141,176,138,138,172,138,138,172,139,139,174,137,137,172,247,123,0,137,137,171,132,132,165,132,132,165,136,136,170,137,137,172,137,137,171,134,134,168,129,129,162,129,129,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,137,137,112,140,140,110,138,138,110,138,138,110,137,137,112,140,140,112,140,140,111,138,138,114,142,142,114,142,142,115,115,143,114,114,143,114,114,143,114,114,143,114,114,143,114,114,142,114,114,142,113,113,142,113,113,142,113,113,142,111,111,138,111,111,138,111,111,139,111,111,139,111,111,139,111,111,139,111,111,139,112,112,140,112,112,140,112,112,140,111,111,139,111,111,139,111,111,139,110,110,137,93,93,116,93,93,116,6,6,8,14,14,18,14,14,18,83,83,104,23,23,29,23,23,29,4,4,5,6,6,8,6,6,8,26,26,33,75,75,93,75,75,93,73,73,92,67,67,83,67,67,83,69,69,86,76,76,96,76,76,95,87,87,109,106,106,132,105,105,132,106,106,133,106,106,133,106,106,133,97,97,122,97,97,122,57,57,71,43,43,54,106,133,133,90,112,112,90,112,112,136,170,170,136,170,170,157,197,197,159,199,199,159,199,199,159,199,199,160,200,200,160,200,200,153,192,192,158,198,198,158,198,198,156,195,195,156,195,195,156,195,195,138,172,172,34,43,43,34,43,43,41,51,51,41,51,51,95,118,118,44,55,55,44,55,55,114,142,142,159,199,199,159,199,199,161,201,201,161,201,201,161,201,201,160,201,201,160,200,200,160,200,200,160,200,200,160,200,200,160,200,200,158,197,197,158,197,197,154,193,193,151,189,189,151,188,188,139,174,174,154,192,192,153,192,192,150,188,188,151,189,189,151,189,189,153,191,191,153,191,191,152,191,191,151,188,188,157,157,196,157,157,196,156,156,196,156,156,196,156,156,195,156,156,195,156,156,195,156,156,195,155,155,194,155,155,194,155,155,194,155,155,194,155,155,193,154,154,193,154,154,193,154,154,193,154,154,192,154,154,192,154,154,192,153,153,192,153,153,192,153,153,191,153,153,191,153,153,191,146,146,183,32,32,40,32,32,40,19,19,24,102,102,128,102,102,128,110,110,137,139,139,173,138,138,173,32,32,40,31,31,39,13,13,17,3,3,3,3,3,3,6,6,7,34,34,43,34,34,43,79,79,99,103,103,129,103,103,129,100,100,125,95,95,119,95,95,119,80,80,100,122,122,153,122,122,152,141,141,176,141,141,176,142,142,178,142,142,177,142,142,177,143,143,179,137,137,171,136,136,171,141,141,176,139,139,174,139,139,174,139,139,173,122,122,153,122,122,153,30,30,38,36,36,45,36,36,45,84,84,105,83,83,104,39,39,48,101,101,126,100,100,126,140,140,176,142,142,177,141,141,177,141,141,177,141,141,176,141,141,176,140,140,176,140,140,175,140,140,175,140,140,175,140,140,175,138,138,172,135,135,169,135,135,168,132,132,165,122,122,152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,128,128,113,141,141,113,141,141,110,138,138,111,139,139,111,139,139,112,140,140,112,140,140,112,140,140,110,138,138,110,138,138,115,115,144,115,115,143,114,114,143,114,114,143,114,114,143,114,114,142,114,114,142,114,114,142,113,113,142,113,113,142,113,113,141,113,113,141,113,113,141,113,113,141,112,112,141,112,112,140,112,112,140,112,112,140,112,112,140,112,112,140,111,111,139,111,111,139,111,111,139,106,106,133,23,23,29,23,23,29,14,14,18,75,75,93,74,74,93,80,80,100,101,101,126,101,101,126,23,23,29,23,23,29,9,9,12,2,2,2,2,2,2,4,4,5,25,25,31,25,25,31,58,58,72,75,75,94,75,75,94,73,73,91,70,70,87,70,70,87,59,59,73,89,89,111,89,89,111,103,103,129,103,103,129,104,104,130,113,142,142,113,142,142,90,112,112,90,112,112,133,166,166,154,193,193,154,193,193,159,199,199,159,199,199,159,199,199,159,199,199,155,194,194,155,194,194,114,142,142,114,142,142,16,20,20,47,59,59,47,59,59,125,156,156,120,150,150,120,150,150,88,110,110,60,75,75,60,75,75,145,182,182,145,182,182,161,202,202,161,202,202,161,202,202,161,201,201,158,197,197,157,197,197,156,195,195,156,195,195,155,194,194,155,194,194,155,194,194,155,194,194,153,192,192,153,191,191,154,193,193,154,193,193,154,193,193,152,191,191,152,190,190,144,180,180,153,192,192,153,192,192,155,194,194,155,193,193,154,193,193,157,157,197,156,156,195,155,155,194,157,157,196,157,157,196,157,157,196,156,156,196,156,156,195,156,156,195,156,156,195,156,156,195,154,154,192,155,155,194,155,155,194,155,155,194,155,155,193,154,154,193,154,154,193,154,154,193,154,154,193,154,154,192,154,154,192,149,149,186,85,85,106,85,85,106,23,23,29,23,23,28,52,52,65,144,144,181,144,144,180,149,149,186,152,152,190,151,151,189,150,150,187,65,65,82,65,65,82,6,6,7,6,6,7,13,13,17,15,15,18,15,15,18,13,13,17,7,7,9,7,7,9,12,12,15,63,63,79,63,63,78,105,105,131,104,104,131,101,101,127,80,80,100,80,80,100,119,119,149,138,138,173,138,138,172,142,142,178,142,142,177,142,142,177,141,141,177,141,141,177,138,138,173,101,101,126,101,101,126,14,14,18,42,42,53,42,42,52,110,110,138,110,110,138,106,106,132,78,78,98,78,78,97,53,53,66,128,128,160,128,128,160,142,142,178,142,142,177,142,142,177,141,141,177,141,141,177,138,138,173,136,136,171,136,136,170,136,136,170,136,136,170,136,136,170,135,135,169,134,134,167,133,133,167,135,135,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,142,142,113,141,141,112,140,140,112,140,140,105,132,132,112,141,141,112,140,140,113,142,142,113,141,141,113,141,141,115,115,144,115,115,144,114,114,142,114,114,143,114,114,143,114,114,143,114,114,143,114,114,142,114,114,142,113,113,142,113,113,142,112,112,140,112,112,140,113,113,141,113,113,141,113,113,141,112,112,141,112,112,140,112,112,140,112,112,140,112,112,140,112,112,140,108,108,135,108,108,135,62,62,77,16,16,21,16,16,21,38,38,47,38,38,47,105,105,131,108,108,135,108,108,135,110,110,138,109,109,136,109,109,136,47,47,59,4,4,5,4,4,5,9,9,12,9,9,12,11,11,13,9,9,12,9,9,12,5,5,6,8,8,10,8,8,10,46,46,57,76,76,95,76,76,95,74,74,92,74,74,92,72,90,90,90,113,113,90,112,112,112,140,140,123,154,154,123,154,154,123,154,154,123,154,154,119,149,149,51,64,64,51,64,64,9,12,12,4,6,6,4,6,6,56,70,70,56,70,70,148,186,186,80,101,101,80,101,101,112,140,140,133,166,166,133,166,166,115,143,143,115,143,143,162,203,203,162,203,203,162,202,202,162,202,202,160,200,200,160,200,200,160,200,200,159,199,199,154,193,193,154,193,193,154,193,193,157,197,197,155,194,194,155,194,194,155,194,194,155,194,194,155,194,194,150,187,187,150,187,187,151,189,189,153,191,191,152,191,191,157,196,196,157,196,196,155,194,194,158,158,198,158,158,198,158,158,197,158,158,197,157,157,197,157,157,197,157,157,196,157,157,196,157,157,196,157,157,196,155,155,194,153,153,191,153,153,191,156,156,195,156,156,195,155,155,194,155,155,194,155,155,194,155,155,194,155,155,193,154,154,193,154,154,193,154,154,193,151,151,189,62,62,77,62,62,77,34,34,42,105,105,131,105,105,131,147,147,183,146,146,183,128,128,160,152,152,190,152,152,190,150,150,188,141,141,176,141,141,176,45,45,57,45,45,57,4,4,5,13,13,17,13,13,17,12,12,15,7,7,9,7,7,9,1,1,1,1,1,1,9,9,11,22,22,28,22,22,28,58,58,73,64,64,80,64,64,80,80,80,101,80,80,100,100,100,125,110,110,137,110,110,137,109,109,137,106,106,133,106,106,133,45,45,57,45,45,57,8,8,11,4,4,5,4,4,5,49,49,62,131,131,164,131,131,164,71,71,89,71,71,89,99,99,123,117,117,147,117,117,147,101,101,126,143,143,179,143,143,178,142,142,178,142,142,178,142,142,177,140,140,175,140,140,175,140,140,175,135,135,169,135,135,169,135,135,169,135,135,168,137,137,172,136,136,170,135,135,169,135,135,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,142,142,113,142,142,113,142,142,109,137,137,110,138,138,110,138,138,111,139,139,111,139,139,114,143,143,113,142,142,113,141,141,115,115,144,115,115,144,115,115,144,115,115,143,114,114,143,114,114,143,114,114,143,114,114,143,114,114,142,112,112,141,112,112,140,111,111,139,111,111,139,113,113,141,113,113,141,113,113,141,112,112,141,112,112,141,112,112,140,112,112,140,112,112,140,112,112,140,109,109,137,109,109,137,45,45,56,24,24,30,24,24,30,76,76,95,76,76,95,106,106,133,92,92,116,92,92,116,110,110,138,109,109,136,109,109,136,102,102,127,102,102,127,33,33,41,3,3,4,3,3,4,9,9,12,8,8,11,8,8,11,5,5,6,5,5,6,1,1,1,6,6,8,6,6,8,16,16,20,15,18,18,15,18,18,20,25,25,20,25,25,20,25,25,70,87,87,70,87,87,60,75,75,78,98,98,78,97,97,31,39,39,31,39,39,124,155,155,161,201,201,161,201,201,160,201,201,160,200,200,153,192,192,155,194,194,155,194,194,92,115,115,156,195,195,156,195,195,161,201,201,161,201,201,162,203,203,157,197,197,157,196,196,155,194,194,155,194,194,153,192,192,153,192,192,153,191,191,158,197,197,154,193,193,154,193,193,156,195,195,156,195,195,155,194,194,155,194,194,155,194,194,157,196,196,156,196,196,156,195,195,159,199,199,159,199,199,154,193,193,159,159,199,159,159,198,158,158,198,158,158,198,158,158,198,158,158,198,158,158,197,154,154,193,154,154,193,149,149,187,155,155,194,155,155,194,157,157,196,157,157,196,156,156,196,156,156,195,156,156,195,156,156,195,156,156,195,155,155,194,155,155,194,155,155,194,155,155,194,136,136,170,136,136,170,20,20,25,20,20,25,109,109,136,143,143,179,143,143,178,136,136,170,136,136,170,136,136,170,145,145,181,145,145,181,143,143,179,151,151,188,150,150,188,150,150,188,150,150,188,59,59,74,3,3,3,3,3,3,0,0,0,3,3,3,3,3,3,4,4,5,4,4,5,9,9,11,10,10,13,10,10,13,27,27,33,27,27,33,27,27,33,12,12,15,12,12,15,13,13,16,17,17,22,17,17,22,17,17,22,17,17,22,62,62,78,53,53,66,53,53,66,69,69,87,69,69,86,28,28,35,110,110,138,110,110,138,142,142,178,142,142,178,142,142,177,136,136,170,135,135,169,137,137,171,81,81,101,81,81,101,137,137,172,137,137,172,141,141,177,143,143,178,142,142,178,138,138,172,136,136,170,136,136,170,134,134,168,134,134,168,134,134,167,138,138,172,138,138,172,135,135,168,134,134,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,142,142,114,142,142,113,142,142,113,142,142,113,141,141,114,143,143,114,142,142,114,142,142,116,145,145,116,145,145,112,140,140,112,140,140,115,115,144,115,115,144,115,115,144,115,115,143,115,115,143,114,114,143,112,112,140,112,112,140,108,108,135,113,113,141,112,112,141,113,113,142,113,113,142,113,113,141,113,113,141,113,113,141,113,113,141,112,112,141,112,112,140,112,112,140,112,112,140,112,112,140,98,98,123,98,98,123,14,14,18,14,14,18,78,78,98,103,103,129,103,103,129,98,98,123,98,98,123,98,98,123,105,105,131,104,104,131,103,103,129,109,109,136,108,108,136,108,108,136,108,108,135,43,43,54,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,3,3,4,3,3,4,45,56,56,35,44,44,35,44,44,46,58,58,40,50,50,40,50,50,26,33,33,26,33,33,66,83,83,146,183,183,146,183,183,161,202,202,161,201,201,151,189,189,136,170,170,136,170,170,152,190,190,152,190,190,101,126,126,155,194,194,155,194,194,162,202,202,161,202,202,163,204,204,159,199,199,159,199,199,156,195,195,156,195,195,157,197,197,159,199,199,159,198,198,162,202,202,162,202,202,160,200,200,153,191,191,153,191,191,153,191,191,153,191,191,159,199,199,157,197,197,157,196,196,157,196,196,157,196,196,158,198,198,160,200,200,159,199,199,158,158,197,159,159,199,159,159,199,159,159,199,159,159,198,158,158,198,158,158,198,158,158,198,156,156,196,156,156,195,158,158,197,157,157,197,157,157,197,157,157,196,157,157,196,157,157,196,157,157,196,156,156,196,156,156,195,156,156,195,156,156,195,154,154,193,154,154,192,129,129,161,128,128,161,31,31,39,106,106,133,106,106,133,136,136,170,135,135,169,149,149,187,137,137,171,136,136,171,146,146,182,145,145,182,147,147,184,150,150,187,149,149,187,148,148,185,148,148,185,141,141,177,30,30,38,30,30,38,1,1,1,13,13,17,13,13,17,15,15,19,15,15,19,12,12,15,48,48,60,48,48,60,39,39,49,39,39,49,36,36,45,77,77,96,76,76,96,43,43,54,43,43,54,40,40,50,31,31,39,31,31,39,41,41,52,41,41,52,35,35,44,23,23,29,23,23,29,59,59,74,59,59,74,130,130,162,143,143,179,143,143,178,134,134,167,133,133,167,120,120,150,134,134,168,134,134,168,89,89,111,88,88,111,136,136,171,142,142,178,142,142,177,143,143,179,143,143,179,140,140,175,137,137,171,136,136,171,138,138,172,139,139,174,139,139,173,141,141,177,141,141,176,139,139,174,133,133,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111,139,139,111,139,139,111,139,139,116,145,145,115,144,144,114,143,143,114,143,143,114,142,142,115,144,144,115,143,143,116,145,145,114,114,143,114,114,143,115,115,144,115,115,144,115,115,144,115,115,143,114,114,143,114,114,143,113,113,141,113,113,141,114,114,142,114,114,142,113,113,142,113,113,142,113,113,142,113,113,141,113,113,141,113,113,141,113,113,141,112,112,141,112,112,140,112,112,140,111,111,139,92,92,116,92,92,116,22,22,28,22,22,28,76,76,95,97,97,122,97,97,122,107,107,134,107,107,134,98,98,123,105,105,131,105,105,131,106,106,132,105,105,132,107,107,134,106,106,133,106,106,133,102,102,127,101,101,127,22,22,27,1,1,1,1,1,1,9,9,12,42,52,52,42,52,52,60,75,75,60,75,75,47,58,58,46,58,58,154,192,192,155,194,194,155,194,194,147,184,184,147,183,183,155,194,194,150,187,187,150,187,187,159,199,199,159,199,199,128,160,160,106,132,132,106,132,132,162,203,203,162,203,203,163,204,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,204,163,203,203,162,203,203,162,203,203,162,203,203,160,201,201,160,200,200,160,200,200,160,200,200,160,200,200,160,200,200,158,197,197,158,197,197,158,197,197,157,197,197,159,199,199,159,198,198,159,198,198,160,160,200,160,160,200,160,160,200,160,160,200,159,159,199,159,159,199,159,159,199,159,159,199,159,159,198,158,158,198,158,158,198,158,158,198,158,158,198,158,158,197,158,158,197,157,157,197,157,157,197,154,154,193,154,154,192,154,154,192,131,131,164,131,131,164,134,134,168,134,134,167,102,102,128,77,77,96,77,77,96,61,61,76,61,61,76,144,144,180,122,122,152,122,122,152,151,151,189,151,151,189,151,151,189,135,135,169,135,135,169,141,141,176,141,141,176,123,123,154,122,122,152,122,122,152,149,149,187,149,149,186,118,118,148,118,118,148,16,16,21,58,58,72,58,58,72,18,18,22,18,18,22,9,9,11,9,9,11,9,9,11,25,25,32,25,25,32,18,18,22,22,22,28,22,22,28,61,61,77,61,61,77,37,37,46,37,37,46,37,37,46,53,53,67,53,53,67,41,41,52,137,137,171,136,136,171,138,138,172,137,137,172,130,130,162,137,137,171,137,137,171,132,132,165,132,132,165,141,141,176,113,113,141,112,112,141,93,93,117,93,93,116,142,142,178,144,144,180,143,143,179,143,143,179,143,143,179,143,143,179,143,143,178,142,142,178,142,142,178,142,142,177,142,142,177,141,141,177,140,140,175,139,139,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,103,0,128,80,0,159,99,0,103,64,0,82,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,146,146,116,145,145,116,145,145,116,145,145,116,145,145,114,143,143,114,143,143,114,143,143,115,144,144,115,144,144,115,143,143,115,143,143,116,116,145,115,115,144,115,115,144,115,115,144,115,115,144,115,115,143,115,115,143,114,114,143,114,114,143,114,114,143,114,114,142,114,114,142,114,114,142,113,113,142,113,113,142,113,113,141,113,113,141,110,110,138,110,110,138,110,110,138,94,94,118,94,94,118,96,96,120,73,73,92,73,73,92,55,55,69,55,55,69,44,44,55,103,103,129,103,103,129,87,87,109,87,87,109,108,108,135,108,108,135,108,108,135,97,97,121,97,97,121,101,101,126,89,89,111,88,88,111,87,87,109,87,87,109,107,107,134,107,107,134,43,54,54,43,54,54,79,98,98,158,197,197,158,197,197,159,199,199,159,199,199,152,190,190,159,199,199,159,199,199,150,188,188,150,188,188,150,188,188,133,167,167,133,166,166,118,148,148,118,147,147,161,201,201,161,201,201,164,205,205,164,205,205,164,205,205,164,205,205,164,205,205,163,204,204,163,204,204,163,204,204,163,204,204,163,204,204,159,199,199,159,199,199,161,201,201,159,199,199,159,199,199,162,203,203,162,202,202,150,188,188,158,198,198,158,198,198,161,202,202,161,201,201,159,199,199,161,161,201,161,161,201,160,160,201,160,160,200,160,160,200,160,160,200,160,160,200,160,160,200,159,159,199,159,159,199,159,159,199,159,159,199,159,159,198,159,159,198,158,158,198,158,158,198,158,158,198,158,158,197,148,148,185,130,130,163,130,130,163,106,106,133,106,106,133,88,88,111,133,133,166,133,133,166,41,41,51,41,41,51,108,108,136,108,108,136,141,141,177,122,122,153,122,122,153,147,147,184,147,147,184,150,150,187,150,150,187,149,149,187,140,140,175,140,140,175,101,101,126,119,119,149,119,119,149,148,148,185,148,148,185,145,145,181,145,145,181,67,67,84,13,13,17,13,13,17,41,41,51,41,41,51,7,7,9,53,53,66,53,53,66,36,36,45,36,36,45,33,33,41,33,33,41,27,27,34,84,84,106,84,84,105,123,123,154,123,123,154,66,66,82,39,39,48,39,39,48,70,70,88,70,70,87,140,140,175,141,141,177,141,141,176,135,135,169,135,135,169,140,140,176,140,140,175,133,133,166,132,132,166,132,132,165,117,117,147,117,117,147,104,104,130,142,142,177,141,141,177,144,144,180,144,144,180,144,144,180,143,143,179,143,143,179,143,143,179,143,143,179,143,143,178,142,142,178,142,142,178,139,139,174,139,139,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,119,0,183,114,0,199,124,0,185,116,0,184,115,0,160,100,0,132,82,0,91,57,0,39,24,0,106,66,0,161,100,0,150,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,148,148,116,145,145,116,145,145,117,146,146,115,144,144,115,144,144,117,147,147,117,146,146,109,136,136,114,143,143,114,143,143,116,145,145,116,145,145,115,144,144,115,143,143,116,116,145,115,115,144,115,115,144,115,115,144,115,115,144,115,115,144,115,115,143,114,114,143,114,114,143,114,114,143,114,114,143,114,114,142,114,114,142,113,113,142,113,113,142,113,113,142,113,113,141,106,106,133,93,93,117,93,93,117,76,76,95,76,76,95,63,63,79,95,95,119,95,95,119,29,29,36,29,29,36,77,77,97,77,77,97,101,101,126,87,87,109,87,87,109,105,105,131,105,105,131,107,107,134,107,107,134,107,107,134,100,100,125,100,100,125,72,72,90,85,85,106,85,85,106,158,198,198,150,187,187,150,187,187,160,200,200,160,200,200,159,199,199,137,172,172,137,172,172,152,191,191,152,190,190,134,167,167,154,192,192,154,192,192,118,148,148,118,148,148,148,185,185,148,185,185,163,204,204,165,206,206,164,206,206,164,205,205,164,205,205,164,205,205,164,205,205,164,205,205,164,205,205,163,204,204,162,202,202,161,202,202,161,202,202,156,195,195,156,195,195,146,183,183,146,183,183,154,193,193,154,192,192,160,200,200,160,200,200,160,200,200,158,198,198,158,198,198,161,161,202,161,161,201,161,161,201,161,161,201,161,161,201,160,160,201,160,160,200,160,160,200,160,160,200,160,160,200,155,155,193,155,155,193,153,153,191,153,153,191,103,103,128,106,106,132,106,106,132,102,102,128,102,102,128,115,115,144,115,115,143,121,121,151,149,149,187,149,149,187,154,154,193,154,154,192,85,85,107,85,85,107,90,90,112,147,147,184,147,147,183,126,126,157,126,126,157,148,148,185,114,114,143,114,114,143,97,97,121,97,97,121,109,109,137,109,109,136,132,132,165,88,88,111,88,88,111,101,101,126,101,101,126,145,145,182,145,145,182,140,140,176,69,69,86,69,69,86,38,38,48,38,38,48,35,35,44,35,35,44,105,105,132,67,67,84,67,67,84,64,64,80,64,64,80,67,67,83,92,92,115,92,92,115,57,57,72,57,57,71,54,54,68,54,54,67,67,67,84,141,141,176,141,141,176,133,133,167,133,133,166,142,142,177,141,141,177,141,141,177,122,122,152,122,122,152,135,135,169,134,134,168,118,118,148,118,118,147,135,135,169,104,104,130,104,104,130,130,130,163,130,130,163,143,143,179,144,144,181,144,144,180,144,144,180,144,144,180,143,143,179,143,143,179,143,143,179,143,143,179,142,142,178,141,141,176,141,141,176,140,140,176,140,140,175,136,136,170,127,127,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,187,117,0,183,114,0,193,121,0,191,119,0,153,95,0,174,109,0,101,63,0,100,62,0,130,81,0,127,79,0,109,68,0,138,86,0,118,74,0,46,29,0,71,44,0,120,75,0,187,117,0,186,116,0,103,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,119,149,149,119,149,149,119,149,149,119,148,148,119,148,148,117,147,147,117,146,146,117,146,146,117,146,146,113,141,141,113,141,141,105,132,132,111,139,139,111,139,139,116,145,145,115,144,144,115,144,144,114,142,142,114,142,142,116,116,145,116,116,145,116,116,145,115,115,144,115,115,144,115,115,144,115,115,144,115,115,143,115,115,143,114,114,143,114,114,143,111,111,138,109,109,137,109,109,137,73,73,92,73,73,92,75,75,94,73,73,91,73,73,91,82,82,102,82,82,102,86,86,108,86,86,108,106,106,133,110,110,137,110,110,137,61,61,76,61,61,76,64,64,80,64,64,80,104,104,131,90,90,112,90,90,112,105,105,132,105,105,131,81,81,102,81,81,102,69,69,86,78,78,97,78,78,97,94,94,118,160,201,201,160,200,200,162,202,202,162,202,202,148,185,185,148,185,185,155,193,193,141,176,176,141,176,176,149,187,187,149,186,186,99,123,123,99,123,123,142,178,178,142,178,178,162,202,202,163,204,204,163,204,204,165,206,206,165,206,206,165,206,206,164,206,206,164,205,205,164,205,205,164,205,205,159,199,199,159,199,199,164,205,205,163,204,204,160,200,200,158,198,198,158,198,198,161,202,202,161,201,201,163,203,203,162,203,203,161,201,201,160,201,201,160,201,201,162,162,202,162,162,202,161,161,202,161,161,202,161,161,202,161,161,201,161,161,201,161,161,201,161,161,201,157,157,197,157,157,196,136,136,170,84,84,105,84,84,105,93,93,117,93,93,117,79,79,98,78,78,98,117,117,146,117,117,146,91,91,114,105,105,132,105,105,132,153,153,192,153,153,191,138,138,173,138,138,173,137,137,171,90,90,113,90,90,113,147,147,184,147,147,184,114,114,142,113,113,142,124,124,156,129,129,161,129,129,161,89,89,112,89,89,112,86,86,108,86,86,107,116,116,145,122,122,152,121,121,152,120,120,150,120,120,150,119,119,149,119,119,149,149,149,186,116,116,145,116,116,145,30,30,38,30,30,38,13,13,17,13,13,17,47,47,59,96,96,121,96,96,120,58,58,72,58,58,72,71,71,89,71,71,89,112,112,141,27,27,34,27,27,34,12,12,15,12,12,15,77,77,96,77,77,96,137,137,171,137,137,171,132,132,165,142,142,178,142,142,178,143,143,179,143,143,179,131,131,164,131,131,164,137,137,171,124,124,156,124,124,155,132,132,165,131,131,164,87,87,109,87,87,108,125,125,156,142,142,178,142,142,178,143,143,179,143,143,179,144,144,181,144,144,180,144,144,180,144,144,180,143,143,179,143,143,179,143,143,179,138,138,173,138,138,173,142,142,178,139,139,174,139,139,174,137,137,172,137,137,171,140,140,175,139,139,174,141,141,176,139,139,174,139,139,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,195,122,0,195,122,0,179,112,0,117,73,0,179,112,0,195,122,0,178,111,0,156,97,0,164,102,0,103,64,0,93,58,0,65,40,0,97,60,0,95,59,0,97,61,0,137,85,0,106,66,0,98,61,0,75,47,0,49,31,0,68,42,0,180,112,0,172,107,0,171,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,148,148,118,147,147,119,149,149,119,148,148,120,150,150,119,149,149,119,149,149,119,149,149,119,149,149,119,149,149,119,148,148,115,144,144,115,143,143,118,148,148,115,144,144,115,144,144,114,143,143,114,142,142,116,145,145,116,145,145,117,146,146,115,144,144,115,144,144,115,144,144,115,144,144,116,116,145,116,116,145,116,116,145,115,115,144,115,115,144,115,115,144,115,115,144,115,115,144,115,115,143,112,112,140,97,97,121,97,97,121,60,60,75,60,60,75,66,66,83,66,66,83,56,56,70,83,83,104,83,83,104,65,65,81,65,65,81,75,75,94,75,75,94,109,109,136,98,98,123,98,98,123,97,97,121,97,97,121,64,64,80,64,64,80,104,104,131,81,81,101,81,81,101,88,88,111,88,88,110,91,91,114,91,91,114,63,63,79,63,63,79,157,197,197,157,197,197,147,184,184,147,184,184,150,188,188,150,187,187,150,187,187,141,177,177,141,177,177,122,153,153,122,153,153,109,136,136,131,163,163,131,163,163,159,199,199,159,199,199,164,205,205,164,205,205,165,207,207,165,206,206,165,206,206,165,206,206,165,206,206,163,204,204,163,203,203,164,205,205,164,205,205,161,201,201,160,201,201,164,205,205,163,204,204,163,204,204,163,204,204,163,204,204,161,202,202,161,201,201,158,197,197,162,162,203,162,162,203,162,162,203,162,162,203,162,162,202,162,162,202,155,155,194,155,155,194,160,160,200,132,132,165,132,132,165,71,71,89,71,71,89,104,104,130,103,103,129,81,81,101,81,81,101,131,131,163,97,97,121,96,96,121,145,145,181,145,145,181,120,120,150,120,120,150,154,154,192,142,142,178,142,142,178,134,134,168,134,134,167,116,116,145,116,116,145,105,105,131,105,105,131,133,133,166,111,111,138,111,111,138,139,139,174,139,139,174,85,85,106,85,85,106,91,91,114,91,91,114,127,127,159,86,86,108,86,86,107,100,100,125,100,100,125,101,101,127,101,101,126,132,132,165,149,149,186,149,149,186,99,99,124,99,99,124,58,58,73,58,58,73,26,26,32,26,26,32,89,89,111,117,117,146,116,116,146,113,113,142,113,113,141,44,44,55,44,44,55,45,45,57,45,45,57,38,38,47,135,135,169,135,135,168,128,128,161,128,128,160,140,140,175,140,140,175,135,135,169,139,139,174,139,139,174,130,130,163,130,130,162,133,133,166,132,132,166,132,132,165,132,132,165,124,124,156,108,108,135,108,108,135,96,96,120,96,96,120,115,115,143,114,114,143,139,139,174,139,139,174,143,143,179,145,145,181,144,144,180,144,144,180,144,144,180,144,144,180,143,143,179,142,142,177,143,143,179,143,143,178,140,140,175,139,139,174,142,142,178,142,142,177,142,142,177,141,141,177,141,141,176,139,139,174,139,139,174,165,151,170,255,223,170,255,255,175,255,255,175,228,230,174,255,255,174,187,117,0,180,112,0,112,70,0,173,108,0,191,119,0,105,66,0,62,39,0,86,53,0,126,79,0,125,78,0,85,53,0,67,42,0,160,100,0,155,97,0,118,74,0,119,74,0,93,58,0,108,67,0,137,86,0,178,111,0,189,118,0,172,107,0,176,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,129,129,89,112,112,89,112,112,79,99,99,79,99,99,95,119,119,115,144,144,115,144,144,119,149,149,119,148,148,120,150,150,119,149,149,119,149,149,119,149,149,119,149,149,117,147,147,117,147,147,118,148,148,118,148,148,116,145,145,115,144,144,118,147,147,117,147,147,117,147,147,117,146,146,117,146,146,115,144,144,115,144,144,113,141,141,113,141,141,116,116,145,116,116,145,116,116,145,116,116,145,115,115,144,110,110,138,110,110,138,114,114,142,94,94,117,94,94,117,51,51,63,50,50,63,74,74,92,73,73,92,57,57,72,57,57,72,93,93,116,68,68,86,68,68,86,103,103,128,103,103,128,85,85,107,85,85,107,109,109,136,109,109,136,101,101,126,95,95,119,95,95,119,82,82,103,82,82,103,74,74,93,74,74,93,94,94,118,78,78,98,78,78,98,98,98,123,98,98,123,157,197,197,120,150,150,120,150,150,159,199,199,159,199,199,143,179,179,143,179,179,108,135,135,108,135,135,126,158,158,99,124,124,99,124,124,134,168,168,134,168,168,156,195,195,156,195,195,162,203,203,162,203,203,162,203,203,162,203,203,165,207,207,163,204,204,163,204,204,161,202,202,161,202,202,156,195,195,156,195,195,158,197,197,157,197,197,161,201,201,160,201,201,160,201,201,162,202,202,162,202,202,163,204,204,163,204,204,163,163,204,163,163,204,163,163,203,161,161,201,161,161,201,149,149,186,149,149,186,104,104,131,104,104,131,81,81,102,81,81,102,99,99,124,99,99,124,84,84,105,122,122,152,122,122,152,141,141,176,141,141,176,150,150,188,150,150,188,144,144,180,143,143,179,151,151,189,148,148,185,148,148,185,151,151,189,151,151,188,133,133,166,133,133,166,147,147,184,147,147,184,81,81,101,110,110,137,110,110,137,117,117,147,117,117,147,124,124,155,123,123,154,98,98,122,98,98,122,93,93,116,93,93,116,146,146,183,148,148,185,148,148,185,103,103,129,103,103,129,133,133,166,133,133,166,123,123,154,123,123,154,143,143,179,148,148,185,147,147,184,96,96,120,96,96,120,63,63,79,63,63,79,35,35,44,35,35,44,101,101,127,67,67,84,67,67,84,33,33,42,33,33,42,33,33,42,33,33,42,74,74,93,74,74,93,123,123,154,123,123,154,124,124,155,142,142,178,142,142,178,134,134,168,134,134,168,131,131,164,131,131,163,139,139,174,139,139,174,106,106,133,140,140,176,140,140,175,126,126,158,126,126,158,95,95,119,95,95,118,111,111,139,111,111,139,87,87,109,118,118,147,118,118,147,137,137,171,136,136,171,142,142,178,142,142,177,142,142,177,141,141,177,144,144,180,144,144,180,142,142,178,140,140,176,140,140,175,136,136,170,135,135,169,137,137,171,136,136,171,228,184,174,255,237,174,255,235,173,255,204,175,255,217,175,255,223,176,255,215,176,255,253,176,255,255,175,255,255,175,255,255,175,255,255,173,255,240,160,255,255,160,176,166,112,151,150,112,123,120,87,153,139,87,121,76,0,118,73,0,96,60,0,145,90,0,107,66,0,110,68,0,172,107,0,182,113,0,98,61,0,78,48,0,130,81,0,139,87,0,168,105,0,174,109,0,184,115,0,189,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,144,144,88,110,110,88,110,110,116,145,145,105,131,131,104,131,131,78,98,98,78,98,98,92,115,115,91,114,114,72,90,90,72,90,90,97,122,122,113,141,141,113,141,141,117,147,147,117,147,147,117,146,146,117,146,146,119,149,149,119,149,149,117,147,147,116,145,145,116,145,145,112,140,140,112,140,140,113,141,141,113,141,141,115,144,144,115,144,144,115,144,144,115,143,143,116,145,145,117,146,146,116,146,146,116,116,145,116,116,145,116,116,145,116,116,145,114,114,143,114,114,143,106,106,132,74,74,93,74,74,93,58,58,72,58,58,72,70,70,88,70,70,88,60,60,75,60,60,75,86,86,108,100,100,125,100,100,125,106,106,133,106,106,133,102,102,127,101,101,127,107,107,134,107,107,134,104,104,131,104,104,131,106,106,133,94,94,117,94,94,117,104,104,130,104,104,130,57,57,72,57,57,72,77,77,97,77,77,97,83,83,104,151,189,189,134,167,167,134,167,167,113,142,142,113,142,142,145,182,182,145,182,182,160,201,201,160,200,200,160,200,200,158,198,198,158,198,198,87,109,109,87,109,109,72,90,90,72,90,90,89,111,111,89,111,111,120,151,151,122,153,153,122,152,152,120,150,150,120,150,150,150,188,188,150,187,187,161,202,202,161,202,202,158,197,197,158,197,197,158,197,197,161,201,201,161,201,201,159,199,199,159,198,198,160,160,200,160,160,200,142,142,177,142,142,177,74,74,92,74,74,92,57,57,72,57,57,72,54,54,67,123,123,154,123,123,153,155,155,194,155,155,194,144,144,180,143,143,179,143,143,179,143,143,179,156,156,195,156,156,195,154,154,193,143,143,178,142,142,178,157,157,196,157,157,196,137,137,171,137,137,171,130,130,163,130,130,163,145,145,181,144,144,181,106,106,132,138,138,172,138,138,172,76,76,96,76,76,96,91,91,113,91,91,113,111,111,139,111,111,139,113,113,141,112,112,141,115,115,144,82,82,103,82,82,103,148,148,185,148,148,185,142,142,177,141,141,177,146,146,183,146,146,182,128,128,161,128,128,160,153,153,192,151,151,189,151,151,189,153,153,191,152,152,191,144,144,181,144,144,180,100,100,126,100,100,126,65,65,81,64,64,81,100,100,125,100,100,125,118,118,148,80,80,100,79,79,99,127,127,159,127,127,159,145,145,181,145,145,181,145,145,181,144,144,181,129,129,161,129,129,161,142,142,178,98,98,123,98,98,122,143,143,179,143,143,179,134,134,167,133,133,167,118,118,148,118,118,148,100,100,125,100,100,125,128,128,160,141,141,177,141,141,176,141,141,176,141,141,176,139,139,174,139,139,173,76,76,96,76,76,95,63,63,79,63,63,79,77,77,97,105,105,131,105,105,131,106,106,133,106,106,133,104,104,131,117,111,130,139,135,163,255,221,163,255,204,175,255,233,175,216,176,171,255,203,171,255,228,170,255,231,174,255,235,173,202,169,171,199,168,171,255,249,172,255,255,172,255,242,152,255,253,152,143,129,79,140,127,79,115,102,61,95,88,58,92,87,58,212,198,131,252,223,131,255,255,166,255,255,166,230,220,153,255,255,153,255,241,153,242,227,152,186,116,0,184,115,0,96,60,0,134,84,0,172,107,0,187,117,0,191,119,0,164,102,0,168,105,0,161,101,0,158,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,147,147,81,101,101,81,101,101,118,148,148,118,148,148,110,138,138,110,138,138,97,122,122,97,122,122,82,103,103,106,132,132,106,132,132,116,146,146,116,145,145,116,145,145,116,145,145,114,143,143,114,143,143,63,79,79,63,79,79,52,65,65,64,80,80,64,80,80,87,108,108,86,108,108,88,110,110,87,109,109,86,108,108,86,108,108,107,134,134,107,134,134,115,144,144,113,141,141,113,141,141,113,141,141,112,141,141,115,143,143,114,143,143,113,141,141,113,141,141,114,114,143,114,114,142,101,101,126,101,101,126,52,52,65,41,41,51,40,40,51,38,38,48,38,38,48,87,87,109,87,87,109,110,110,137,110,110,137,101,101,127,101,101,127,101,101,127,110,110,138,110,110,138,109,109,136,109,109,136,101,101,126,100,100,126,111,111,138,110,110,138,97,97,121,96,96,121,92,92,115,102,102,127,102,102,127,74,74,93,74,74,93,97,97,121,97,97,121,54,54,67,158,198,198,105,131,131,105,131,131,159,199,199,159,199,199,164,205,205,162,203,203,162,203,203,160,201,201,160,201,201,155,194,194,155,194,194,116,145,145,116,145,145,86,107,107,85,107,107,119,149,149,119,149,149,151,189,189,119,149,149,119,149,149,152,190,190,152,190,190,154,192,192,153,192,192,153,192,192,153,192,192,161,202,202,161,202,202,161,202,202,161,201,201,163,203,203,147,147,184,147,147,184,86,86,107,86,86,107,89,89,111,89,89,111,66,66,82,66,66,82,89,89,111,89,89,111,154,154,193,154,154,193,138,138,172,138,138,172,157,157,196,149,149,186,149,149,186,150,150,188,150,150,188,155,155,193,155,155,193,153,153,191,153,153,191,156,156,195,156,156,195,144,144,180,144,144,180,106,106,133,147,147,184,147,147,183,116,116,145,116,116,145,143,143,179,143,143,179,72,72,90,72,72,90,91,91,114,91,91,114,70,70,88,70,70,87,65,65,81,65,65,81,127,127,159,106,106,133,106,106,133,128,128,160,128,128,160,152,152,190,151,151,189,142,142,177,142,142,177,149,149,187,149,149,187,151,151,188,150,150,188,141,141,176,150,150,188,150,150,187,148,148,185,148,148,185,137,137,171,137,137,171,139,139,174,139,139,174,122,122,153,122,122,152,92,92,116,92,92,115,69,69,86,69,69,86,141,141,176,142,142,178,142,142,178,150,150,187,149,149,187,149,149,187,149,149,186,131,131,163,130,130,163,91,91,113,91,91,113,146,146,183,146,146,183,146,146,183,140,140,175,140,140,175,93,93,116,93,93,116,141,141,176,140,140,175,145,145,181,144,144,181,143,143,178,142,142,178,141,141,176,141,141,176,136,136,170,102,102,127,101,101,127,75,75,94,75,75,93,243,173,130,150,127,130,153,142,164,255,222,164,244,174,129,199,151,129,255,216,165,255,218,165,255,218,167,255,220,166,255,212,166,255,207,175,255,232,174,255,234,174,255,229,174,252,196,175,255,203,175,255,246,159,255,252,158,157,145,92,163,148,92,167,152,95,173,156,95,135,119,70,175,157,95,142,136,95,218,219,165,255,255,165,255,249,147,255,238,147,255,247,168,255,255,167,255,243,158,255,255,158,255,240,159,238,228,159,255,255,164,255,255,164,255,255,162,255,255,165,193,121,0,176,110,0,179,112,0,133,83,0,131,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,147,147,123,154,154,123,154,154,123,154,154,108,135,135,108,135,135,75,94,94,75,93,93,121,151,151,121,151,151,120,151,151,120,150,150,115,144,144,115,144,144,76,96,96,76,95,95,116,145,145,115,144,144,119,149,149,117,147,147,117,147,147,116,145,145,116,145,145,112,140,140,112,140,140,84,105,105,83,104,104,61,77,77,61,77,77,85,107,107,85,107,107,108,135,135,85,106,106,85,106,106,109,136,136,109,136,136,110,137,137,110,137,137,109,137,137,109,137,137,115,144,144,115,144,144,115,143,143,115,143,143,116,145,145,105,105,131,105,105,131,61,61,76,61,61,76,63,63,79,63,63,79,46,46,58,46,46,58,63,63,78,63,63,78,109,109,136,109,109,136,97,97,122,97,97,121,111,111,139,105,105,131,105,105,131,106,106,132,106,106,132,109,109,136,109,109,136,107,107,134,107,107,134,109,109,137,109,109,137,101,101,127,101,101,126,75,75,94,103,103,129,103,103,129,81,81,102,81,81,102,100,100,126,95,119,119,165,206,206,160,200,200,160,200,200,165,206,206,164,206,206,164,206,206,164,205,205,166,207,207,166,207,207,161,201,201,160,201,201,115,143,143,115,143,143,94,118,118,94,118,118,72,90,90,72,90,90,62,77,77,58,73,73,58,73,73,109,136,136,109,136,136,135,169,169,135,169,169,157,196,196,157,196,196,157,196,196,157,196,196,156,196,196,156,196,196,83,83,104,83,83,104,88,88,110,88,88,110,83,83,103,82,82,103,134,134,167,79,79,99,79,79,99,129,129,161,128,128,161,155,155,193,155,155,193,158,158,197,158,158,197,151,151,189,151,151,188,139,139,174,139,139,174,157,157,196,157,157,196,158,158,198,158,158,198,153,153,191,136,136,171,136,136,171,144,144,181,144,144,180,123,123,154,123,123,154,106,106,133,106,106,133,132,132,165,132,132,165,109,109,137,109,109,137,86,86,108,86,86,108,94,94,118,94,94,118,62,62,78,70,70,88,70,70,87,121,121,151,121,121,151,140,140,175,140,140,175,128,128,161,128,128,160,153,153,192,153,153,192,125,125,156,124,124,156,132,132,165,132,132,165,129,129,161,128,128,161,144,144,180,138,138,172,137,137,172,150,150,187,150,150,187,143,143,179,143,143,179,113,113,142,113,113,141,107,107,133,107,107,133,108,108,135,108,108,135,108,108,135,107,107,134,147,147,184,147,147,184,150,150,188,150,150,187,150,150,187,145,145,181,145,145,181,138,138,173,138,138,173,144,144,180,144,144,180,144,144,180,143,143,179,105,105,132,105,105,132,84,84,105,84,84,105,145,145,182,145,145,182,140,140,176,140,140,175,145,145,181,144,144,181,144,144,180,145,145,182,145,145,182,255,233,176,255,236,175,237,169,125,237,169,125,194,138,103,171,127,103,143,103,79,146,104,78,101,78,67,122,88,67,115,83,63,117,84,63,221,158,118,255,192,147,253,185,146,255,211,170,255,218,170,255,220,169,242,189,169,210,172,169,255,208,168,161,145,89,154,141,89,173,155,94,179,159,94,163,146,89,169,150,88,222,211,143,184,187,143,131,124,84,193,189,137,226,210,137,255,255,165,255,255,165,255,255,168,255,255,168,255,244,161,255,255,160,229,217,148,231,218,148,255,255,166,255,255,166,255,255,168,255,255,167,255,255,162,255,255,162,255,245,144,255,255,152,255,255,152,104,130,130,103,129,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,111,111,89,111,111,89,111,111,122,152,152,121,152,152,124,155,155,123,154,154,123,154,154,123,154,154,119,149,149,114,142,142,114,142,142,119,148,148,118,148,148,118,148,148,118,148,148,87,108,108,87,108,108,69,86,86,69,86,86,120,150,150,119,149,149,115,144,144,115,144,144,119,149,149,119,148,148,118,148,148,119,149,149,119,149,149,115,144,144,115,144,144,82,103,103,82,103,103,67,84,84,67,84,84,51,64,64,51,64,64,44,55,55,44,55,55,42,52,52,42,52,52,77,97,97,77,97,97,96,120,120,112,140,140,111,139,139,111,139,139,111,139,139,111,139,139,111,139,139,59,59,73,59,59,73,62,62,78,62,62,78,58,58,73,58,58,73,95,95,118,94,94,118,56,56,70,56,56,70,90,90,113,90,90,113,109,109,136,111,111,139,111,111,139,106,106,133,106,106,133,98,98,122,98,98,122,110,110,138,110,110,138,111,111,139,111,111,139,107,107,134,107,107,134,96,96,120,95,95,119,101,101,126,101,101,126,86,86,108,75,75,93,167,209,209,167,209,209,169,211,211,168,211,211,156,196,196,156,195,195,156,195,195,156,195,195,153,191,191,152,191,191,144,180,180,144,180,180,118,148,148,118,148,148,50,63,63,50,63,63,77,97,97,77,97,97,94,118,118,94,118,118,106,132,132,159,199,199,159,199,199,127,159,159,127,159,159,152,190,190,152,190,190,157,196,196,157,196,196,122,122,152,122,122,152,110,110,137,110,110,137,131,131,164,131,131,164,159,159,199,159,159,199,151,151,189,151,151,188,106,106,132,106,106,132,140,140,175,140,140,175,145,145,181,145,145,181,148,148,185,140,140,175,139,139,174,157,157,197,157,157,197,159,159,199,159,159,198,149,149,186,148,148,186,140,140,175,140,140,175,153,153,191,153,153,191,133,133,166,133,133,166,126,126,158,126,126,158,139,139,174,139,139,174,152,152,190,151,151,189,142,142,177,141,141,177,90,90,112,90,90,112,90,90,112,62,62,78,62,62,78,100,100,126,100,100,126,123,123,153,123,123,153,130,130,163,130,130,163,113,113,141,112,112,141,147,147,184,147,147,184,145,145,182,145,145,181,134,134,167,134,134,167,137,137,171,137,137,171,132,132,165,131,131,164,144,144,180,151,151,189,151,151,189,103,103,128,103,103,128,73,73,91,73,73,91,143,143,178,142,142,178,80,80,100,80,80,100,126,126,158,126,126,158,151,151,188,150,150,188,149,149,186,149,149,186,148,148,186,148,148,185,146,146,183,146,146,183,140,140,175,140,140,175,127,127,159,100,100,125,100,100,125,113,113,142,113,113,141,140,140,175,140,140,175,147,147,184,147,147,184,148,148,185,255,240,185,255,230,172,255,230,171,255,230,171,255,230,171,255,255,255,255,255,255,255,210,157,255,202,157,230,167,129,221,162,129,101,72,55,82,63,55,142,105,84,173,127,102,191,136,102,216,154,115,208,150,115,255,221,173,255,211,172,212,161,138,237,173,137,255,194,164,241,186,164,214,175,169,255,212,169,225,206,131,247,220,131,219,196,118,226,200,118,255,238,141,255,239,141,183,200,171,203,212,170,255,241,161,168,185,161,154,153,113,196,179,113,255,251,149,255,254,155,255,255,154,255,255,158,255,255,157,221,212,148,255,240,148,255,255,167,255,255,167,255,255,168,255,255,168,255,255,157,255,255,157,255,255,148,255,253,148,255,255,161,129,161,161,112,140,140,112,140,140,106,133,133,106,133,133,117,146,146,116,146,146,127,159,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,85,106,106,85,106,106,60,75,75,60,75,75,117,147,147,117,147,147,66,83,83,66,82,82,104,130,130,104,130,130,124,155,155,124,155,155,122,153,153,122,153,153,122,152,152,122,152,152,120,150,150,115,144,144,115,144,144,105,131,131,104,131,131,82,102,102,82,102,102,93,116,116,93,116,116,115,144,144,115,143,143,121,151,151,120,151,151,121,152,152,121,152,152,112,141,141,112,140,140,112,140,140,112,140,140,109,137,137,109,137,137,103,129,129,103,129,129,84,106,106,36,45,45,36,45,45,55,69,69,55,69,69,67,84,84,67,84,84,75,94,94,75,94,94,113,142,142,113,141,141,90,113,113,90,113,113,108,135,135,108,135,135,111,139,139,111,139,139,86,86,107,86,86,107,77,77,97,77,77,97,92,92,116,92,92,116,112,112,140,112,112,140,106,106,133,74,74,93,74,74,93,99,99,123,98,98,123,102,102,127,102,102,127,104,104,130,104,104,130,98,98,122,98,98,122,110,110,138,110,110,138,111,111,139,111,111,139,104,104,130,104,104,130,98,98,123,98,98,122,107,107,134,107,107,133,167,209,209,167,209,209,143,179,179,143,179,179,153,192,192,153,191,191,160,200,200,160,200,200,137,172,172,137,172,172,146,182,182,146,182,182,105,131,131,105,131,131,59,74,74,59,74,74,148,186,186,148,186,186,157,196,196,157,196,196,158,198,198,158,198,198,143,179,179,143,178,178,148,185,185,147,184,184,151,189,189,159,159,199,159,159,199,160,160,201,160,160,200,153,153,192,153,153,192,152,152,190,151,151,189,153,153,191,153,153,191,154,154,193,154,154,193,104,104,130,104,104,130,132,132,165,132,132,165,139,139,173,138,138,173,132,132,165,132,132,165,148,148,185,148,148,185,153,153,191,152,152,191,157,157,197,157,157,197,157,157,196,157,157,196,148,148,186,148,148,186,133,133,167,133,133,167,110,110,138,110,110,138,122,122,152,152,152,190,152,152,190,155,155,194,155,155,194,147,147,184,147,147,183,67,67,84,67,67,84,96,96,120,96,96,120,51,51,64,51,51,64,99,99,124,99,99,124,131,131,164,131,131,163,122,122,153,122,122,153,130,130,163,130,130,163,104,104,131,104,104,131,125,125,156,125,125,156,113,113,142,113,113,142,108,108,136,108,108,135,133,133,167,133,133,167,130,130,162,130,130,162,111,111,139,111,111,138,125,125,156,149,149,187,149,149,187,99,99,124,99,99,124,58,58,73,58,58,73,142,142,178,142,142,177,148,148,185,148,148,185,144,144,180,144,144,180,147,147,184,147,147,184,134,134,168,134,134,168,84,84,105,83,83,104,92,92,116,92,92,115,124,124,155,124,124,155,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,198,150,255,211,159,255,208,159,208,149,114,172,132,114,112,82,64,114,83,64,255,210,161,255,215,161,255,228,170,255,225,170,255,218,171,255,224,171,248,186,154,255,200,154,208,168,159,253,190,159,255,195,162,255,197,162,237,234,171,255,255,171,238,235,172,255,255,172,255,255,164,248,237,164,206,210,162,252,238,162,213,215,163,185,197,163,179,194,165,255,255,164,198,179,111,211,187,111,255,239,141,255,234,140,255,237,147,255,234,140,255,230,140,255,255,157,255,255,157,255,255,162,255,255,161,255,255,166,255,255,166,255,255,166,255,255,165,255,255,157,255,255,156,112,141,141,112,140,140,93,116,116,93,116,116,102,128,128,102,127,127,128,160,160,127,159,159,130,162,162,130,162,162,123,153,153,122,153,153,56,70,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,112,112,110,138,138,110,138,138,107,134,134,107,134,134,91,114,114,91,114,114,103,128,128,102,128,128,123,154,154,123,153,153,81,102,102,81,102,102,48,60,60,48,60,60,116,146,146,116,146,146,121,152,152,121,151,151,118,148,148,118,148,148,120,151,151,120,150,150,110,138,138,110,137,137,68,86,86,76,95,95,76,95,95,102,127,127,101,127,127,119,148,148,119,148,148,120,150,150,119,149,149,120,151,151,120,150,150,103,129,129,103,128,128,110,137,137,110,137,137,114,143,143,114,143,143,98,123,123,98,123,123,104,130,130,104,130,130,75,93,93,75,93,93,42,52,52,42,52,52,106,132,132,105,132,132,111,139,139,111,139,139,112,140,140,112,140,140,101,126,126,101,126,126,104,130,130,104,130,130,106,133,133,112,112,140,112,112,140,113,113,141,113,113,141,108,108,135,108,108,135,107,107,133,106,106,133,107,107,134,107,107,134,108,108,135,108,108,135,73,73,91,73,73,91,93,93,116,92,92,116,97,97,121,97,97,121,92,92,115,92,92,115,103,103,129,103,103,129,107,107,133,106,106,133,110,110,137,110,110,137,109,109,137,109,109,137,162,203,203,162,203,203,166,207,207,166,207,207,164,205,205,164,205,205,165,207,207,165,206,206,138,172,172,138,172,172,114,142,142,114,142,142,90,112,112,90,112,112,125,157,157,125,156,156,156,195,195,155,194,194,138,173,173,138,173,173,131,164,164,131,164,164,140,175,175,140,175,175,160,200,200,160,200,200,163,163,204,163,163,203,147,147,184,147,147,184,149,149,186,149,149,186,147,147,184,147,147,184,138,138,173,138,138,173,151,151,189,151,151,189,158,158,197,158,158,197,104,104,130,104,104,130,152,152,190,152,152,190,150,150,188,150,150,188,115,115,144,115,115,144,153,153,191,143,143,179,143,143,179,148,148,185,148,148,185,152,152,191,152,152,190,139,139,174,139,139,174,126,126,157,125,125,157,112,112,140,112,112,140,154,154,193,154,154,193,151,151,189,151,151,188,157,157,196,157,157,196,129,129,162,129,129,161,53,53,66,53,53,66,119,119,149,119,119,149,70,70,88,70,70,88,97,97,122,97,97,122,149,149,186,148,148,186,153,153,191,153,153,191,141,141,177,141,141,177,76,76,95,76,76,95,147,147,184,147,147,184,147,147,184,147,147,183,121,121,152,121,121,151,91,91,114,91,91,114,136,136,170,136,136,170,150,150,188,150,150,187,151,151,189,151,151,189,140,140,175,140,140,175,34,34,42,34,34,42,122,122,153,122,122,153,148,148,185,148,148,185,151,151,189,151,151,188,143,143,178,143,143,178,138,138,172,138,138,172,119,119,149,119,119,149,65,65,82,117,117,146,117,117,146,147,147,184,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,216,180,229,175,150,251,185,150,210,154,124,205,152,124,180,129,98,182,130,97,248,178,136,247,178,136,255,223,169,255,225,168,255,194,150,255,187,150,219,166,142,250,182,142,202,161,151,247,184,150,255,209,172,215,176,172,255,255,175,255,255,175,255,254,158,255,247,158,255,255,160,196,202,159,156,176,157,230,222,157,243,226,148,243,226,148,163,182,162,224,220,161,255,255,168,255,255,168,211,187,111,194,177,111,255,255,162,255,255,161,255,255,159,255,255,159,239,210,122,239,210,122,255,255,162,255,255,162,255,255,151,255,255,151,255,255,156,255,255,155,255,255,160,128,160,160,117,146,146,116,146,146,105,132,132,105,131,131,94,118,118,129,162,162,129,161,161,126,158,158,126,158,158,131,164,164,131,164,164,108,135,135,108,135,135,44,55,55,44,55,55,99,124,124,99,124,124,58,73,73,58,73,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,78,78,122,152,152,121,152,152,121,152,152,121,151,151,100,125,125,100,125,125,75,94,94,75,94,94,112,140,140,112,140,140,123,154,154,123,154,154,124,155,155,124,155,155,115,144,144,115,143,143,28,35,35,28,35,35,100,125,125,100,125,125,121,152,152,121,152,152,124,155,155,123,154,154,117,146,146,117,146,146,113,141,141,112,141,141,97,122,122,97,122,122,53,67,67,53,67,67,95,119,119,95,119,119,120,150,150,120,150,150,118,148,148,118,148,148,118,148,148,118,147,147,116,146,146,116,145,145,118,148,148,117,146,146,117,146,146,118,148,148,118,147,147,98,123,123,98,123,123,81,101,101,81,101,101,64,80,80,64,80,80,89,111,111,89,111,111,110,138,138,110,138,138,98,122,122,98,122,122,93,116,116,93,116,116,99,123,123,98,123,123,113,141,141,112,141,141,115,115,143,114,114,143,104,104,130,103,103,129,104,104,131,104,104,131,103,103,129,103,103,129,97,97,121,97,97,121,106,106,133,106,106,132,110,110,138,110,110,138,73,73,91,73,73,91,106,106,133,106,106,133,105,105,131,105,105,131,80,80,101,80,80,100,107,107,133,106,106,133,99,99,124,99,99,124,206,206,206,205,205,205,212,212,212,212,212,212,211,211,211,211,211,211,209,209,209,209,209,209,204,204,204,204,204,204,204,204,204,204,204,204,198,198,198,197,197,197,197,197,197,197,197,197,186,186,186,186,186,186,184,184,184,184,184,184,192,192,192,192,192,192,202,202,202,202,202,202,208,167,208,208,167,208,202,161,202,202,161,202,204,163,204,203,163,203,201,161,201,201,161,201,201,161,201,201,160,201,207,165,207,207,165,207,198,158,198,198,158,198,198,158,198,198,158,198,197,158,197,197,158,197,201,161,201,201,161,201,197,157,197,197,157,197,190,152,190,190,152,190,200,160,200,200,160,200,202,161,202,202,161,202,197,158,197,197,158,197,197,157,197,197,157,197,199,159,199,198,159,198,196,157,196,196,157,196,202,161,202,202,161,202,199,159,199,199,159,199,195,156,195,195,156,195,197,157,197,196,157,196,194,155,194,194,155,194,184,147,184,183,147,183,169,135,169,169,135,169,151,120,151,150,120,150,152,122,152,152,122,152,116,93,116,116,92,116,132,105,132,131,105,131,135,108,135,135,108,135,147,117,147,147,117,147,180,144,180,180,144,180,186,149,186,186,148,186,181,145,181,181,145,181,189,151,189,189,151,189,188,151,188,188,150,188,180,144,180,180,144,180,187,150,187,187,150,187,187,149,187,187,149,187,188,151,188,188,150,188,184,147,184,184,147,184,180,144,180,179,143,179,173,139,173,173,138,173,183,146,183,182,146,182,186,149,186,186,148,186,183,147,183,183,146,183,183,146,183,183,146,183,181,144,181,180,144,180,255,248,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,249,255,255,255,255,255,255,255,255,255,255,255,255,255,198,185,255,199,182,255,196,182,255,182,178,255,195,178,255,224,178,255,236,177,255,223,172,255,228,171,255,227,171,255,229,171,255,205,161,255,206,161,255,203,159,255,184,159,255,171,166,255,201,165,255,216,174,255,197,174,255,255,179,255,248,179,255,253,173,255,255,173,255,255,174,196,185,174,248,210,172,255,249,172,255,229,172,255,246,171,255,224,176,255,233,176,255,255,169,255,255,168,255,255,168,255,255,168,255,255,168,255,255,167,255,255,170,255,255,170,255,255,166,255,255,166,255,255,161,255,255,160,255,255,169,255,255,168,255,255,170,255,255,170,255,255,166,166,166,166,165,165,165,165,165,165,167,167,167,166,166,166,164,164,164,164,164,164,169,169,169,169,169,169,167,167,167,166,166,166,163,163,163,162,162,162,164,164,164,163,163,163,161,161,161,161,161,161,153,153,153,152,152,152,140,140,140,140,140,140,125,125,125,125,125,125,126,126,126,126,126,126,96,96,96,96,96,96,109,109,109,108,108,108,112,112,112,111,111,111,121,121,121,121,121,121,148,148,148,148,148,148,153,153,153,153,153,153,149,149,149,149,149,149,155,155,155,155,155,155,155,155,155,154,154,154,148,148,148,147,147,147,154,154,154,153,153,153,153,153,153,153,153,153,154,154,154,154,154,154,151,151,151,150,150,150,147,147,147,147,147,147,142,142,142,141,141,141,149,149,149,149,149,149,152,152,152,152,152,152,150,150,150,149,149,149,149,149,149,149,149,149,147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148,148,148,147,147,147,147,147,147,147,147,147,147,147,147,151,151,151,151,151,151,151,151,151,150,150,150,149,149,149,148,148,148,145,145,145,145,145,145,145,145,145,145,145,145,140,140,140,140,140,140,139,139,139,139,139,139,132,132,132,131,131,131,130,130,130,129,129,129,135,135,135,135,135,135,142,142,142,142,142,142,146,117,146,146,117,146,142,113,142,141,113,141,143,114,143,142,114,142,141,113,141,141,112,141,140,112,140,140,112,140,144,115,144,144,115,144,138,110,138,138,110,138,138,110,138,138,110,138,137,110,137,137,110,137,140,112,140,140,112,140,137,109,137,137,109,137,132,106,132,132,105,132,210,210,210,210,210,210,212,212,212,212,212,212,205,205,205,205,205,205,203,203,203,203,203,203,207,207,207,207,207,207,200,200,200,200,200,200,202,202,202,202,202,202,195,195,195,195,195,195,191,191,191,191,191,191,186,186,186,186,186,186,203,203,203,203,203,203,209,167,209,209,167,209,209,167,209,204,163,204,204,163,204,204,163,204,204,163,204,200,160,200,199,159,199,201,161,201,201,161,201,201,161,201,201,161,201,201,160,201,201,160,201,192,153,192,192,153,192,196,157,196,196,156,196,202,161,202,202,161,202,199,159,199,199,159,199,195,156,195,195,156,195,201,160,201,200,160,200,202,162,202,202,162,202,198,158,198,198,158,198,191,153,191,191,153,191,197,158,197,197,157,197,201,161,201,201,160,201,202,162,202,202,162,202,198,158,198,198,158,198,198,158,198,197,158,197,193,154,193,193,154,193,158,126,158,158,126,158,109,87,109,109,87,109,157,126,157,157,126,157,143,114,143,143,114,143,129,103,129,128,103,128,60,48,60,60,48,60,46,36,46,46,36,46,88,70,88,88,70,88,77,62,77,77,62,77,105,84,105,105,84,105,125,100,125,125,100,125,105,84,105,105,84,105,132,106,132,132,105,132,171,137,171,171,137,171,187,149,187,186,149,186,186,149,186,186,149,186,180,144,180,180,144,180,189,151,189,189,151,189,189,151,189,188,151,188,184,147,184,184,147,184,178,142,178,178,142,178,177,142,177,185,148,185,185,148,185,184,147,184,184,147,184,182,146,182,182,145,182,181,145,181,181,145,181,181,145,181,181,144,181,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,238,185,255,194,179,255,196,179,255,175,177,255,173,177,255,218,180,255,231,180,255,224,174,255,228,174,255,234,175,255,235,175,255,222,169,255,223,169,255,208,165,255,216,165,255,190,161,255,191,160,255,226,175,255,196,175,255,255,180,255,255,179,255,255,176,255,255,175,255,255,175,237,206,175,255,254,171,255,224,171,255,215,172,255,233,172,255,255,171,255,220,171,255,228,171,255,255,171,255,255,163,255,255,163,255,255,166,255,255,166,255,250,171,255,255,171,255,255,169,255,255,168,255,255,165,255,255,164,255,255,169,255,255,169,255,255,170,255,255,170,255,255,166,166,166,166,161,161,161,160,160,160,165,165,165,165,165,165,168,168,168,168,168,168,169,169,169,169,169,169,165,165,165,165,165,165,165,165,165,165,165,165,161,161,161,161,161,161,160,160,160,131,131,131,131,131,131,90,90,90,90,90,90,130,130,130,130,130,130,118,118,118,118,118,118,106,106,106,106,106,106,49,49,49,49,49,49,38,38,38,38,38,38,72,72,72,72,72,72,64,64,64,64,64,64,86,86,86,86,86,86,102,102,102,102,102,102,86,86,86,86,86,86,108,108,108,108,108,108,140,140,140,140,140,140,153,153,153,152,152,152,152,152,152,152,152,152,147,147,147,147,147,147,154,154,154,154,154,154,154,154,154,154,154,154,150,150,150,150,150,150,145,145,145,145,145,145,151,151,151,151,151,151,150,150,150,150,150,150,148,148,148,148,148,148,148,148,148,148,148,148,147,147,147,147,147,147,147,147,147,147,147,147,150,150,150,149,149,149,151,151,151,151,151,151,150,150,150,150,150,150,150,150,150,150,150,150,151,151,151,151,151,151,146,146,146,146,146,146,144,144,144,144,144,144,147,147,147,146,146,146,142,142,142,141,141,141,143,143,143,142,142,142,138,138,138,138,138,138,134,134,134,134,134,134,131,131,131,131,131,131,143,143,143,142,142,142,142,142,142,146,117,146,146,117,146,143,114,143,143,114,143,143,114,143,142,114,142,139,111,139,139,111,139,140,112,140,140,112,140,140,112,140,140,112,140,140,112,140,140,112,140,134,107,134,133,107,133,136,109,136,136,109,136,140,112,140,140,112,140,138,111,138,138,110,138,211,211,211,210,210,210,208,208,208,208,208,208,208,208,208,208,208,208,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,196,196,196,196,196,196,200,200,200,200,200,200,200,200,200,200,200,200,197,197,197,197,197,197,199,199,199,199,199,199,210,168,210,209,167,209,205,164,205,205,164,205,207,165,207,207,165,207,204,163,204,204,163,204,202,162,202,202,161,202,202,161,202,202,161,202,201,161,201,201,161,201,201,161,201,201,161,201,199,159,199,198,159,198,200,160,200,200,160,200,200,160,200,200,160,200,195,156,195,195,156,195,201,161,201,201,161,201,203,162,203,203,162,203,203,162,203,198,159,198,198,158,198,198,158,198,198,158,198,202,161,202,202,161,202,203,163,203,203,163,203,199,159,199,199,159,199,197,157,197,196,157,196,198,158,198,198,158,198,177,142,177,177,142,177,81,65,81,81,65,81,79,63,79,79,63,79,85,68,85,85,68,85,52,42,52,52,42,52,16,12,16,16,12,16,32,25,32,32,25,32,8,6,8,8,6,8,26,20,26,26,20,26,16,12,16,16,12,16,46,36,46,45,36,45,129,103,129,129,103,129,125,100,125,125,100,125,125,100,125,91,73,91,91,72,91,59,47,59,59,47,59,106,85,106,106,85,106,183,146,183,182,146,182,178,143,178,178,142,178,184,147,184,183,147,183,189,151,189,189,151,189,191,152,191,190,152,190,190,152,190,190,152,190,191,153,191,191,153,191,187,150,187,187,149,187,183,146,183,182,146,182,178,143,178,178,142,178,182,145,182,181,145,181,183,146,183,255,255,255,255,255,255,255,255,255,255,255,255,255,239,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,222,237,255,255,255,255,230,182,255,189,181,255,183,181,255,206,181,255,199,179,255,213,178,255,216,178,255,227,178,255,223,170,255,219,170,255,231,173,255,224,173,255,219,173,255,208,172,255,204,170,255,211,170,255,216,172,255,192,171,255,255,180,255,252,180,255,255,176,255,255,176,250,214,177,242,209,177,255,254,175,255,218,175,226,199,173,216,194,172,255,255,172,255,226,172,255,215,171,255,255,171,255,255,171,255,255,171,255,255,169,255,255,168,255,255,170,255,255,169,255,255,169,255,255,169,255,255,169,255,255,165,255,255,165,255,255,170,255,255,169,255,255,171,255,255,170,167,167,167,166,166,166,166,166,166,166,166,166,169,169,169,169,169,169,170,170,170,170,170,170,166,166,166,166,166,166,164,164,164,164,164,164,165,165,165,165,165,165,147,147,147,147,147,147,67,67,67,67,67,67,65,65,65,65,65,65,70,70,70,70,70,70,43,43,43,43,43,43,13,13,13,13,13,13,26,26,26,26,26,26,6,6,6,6,6,6,21,21,21,21,21,21,21,21,21,13,13,13,13,13,13,37,37,37,37,37,37,106,106,106,106,106,106,102,102,102,102,102,102,74,74,74,74,74,74,48,48,48,48,48,48,87,87,87,87,87,87,149,149,149,149,149,149,146,146,146,145,145,145,150,150,150,150,150,150,154,154,154,154,154,154,155,155,155,155,155,155,155,155,155,155,155,155,156,156,156,156,156,156,152,152,152,152,152,152,149,149,149,148,148,148,145,145,145,145,145,145,148,148,148,147,147,147,149,149,149,149,149,149,148,148,148,148,148,148,148,148,148,148,148,148,147,147,147,152,152,152,152,152,152,151,151,151,151,151,151,149,149,149,149,149,149,147,147,147,147,147,147,147,147,147,147,147,147,145,145,145,145,145,145,145,145,145,144,144,144,138,138,138,138,138,138,141,141,141,141,141,141,140,140,140,140,140,140,139,139,139,138,138,138,140,140,140,139,139,139,147,117,147,146,117,146,143,115,143,143,114,143,144,115,144,144,115,144,143,114,143,142,114,142,141,112,141,141,112,141,140,112,140,140,112,140,140,112,140,140,112,140,140,112,140,139,111,139,139,111,139,138,110,138,137,110,137,139,111,139,139,111,139,209,209,209,209,209,209,208,208,208,206,206,206,206,206,206,208,208,208,208,208,208,210,210,210,210,210,210,199,199,199,199,199,199,201,201,201,201,201,201,203,203,203,202,202,202,202,202,202,202,202,202,198,198,198,198,198,198,204,163,204,204,163,204,204,163,204,203,163,203,208,166,208,207,166,207,203,162,203,203,162,203,201,160,201,200,160,200,200,160,200,202,162,202,202,162,202,202,161,202,202,161,202,208,166,208,208,166,208,205,164,205,205,164,205,205,164,205,205,164,205,203,162,203,202,162,202,198,158,198,198,158,198,200,160,200,200,160,200,202,161,202,201,161,201,201,161,201,201,161,201,205,164,205,205,164,205,205,164,205,204,163,204,202,162,202,202,161,202,202,161,202,197,158,197,197,158,197,197,158,197,197,157,197,201,161,201,201,160,201,159,127,159,159,127,159,114,91,114,114,91,114,55,44,55,55,44,55,12,9,12,12,9,12,12,9,12,12,9,12,8,6,8,8,6,8,12,9,12,12,9,12,32,25,32,32,25,32,18,14,18,18,14,18,20,16,20,20,16,20,20,16,20,92,73,92,92,73,92,77,62,77,77,62,77,53,43,53,53,43,53,79,63,79,79,63,79,35,28,35,35,28,35,49,39,49,49,39,49,29,23,29,29,23,29,57,45,57,57,45,57,116,92,116,115,92,115,141,112,141,141,112,141,187,150,187,187,150,187,193,154,193,192,154,192,192,154,192,192,153,192,192,153,192,191,153,191,191,153,191,189,151,189,189,151,189,185,148,185,184,147,184,186,149,186,186,148,186,184,147,184,255,255,255,255,233,244,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,244,253,255,255,255,255,255,255,255,255,255,255,255,255,255,243,182,255,233,180,255,233,180,255,208,181,255,194,181,255,205,181,255,196,182,255,226,182,255,195,172,255,223,172,255,202,174,255,222,173,255,223,175,255,195,175,255,230,174,255,230,174,255,205,170,255,195,170,255,255,175,255,226,175,255,255,175,255,255,174,200,189,178,245,211,177,186,180,174,255,216,173,200,186,171,207,189,171,255,223,172,233,203,172,240,206,172,203,188,172,255,255,171,255,255,176,255,255,176,255,255,174,255,250,174,255,255,173,255,255,173,255,255,171,255,255,171,255,255,167,255,255,167,255,255,168,255,255,168,255,255,169,255,255,169,255,255,169,169,169,169,172,172,172,172,172,172,171,171,171,171,171,171,169,169,169,169,169,169,165,165,165,165,165,165,164,164,164,164,164,164,164,164,164,167,167,167,167,167,167,132,132,132,132,132,132,95,95,95,94,94,94,45,45,45,45,45,45,10,10,10,10,10,10,10,10,10,10,10,10,6,6,6,6,6,6,10,10,10,9,9,9,26,26,26,26,26,26,14,14,14,14,14,14,16,16,16,16,16,16,75,75,75,75,75,75,64,64,64,63,63,63,63,63,63,44,44,44,44,44,44,65,65,65,65,65,65,29,29,29,29,29,29,40,40,40,40,40,40,24,24,24,24,24,24,46,46,46,46,46,46,94,94,94,94,94,94,115,115,115,114,114,114,152,152,152,152,152,152,157,157,157,156,156,156,156,156,156,156,156,156,156,156,156,155,155,155,154,154,154,153,153,153,153,153,153,150,150,150,150,150,150,151,151,151,151,151,151,149,149,149,149,149,149,148,148,148,148,148,148,148,148,148,148,148,148,151,151,151,150,150,150,152,152,152,151,151,151,150,150,150,149,149,149,148,148,148,148,148,148,146,146,146,146,146,146,147,147,147,147,147,147,148,148,148,148,148,148,140,140,140,140,140,140,140,140,140,141,141,141,141,141,141,142,142,142,142,142,142,142,142,142,141,141,141,138,138,138,138,138,138,142,114,142,142,114,142,142,113,142,142,113,142,144,115,144,144,115,144,141,113,141,141,113,141,139,111,139,139,111,139,140,112,140,140,112,140,140,112,140,140,112,140,144,115,144,144,115,144,142,114,142,142,114,142,142,113,142,207,207,207,207,207,207,207,207,207,206,206,206,206,206,206,210,210,210,210,210,210,206,206,206,206,206,206,201,201,201,201,201,201,199,199,199,199,199,199,201,201,201,201,201,201,192,192,192,192,192,192,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,203,163,203,203,163,203,203,162,203,203,162,203,207,166,207,207,165,207,203,162,203,202,162,202,206,165,206,206,165,206,208,166,208,208,166,208,208,166,208,208,166,208,208,166,208,207,166,207,207,166,207,205,164,205,205,164,205,205,164,205,204,163,204,206,165,206,206,165,206,200,160,200,200,160,200,203,163,203,203,163,203,203,162,203,203,162,203,201,160,201,200,160,200,198,158,198,198,158,198,198,158,198,198,158,198,197,158,197,201,161,201,201,161,201,150,120,150,149,119,149,100,80,100,100,80,100,47,37,47,47,37,47,38,31,38,38,31,38,42,34,42,42,34,42,18,14,18,18,14,18,12,9,12,12,9,12,36,29,36,36,29,36,22,17,22,22,17,22,22,17,22,44,35,44,44,35,44,74,59,74,74,59,74,80,64,80,80,64,80,86,68,86,85,68,85,91,73,91,91,73,91,133,106,133,133,106,133,77,62,77,77,61,77,41,33,41,41,33,41,35,28,35,35,28,35,35,28,35,21,17,21,21,17,21,110,88,110,109,87,109,162,130,162,162,130,162,189,151,189,189,151,189,193,154,193,192,154,192,192,154,192,192,153,192,192,153,192,191,153,191,189,151,189,189,151,189,191,152,191,190,152,190,184,147,184,184,147,184,255,255,255,255,255,255,255,255,255,255,255,255,255,244,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,241,181,255,241,180,255,237,180,255,240,180,255,223,180,255,190,183,255,198,183,255,191,179,255,214,178,255,198,178,255,212,174,255,229,174,255,189,172,255,191,172,255,215,173,255,228,173,255,207,165,255,194,165,255,255,176,255,255,175,255,255,175,255,255,175,202,188,175,204,189,174,189,181,174,188,181,174,198,186,173,232,203,173,255,215,173,255,225,176,236,206,176,211,192,172,255,255,172,255,255,175,255,255,175,255,255,176,255,247,176,255,255,176,255,255,175,255,255,175,255,255,175,255,255,173,255,255,173,255,255,172,255,255,172,255,255,173,255,255,173,255,255,168,167,167,167,167,167,167,170,170,170,170,170,170,170,170,170,169,169,169,167,167,167,167,167,167,165,165,165,165,165,165,165,165,165,164,164,164,167,167,167,167,167,167,124,124,124,124,124,124,83,83,83,83,83,83,39,39,39,38,38,38,32,32,32,32,32,32,32,32,32,35,35,35,35,35,35,15,15,15,15,15,15,10,10,10,10,10,10,29,29,29,29,29,29,18,18,18,18,18,18,36,36,36,36,36,36,61,61,61,60,60,60,65,65,65,65,65,65,70,70,70,70,70,70,70,70,70,75,75,75,74,74,74,108,108,108,108,108,108,63,63,63,63,63,63,33,33,33,33,33,33,28,28,28,28,28,28,17,17,17,17,17,17,89,89,89,89,89,89,132,132,132,132,132,132,154,154,154,153,153,153,156,156,156,156,156,156,156,156,156,156,156,156,155,155,155,155,155,155,155,155,155,153,153,153,153,153,153,154,154,154,154,154,154,149,149,149,149,149,149,149,149,149,148,148,148,148,148,148,148,148,148,151,151,151,151,151,151,152,152,152,152,152,152,150,150,150,150,150,150,149,149,149,146,146,146,146,146,146,146,146,146,146,146,146,145,145,145,145,145,145,148,148,148,148,148,148,145,145,145,144,144,144,141,141,141,141,141,141,139,139,139,139,139,139,140,140,140,140,140,140,134,134,134,134,134,134,143,114,143,142,114,142,142,114,142,142,113,142,142,113,142,142,113,142,141,113,141,141,113,141,141,113,141,141,113,141,141,112,141,143,115,143,143,114,143,140,112,140,140,112,140,143,114,143,142,114,142,144,115,144,207,207,207,207,207,207,207,207,207,209,209,209,209,209,209,209,209,209,208,208,208,193,193,193,193,193,193,189,189,189,189,189,189,188,188,188,199,199,199,199,199,199,197,197,197,197,197,197,205,164,205,205,164,205,205,164,205,205,164,205,204,163,204,204,163,204,204,163,204,204,163,204,208,166,208,208,166,208,208,166,208,208,166,208,207,166,207,205,164,205,205,164,205,205,164,205,205,164,205,202,162,202,202,162,202,202,162,202,202,161,202,202,161,202,202,161,202,201,161,201,201,161,201,201,161,201,201,161,201,201,160,201,205,164,205,205,164,205,194,155,194,194,155,194,187,150,187,187,150,187,166,133,166,166,133,166,128,103,128,128,103,128,145,116,145,145,116,145,128,102,128,128,102,128,138,110,138,138,110,138,138,110,138,144,115,144,144,115,144,47,37,47,47,37,47,34,27,34,34,27,34,12,9,12,12,9,12,22,18,22,22,17,22,30,24,30,30,24,30,12,9,12,12,9,12,26,21,26,26,21,26,26,21,26,18,14,18,18,14,18,20,16,20,20,16,20,14,11,14,14,11,14,68,54,68,68,54,68,50,40,50,50,40,50,72,57,72,72,57,72,65,52,65,65,52,65,25,20,25,25,20,25,25,20,25,37,30,37,37,30,37,91,72,91,91,72,91,21,17,21,21,17,21,29,23,29,29,23,29,108,86,108,108,86,108,174,139,174,174,139,174,187,150,187,187,150,187,187,149,187,189,151,189,188,151,188,192,154,192,192,153,192,192,153,192,191,153,191,191,153,191,191,152,191,189,151,189,188,151,188,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,193,217,255,255,255,255,255,255,255,255,255,255,255,255,255,251,255,255,255,255,255,247,185,255,241,181,255,241,181,255,241,180,255,239,180,255,228,182,255,239,181,255,208,181,255,208,181,255,200,167,255,189,167,255,211,167,255,204,163,255,196,163,255,223,172,255,211,171,255,224,169,255,225,169,255,255,176,255,255,176,255,255,176,255,255,175,204,190,175,189,182,175,204,189,175,189,182,174,233,203,174,250,214,177,245,211,177,207,192,177,255,221,176,255,233,174,221,198,174,255,255,174,255,255,174,255,255,171,255,243,171,255,255,171,255,255,171,255,255,170,255,255,170,255,255,170,255,255,170,255,255,169,255,255,169,255,255,169,255,255,172,255,255,172,163,163,163,162,162,162,157,157,157,157,157,157,139,139,139,139,139,139,107,107,107,107,107,107,121,121,121,120,120,120,106,106,106,106,106,106,106,106,106,114,114,114,114,114,114,119,119,119,119,119,119,39,39,39,39,39,39,28,28,28,28,28,28,10,10,10,10,10,10,18,18,18,18,18,18,25,25,25,25,25,25,10,10,10,10,10,10,10,10,10,21,21,21,21,21,21,14,14,14,14,14,14,16,16,16,16,16,16,11,11,11,11,11,11,55,55,55,55,55,55,41,41,41,40,40,40,58,58,58,58,58,58,58,58,58,53,53,53,53,53,53,21,21,21,21,21,21,30,30,30,30,30,30,74,74,74,74,74,74,17,17,17,17,17,17,24,24,24,23,23,23,87,87,87,87,87,87,141,141,141,141,141,141,141,141,141,152,152,152,151,151,151,153,153,153,153,153,153,155,155,155,155,155,155,155,155,155,155,155,155,154,154,154,154,154,154,152,152,152,152,152,152,152,152,152,152,152,152,148,148,148,148,148,148,148,148,148,149,149,149,149,149,149,150,150,150,150,150,150,152,152,152,151,151,151,150,150,150,149,149,149,146,146,146,146,146,146,146,146,146,145,145,145,147,147,147,147,147,147,146,146,146,146,146,146,146,146,146,135,135,135,135,135,135,132,132,132,132,132,132,139,139,139,139,139,139,137,137,137,137,137,137,143,114,143,142,114,142,142,114,142,142,114,142,142,113,142,142,113,142,141,113,141,141,113,141,141,113,141,144,115,144,144,115,144,143,115,143,143,115,143,142,113,142,141,113,141,141,113,141,205,205,205,205,205,205,205,205,205,203,203,203,203,203,203,202,202,202,192,192,192,191,191,191,189,189,189,189,189,189,200,200,200,200,200,200,195,195,195,195,195,195,206,164,206,205,164,205,207,166,207,207,166,207,211,169,211,211,169,211,211,169,211,211,169,211,211,169,211,211,168,211,210,168,210,206,165,206,206,165,206,204,163,204,203,163,203,199,159,199,199,159,199,195,156,195,194,155,194,194,155,194,196,157,196,196,157,196,202,162,202,202,162,202,202,161,202,202,161,202,199,159,199,199,159,199,197,158,197,197,157,197,180,144,180,180,144,180,180,144,180,194,155,194,194,155,194,198,158,198,198,158,198,135,108,135,135,108,135,89,71,89,89,71,89,93,74,93,93,74,93,74,59,74,74,59,74,128,102,128,128,102,128,128,102,128,63,51,63,63,51,63,76,60,76,76,60,76,16,13,16,16,13,16,12,9,12,12,9,12,12,9,12,12,9,12,12,9,12,12,9,12,12,9,12,36,29,36,36,29,36,32,26,32,32,25,32,36,29,36,36,29,36,30,24,30,30,24,30,12,9,12,12,9,12,22,17,22,22,17,22,34,27,34,34,27,34,34,27,34,32,25,32,32,25,32,31,25,31,31,25,31,89,71,89,89,71,89,91,73,91,91,73,91,5,4,5,5,4,5,3,3,3,3,3,3,3,3,3,11,9,11,11,9,11,118,94,118,117,94,117,188,150,188,188,150,188,193,155,193,193,154,193,193,154,193,192,154,192,188,151,188,188,150,188,188,150,188,188,150,188,187,150,187,185,148,185,185,148,185,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,198,219,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,182,255,239,179,255,239,179,255,239,179,255,239,179,255,236,178,255,237,178,255,233,176,255,225,176,255,172,166,255,193,166,255,183,166,255,206,163,255,192,163,255,225,172,255,211,172,255,224,168,255,215,168,255,255,177,255,255,176,255,255,178,215,196,178,204,192,181,206,193,181,201,191,180,226,203,180,225,203,180,200,190,180,210,194,179,255,219,175,239,207,175,190,182,173,202,187,173,250,210,169,255,227,169,255,245,165,255,255,164,255,255,166,255,255,166,255,255,165,255,255,171,255,255,170,255,255,170,255,255,170,255,255,168,255,255,167,255,255,165,255,255,165,151,151,151,150,150,150,163,163,163,162,162,162,165,165,165,165,165,165,165,165,165,112,112,112,112,112,112,74,74,74,74,74,74,77,77,77,77,77,77,61,61,61,61,61,61,106,106,106,106,106,106,53,53,53,52,52,52,52,52,52,62,62,62,62,62,62,13,13,13,13,13,13,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,30,30,30,30,30,30,30,30,30,26,26,26,26,26,26,29,29,29,29,29,29,24,24,24,24,24,24,9,9,9,9,9,9,18,18,18,18,18,18,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26,26,26,26,25,25,25,72,72,72,72,72,72,74,74,74,74,74,74,4,4,4,4,4,4,3,3,3,3,3,3,9,9,9,9,9,9,9,9,9,95,95,95,95,95,95,152,152,152,152,152,152,156,156,156,156,156,156,156,156,156,155,155,155,152,152,152,152,152,152,152,152,152,151,151,151,150,150,150,149,149,149,149,149,149,149,149,149,149,149,149,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,147,147,147,149,149,149,148,148,148,147,147,147,146,146,146,146,146,146,145,145,145,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,142,142,142,142,142,142,134,134,134,134,134,134,132,132,132,132,132,132,132,132,132,139,139,139,139,139,139,136,136,136,135,135,135,143,114,143,142,114,142,144,115,144,144,115,144,146,117,146,146,117,146,146,117,146,146,117,146,146,116,146,145,116,145,145,116,145,142,114,142,142,113,142,140,112,140,206,206,206,205,205,205,203,203,203,203,203,203,192,192,192,192,192,192,190,190,190,190,190,190,200,200,200,200,200,200,196,196,196,195,195,195,206,165,206,206,165,206,206,165,206,208,166,208,208,166,208,212,169,212,212,169,212,212,169,212,211,169,211,211,169,211,211,169,211,207,165,207,207,165,207,206,165,206,204,163,204,204,163,204,200,160,200,199,159,199,195,156,195,195,156,195,197,157,197,197,157,197,203,162,203,203,162,203,203,162,203,202,162,202,202,162,202,200,160,200,200,160,200,198,158,198,197,158,197,180,144,180,180,144,180,195,156,195,195,156,195,199,159,199,198,159,198,198,159,198,135,108,135,135,108,135,89,71,89,89,71,89,93,74,93,93,74,93,74,59,74,74,59,74,128,102,128,128,102,128,128,102,128,64,51,64,64,51,64,76,61,76,76,61,76,16,13,16,16,13,16,12,9,12,12,9,12,12,9,12,12,9,12,12,9,12,12,9,12,12,9,12,36,29,36,36,29,36,32,26,32,32,26,32,36,29,36,36,29,36,30,24,30,30,24,30,12,9,12,12,9,12,12,9,12,22,17,22,22,17,22,34,27,34,34,27,34,32,25,32,32,25,32,32,25,32,32,25,32,90,72,90,89,71,89,91,73,91,91,73,91,91,73,91,5,4,5,5,4,5,3,3,3,3,3,3,11,9,11,11,9,11,118,94,118,118,94,118,189,151,189,188,151,188,188,150,188,194,155,194,193,155,193,193,154,193,193,154,193,189,151,189,189,151,189,188,151,188,188,150,188,186,149,186,186,148,186,185,148,185,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,182,255,240,180,255,239,180,255,239,179,255,239,179,255,238,179,255,239,178,255,236,176,255,236,176,255,217,166,255,208,166,255,207,164,255,189,164,255,175,164,255,222,173,255,227,172,255,225,168,255,207,168,255,255,177,255,255,177,255,255,178,228,203,178,187,184,182,189,185,181,196,189,181,255,226,181,233,207,180,255,222,180,255,228,180,255,255,176,255,255,176,249,211,174,181,177,173,239,204,169,255,255,169,255,229,165,245,205,165,255,255,165,255,255,166,255,255,166,255,255,171,255,255,171,255,255,170,255,255,170,255,255,168,255,255,168,255,255,166,255,255,166,255,255,165,151,151,151,151,151,151,163,163,163,162,162,162,166,166,166,165,165,165,113,113,113,113,113,113,74,74,74,74,74,74,77,77,77,77,77,77,77,77,77,62,62,62,61,61,61,106,106,106,106,106,106,53,53,53,52,52,52,63,63,63,63,63,63,13,13,13,13,13,13,13,13,13,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,30,30,30,30,30,30,26,26,26,26,26,26,29,29,29,29,29,29,29,29,29,24,24,24,24,24,24,9,9,9,9,9,9,18,18,18,18,18,18,27,27,27,27,27,27,26,26,26,26,26,26,26,26,26,26,26,26,25,25,25,73,73,73,72,72,72,74,74,74,74,74,74,4,4,4,4,4,4,3,3,3,3,3,3,9,9,9,9,9,9,9,9,9,95,95,95,95,95,95,152,152,152,152,152,152,156,156,156,156,156,156,156,156,156,156,156,156,152,152,152,152,152,152,152,152,152,152,152,152,151,151,151,150,150,150,149,149,149,149,149,149,149,149,149,149,149,149,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,147,147,147,149,149,149,148,148,148,147,147,147,147,147,147,145,145,145,145,145,145,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,142,142,142,142,142,142,134,134,134,134,134,134,132,132,132,132,132,132,139,139,139,139,139,139,136,136,136,136,136,136,135,135,135,143,114,143,143,114,143,144,115,144,144,115,144,146,117,146,146,117,146,146,117,146,146,117,146,146,116,146,145,116,145,142,114,142,142,114,142,206,206,206,206,206,206,199,199,199,199,199,199,201,201,201,201,201,201,203,203,203,203,203,203,203,203,203,203,203,203,202,202,202,207,165,207,206,165,206,211,168,211,210,168,210,212,170,212,212,170,212,210,168,210,210,168,210,210,168,210,207,166,207,207,166,207,205,164,205,205,164,205,209,167,209,209,167,209,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,203,163,203,203,162,203,201,161,201,201,161,201,199,159,199,198,159,198,198,158,198,194,155,194,194,155,194,196,156,196,195,156,195,178,143,178,178,143,178,111,89,111,111,89,111,20,16,20,20,16,20,20,16,20,33,26,33,33,26,33,22,18,22,22,18,22,29,23,29,29,23,29,79,63,79,79,63,79,95,76,95,95,76,95,95,76,95,138,111,138,138,110,138,66,52,66,66,52,66,22,18,22,22,18,22,8,6,8,8,6,8,2,1,2,2,1,2,2,1,2,2,1,2,2,1,2,8,6,8,8,6,8,18,14,18,18,14,18,42,34,42,42,34,42,42,34,42,14,11,14,14,11,14,20,16,20,20,16,20,32,25,32,32,25,32,54,43,54,54,43,54,46,37,46,46,36,46,46,36,46,110,88,110,110,88,110,82,65,82,81,65,81,61,49,61,61,49,61,11,9,11,11,9,11,1,1,1,1,1,1,1,1,1,13,11,13,13,11,13,61,48,61,61,48,61,169,135,169,169,135,169,192,153,192,192,153,192,187,150,187,187,150,187,187,150,187,189,151,189,188,151,188,184,147,184,184,147,184,186,149,186,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,239,255,255,255,255,255,255,255,255,255,255,248,255,255,255,255,255,255,255,255,235,177,255,235,176,255,235,176,255,237,178,255,237,178,255,244,183,255,244,183,255,239,179,255,239,178,255,229,172,255,231,172,255,232,174,255,218,174,247,168,173,255,205,175,255,232,175,255,224,174,255,229,174,255,255,178,255,255,177,255,229,181,185,183,180,182,182,182,207,194,182,199,190,181,217,198,179,255,233,179,255,244,177,255,255,177,255,255,175,255,255,174,255,255,178,255,224,177,191,182,173,255,255,173,255,223,173,255,255,173,255,255,172,255,255,172,255,255,172,255,255,171,255,255,171,255,255,169,255,255,169,255,255,169,255,255,167,255,255,166,255,255,162,255,255,162,164,164,164,163,163,163,149,149,149,149,149,149,92,92,92,92,92,92,92,92,92,17,17,17,17,17,17,27,27,27,27,27,27,19,19,19,19,19,19,24,24,24,24,24,24,65,65,65,65,65,65,65,65,65,78,78,78,78,78,78,114,114,114,114,114,114,54,54,54,54,54,54,18,18,18,18,18,18,6,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,15,15,15,14,14,14,34,34,34,34,34,34,34,34,34,11,11,11,11,11,11,16,16,16,16,16,16,26,26,26,26,26,26,44,44,44,44,44,44,44,44,44,37,37,37,37,37,37,89,89,89,89,89,89,66,66,66,66,66,66,50,50,50,49,49,49,9,9,9,9,9,9,9,9,9,1,1,1,1,1,1,11,11,11,11,11,11,49,49,49,49,49,49,136,136,136,136,136,136,155,155,155,154,154,154,154,154,154,151,151,151,150,150,150,152,152,152,152,152,152,148,148,148,148,148,148,149,149,149,149,149,149,150,150,150,150,150,150,150,150,150,148,148,148,148,148,148,146,146,146,146,146,146,150,150,150,150,150,150,145,145,145,145,145,145,142,142,142,142,142,142,142,142,142,143,143,143,143,143,143,147,147,147,147,147,147,144,144,144,143,143,143,139,139,139,138,138,138,138,138,138,140,140,140,139,139,139,141,141,141,141,141,141,140,140,140,140,140,140,143,114,143,143,114,143,146,116,146,145,116,145,145,116,145,146,117,146,146,117,146,145,116,145,144,115,144,143,114,143,143,114,143,208,208,208,208,208,208,199,199,199,199,199,199,199,199,199,205,205,205,205,205,205,205,205,205,205,205,205,207,166,207,207,165,207,207,165,207,207,165,207,207,165,207,209,167,209,208,167,208,206,165,206,206,165,206,206,165,206,206,165,206,195,156,195,195,156,195,195,156,195,199,159,199,199,159,199,205,164,205,205,164,205,205,164,205,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,203,163,203,203,162,203,203,162,203,205,164,205,205,164,205,190,152,190,190,152,190,190,152,190,63,50,63,63,50,63,42,33,42,42,33,42,44,35,44,44,35,44,41,33,41,41,33,41,41,33,41,37,30,37,37,30,37,79,63,79,79,63,79,52,41,52,52,41,52,58,46,58,58,46,58,58,46,58,74,59,74,74,59,74,105,84,105,105,84,105,33,26,33,33,26,33,37,29,37,37,29,37,37,29,37,6,4,6,6,4,6,14,11,14,14,11,14,10,8,10,10,8,10,20,16,20,20,16,20,36,29,36,36,29,36,36,29,36,16,13,16,16,13,16,30,24,30,30,24,30,52,42,52,52,42,52,48,38,48,48,38,48,48,38,48,40,32,40,40,32,40,146,117,146,146,117,146,148,118,148,148,118,148,84,67,84,83,67,83,83,67,83,55,44,55,55,44,55,7,6,7,7,6,7,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,29,23,29,29,23,29,151,121,151,151,121,151,190,152,190,190,152,190,193,155,193,193,154,193,193,154,193,193,154,193,192,154,192,188,150,188,255,255,255,255,255,255,255,255,255,255,255,255,255,202,222,245,180,205,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,243,183,255,243,183,255,245,184,255,245,184,255,245,184,255,247,185,255,247,185,255,239,179,255,239,179,255,241,180,255,241,180,255,230,172,255,215,172,219,156,172,255,210,177,255,231,177,255,227,177,255,232,176,255,255,178,255,255,178,195,186,177,199,188,177,199,189,179,191,185,179,193,186,178,255,255,176,255,255,176,255,255,176,255,255,175,255,255,166,255,255,166,255,255,169,255,255,169,218,193,168,235,204,174,255,244,173,255,255,173,255,255,173,255,255,173,255,255,172,255,255,172,255,255,172,255,255,171,255,255,171,255,255,171,255,255,171,255,255,170,255,255,172,255,255,172,159,159,159,159,159,159,158,158,158,52,52,52,52,52,52,35,35,35,35,35,35,36,36,36,36,36,36,34,34,34,34,34,34,31,31,31,31,31,31,31,31,31,65,65,65,65,65,65,43,43,43,43,43,43,48,48,48,48,48,48,61,61,61,61,61,61,61,61,61,86,86,86,86,86,86,27,27,27,27,27,27,30,30,30,30,30,30,5,5,5,5,5,5,5,5,5,11,11,11,11,11,11,8,8,8,8,8,8,16,16,16,16,16,16,29,29,29,29,29,29,29,29,29,13,13,13,13,13,13,24,24,24,24,24,24,42,42,42,42,42,42,39,39,39,39,39,39,32,32,32,32,32,32,32,32,32,118,118,118,118,118,118,120,120,120,119,119,119,67,67,67,67,67,67,45,45,45,45,45,45,44,44,44,6,6,6,6,6,6,0,0,0,0,0,0,3,3,3,3,3,3,23,23,23,23,23,23,23,23,23,121,121,121,121,121,121,153,153,153,152,152,152,155,155,155,155,155,155,155,155,155,155,155,155,154,154,154,151,151,151,151,151,151,149,149,149,149,149,149,147,147,147,147,147,147,143,143,143,143,143,143,148,148,148,147,147,147,147,147,147,145,145,145,145,145,145,147,147,147,146,146,146,148,148,148,147,147,147,149,149,149,149,149,149,148,148,148,144,144,144,143,143,143,145,145,145,145,145,145,138,138,138,138,138,138,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,114,143,143,114,143,143,114,143,142,114,142,144,115,144,144,115,144,143,115,143,142,113,142,142,113,142,209,209,209,204,204,204,204,204,204,206,206,206,206,206,206,208,208,208,208,208,208,210,168,210,210,168,210,210,168,210,207,166,207,207,166,207,207,166,207,207,165,207,202,162,202,202,162,202,202,162,202,206,165,206,206,165,206,206,165,206,206,165,206,206,165,206,206,164,206,206,164,206,205,164,205,205,164,205,207,166,207,207,166,207,205,164,205,205,164,205,204,163,204,204,163,204,204,163,204,204,163,204,204,163,204,202,161,202,201,161,201,208,166,208,207,166,207,89,71,89,88,71,88,19,15,19,19,15,19,19,15,19,50,40,50,50,40,50,90,72,90,90,72,90,39,31,39,39,31,39,29,23,29,29,23,29,29,23,29,39,31,39,39,31,39,62,50,62,62,50,62,110,88,110,110,88,110,110,88,110,47,38,47,47,38,47,54,43,54,54,43,54,22,18,22,22,18,22,6,4,6,6,4,6,6,4,6,4,3,4,4,3,4,8,6,8,8,6,8,6,4,6,6,4,6,82,65,82,82,65,82,81,65,81,28,22,28,28,22,28,14,11,14,14,11,14,12,9,12,12,9,12,42,34,42,42,34,42,42,34,42,36,29,36,36,29,36,20,16,20,20,16,20,46,37,46,46,37,46,108,86,108,108,86,108,108,86,108,124,99,124,124,99,124,126,100,126,125,100,125,13,11,13,13,11,13,3,3,3,3,3,3,3,3,3,7,6,7,7,6,7,5,4,5,5,4,5,29,23,29,29,23,29,29,23,29,155,124,155,155,124,155,190,152,190,190,152,190,193,154,193,193,154,193,191,153,191,190,152,190,255,255,255,255,255,255,255,255,255,255,255,255,255,202,223,219,166,197,231,173,202,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,241,181,255,246,185,255,245,184,255,248,186,255,247,186,255,247,185,255,242,181,255,242,181,255,242,181,255,241,181,255,236,177,255,224,176,209,155,178,255,197,178,255,233,177,255,234,179,255,237,179,255,255,180,255,255,180,251,215,178,202,190,178,199,188,177,189,183,177,255,228,177,255,255,173,255,255,173,255,255,176,255,255,176,255,255,175,255,255,175,255,255,175,255,255,175,255,255,174,179,177,174,233,203,174,255,236,175,255,255,175,255,255,173,255,255,173,255,255,172,255,255,172,255,255,172,255,255,172,255,255,171,255,255,169,255,255,169,255,255,174,255,255,174,173,173,173,74,74,74,74,74,74,15,15,15,15,15,15,42,42,42,42,42,42,75,75,75,75,75,75,75,75,75,33,33,33,33,33,33,24,24,24,24,24,24,32,32,32,32,32,32,51,51,51,51,51,51,51,51,51,91,91,91,91,91,91,39,39,39,39,39,39,44,44,44,44,44,44,44,44,44,18,18,18,18,18,18,5,5,5,5,5,5,3,3,3,3,3,3,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,66,66,66,66,66,66,23,23,23,23,23,23,11,11,11,11,11,11,11,11,11,9,9,9,9,9,9,34,34,34,34,34,34,29,29,29,29,29,29,16,16,16,16,16,16,16,16,16,37,37,37,37,37,37,87,87,87,87,87,87,100,100,100,100,100,100,101,101,101,101,101,101,101,101,101,11,11,11,11,11,11,3,3,3,3,3,3,6,6,6,6,6,6,6,6,6,4,4,4,4,4,4,23,23,23,23,23,23,124,124,124,124,124,124,152,152,152,152,152,152,152,152,152,155,155,155,155,155,155,153,153,153,152,152,152,152,152,152,152,152,152,149,149,149,148,148,148,148,148,148,147,147,147,146,146,146,145,145,145,144,144,144,135,135,135,135,135,135,145,145,145,145,145,145,145,145,145,148,148,148,148,148,148,149,149,149,149,149,149,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,141,141,141,141,141,141,142,142,142,142,142,142,144,144,144,143,143,143,145,116,145,145,116,145,144,115,144,143,114,143,142,114,142,142,114,142,142,114,142,139,111,139,209,209,209,204,204,204,204,204,204,204,204,204,208,208,208,208,208,208,210,168,210,210,168,210,208,166,208,208,166,208,208,166,208,207,166,207,207,166,207,207,166,207,207,166,207,211,169,211,211,169,211,211,169,211,211,169,211,211,168,211,213,170,213,213,170,213,212,170,212,212,170,212,206,164,206,206,164,206,210,168,210,210,168,210,209,167,209,211,169,211,211,169,211,203,162,203,202,162,202,202,162,202,202,162,202,202,161,202,191,153,191,191,153,191,36,28,36,36,28,36,38,30,38,38,30,38,82,66,82,82,66,82,82,66,82,44,35,44,44,35,44,92,74,92,92,74,92,63,50,63,63,50,63,63,50,63,88,70,88,88,70,88,67,53,67,67,53,67,39,31,39,39,31,39,102,81,102,102,81,102,102,81,102,72,58,72,72,58,72,43,34,43,43,34,43,14,11,14,14,11,14,14,11,14,84,67,84,84,67,84,16,13,16,16,13,16,18,14,18,18,14,18,34,27,34,34,27,34,34,27,34,71,57,71,71,57,71,26,21,26,26,21,26,36,29,36,36,29,36,36,29,36,63,50,63,63,50,63,46,37,46,46,37,46,28,22,28,28,22,28,28,22,28,18,14,18,18,14,18,28,22,28,28,22,28,46,37,46,46,36,46,66,53,66,66,52,66,66,52,66,42,33,42,41,33,41,25,20,25,25,20,25,39,31,39,39,31,39,39,31,39,11,9,11,11,9,11,7,6,7,7,6,7,43,34,43,43,34,43,190,152,190,190,152,190,190,152,190,194,155,194,193,155,193,193,154,193,193,154,193,191,152,191,255,255,255,255,255,255,255,255,255,255,227,240,220,168,200,224,170,201,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,185,255,243,183,255,243,183,255,248,186,255,247,186,255,247,186,255,247,186,255,247,185,255,237,178,255,237,177,255,241,181,255,241,181,255,182,177,229,162,176,255,206,176,255,236,179,255,240,179,255,255,181,255,234,181,188,183,178,230,204,178,197,188,178,236,207,178,255,255,177,255,243,177,255,255,177,255,255,180,255,255,180,255,250,180,255,218,179,249,214,179,255,255,181,255,255,180,255,255,180,195,187,180,255,255,174,255,255,174,255,255,173,255,255,177,255,255,176,255,255,178,255,255,178,255,255,170,255,255,170,255,255,170,255,255,169,255,255,169,255,255,160,255,255,160,30,30,30,30,30,30,31,31,31,31,31,31,31,31,31,68,68,68,68,68,68,36,36,36,36,36,36,77,77,77,76,76,76,52,52,52,52,52,52,52,52,52,72,72,72,72,72,72,55,55,55,55,55,55,32,32,32,32,32,32,32,32,32,84,84,84,84,84,84,59,59,59,59,59,59,35,35,35,35,35,35,11,11,11,11,11,11,11,11,11,69,69,69,69,69,69,13,13,13,13,13,13,15,15,15,15,15,15,15,15,15,28,28,28,28,28,28,58,58,58,58,58,58,21,21,21,21,21,21,21,21,21,29,29,29,29,29,29,51,51,51,51,51,51,37,37,37,37,37,37,22,22,22,22,22,22,22,22,22,14,14,14,14,14,14,22,22,22,22,22,22,37,37,37,37,37,37,37,37,37,53,53,53,53,53,53,33,33,33,33,33,33,20,20,20,20,20,20,31,31,31,31,31,31,31,31,31,9,9,9,9,9,9,6,6,6,6,6,6,34,34,34,34,34,34,34,34,34,152,152,152,152,152,152,155,155,155,155,155,155,155,155,155,154,154,154,152,152,152,152,152,152,152,152,152,147,147,147,147,147,147,150,150,150,150,150,150,146,146,146,146,146,146,146,146,146,144,144,144,144,144,144,148,148,148,148,148,148,146,146,146,146,146,146,149,149,149,149,149,149,149,149,149,148,148,148,148,148,148,142,142,142,142,142,142,145,145,145,144,144,144,144,144,144,141,141,141,141,141,141,144,144,144,143,143,143,145,116,145,145,116,145,143,114,143,143,114,143,143,114,143,142,114,142,205,205,205,205,205,205,209,209,209,209,209,209,211,169,211,211,168,211,208,167,208,208,167,208,208,166,208,208,166,208,208,166,208,208,166,208,208,166,208,212,169,212,212,169,212,212,169,212,211,169,211,211,169,211,213,171,213,213,170,213,213,170,213,213,170,213,213,170,213,206,165,206,206,165,206,210,168,210,210,168,210,212,169,212,212,169,212,212,169,212,203,162,203,203,162,203,203,162,203,203,162,203,192,153,192,192,153,192,191,153,191,36,28,36,36,28,36,38,30,38,38,30,38,82,66,82,82,66,82,82,66,82,44,35,44,44,35,44,93,74,93,93,74,93,63,50,63,63,50,63,88,70,88,88,70,88,88,70,88,67,53,67,67,53,67,39,31,39,39,31,39,102,82,102,102,82,102,102,82,102,73,58,73,73,58,73,43,35,43,43,35,43,14,11,14,14,11,14,14,11,14,85,68,85,85,68,85,16,13,16,16,13,16,18,14,18,18,14,18,18,14,18,35,28,35,35,28,35,72,57,72,71,57,71,26,21,26,26,21,26,26,21,26,36,29,36,36,29,36,63,50,63,63,50,63,46,37,46,46,37,46,28,22,28,28,22,28,28,22,28,18,14,18,18,14,18,28,22,28,28,22,28,46,37,46,46,37,46,46,37,46,66,53,66,66,53,66,42,33,42,42,33,42,26,20,26,25,20,25,25,20,25,39,31,39,39,31,39,11,9,11,11,9,11,7,6,7,7,6,7,7,6,7,43,34,43,43,34,43,191,153,191,191,152,191,194,155,194,194,155,194,194,155,194,194,155,194,193,155,193,191,153,191,255,255,255,255,255,255,255,255,255,212,163,195,255,225,240,228,173,203,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,245,186,255,244,184,255,244,183,255,246,187,255,243,187,255,247,186,255,248,186,255,248,186,255,237,178,255,237,178,255,242,181,255,242,181,255,234,177,213,156,177,255,174,176,255,236,180,255,239,180,255,255,181,201,191,181,184,181,179,188,183,179,255,243,178,255,255,178,255,255,178,255,237,177,255,255,177,255,255,181,255,255,180,255,230,180,255,251,180,255,231,179,255,232,181,255,255,181,255,255,180,255,253,180,255,255,180,255,255,174,255,255,174,255,255,177,255,255,177,255,255,178,255,255,178,255,255,171,255,255,170,255,255,170,255,255,170,255,255,170,255,255,160,255,255,160,30,30,30,30,30,30,30,30,30,31,31,31,31,31,31,68,68,68,68,68,68,36,36,36,36,36,36,36,36,36,77,77,77,77,77,77,52,52,52,52,52,52,73,73,73,73,73,73,72,72,72,55,55,55,55,55,55,32,32,32,32,32,32,84,84,84,84,84,84,84,84,84,59,59,59,59,59,59,35,35,35,35,35,35,11,11,11,11,11,11,11,11,11,69,69,69,69,69,69,13,13,13,13,13,13,15,15,15,15,15,15,28,28,28,28,28,28,28,28,28,58,58,58,58,58,58,21,21,21,21,21,21,29,29,29,29,29,29,29,29,29,51,51,51,51,51,51,37,37,37,37,37,37,22,22,22,22,22,22,22,22,22,14,14,14,14,14,14,22,22,22,22,22,22,37,37,37,37,37,37,37,37,37,53,53,53,53,53,53,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,31,31,31,31,31,31,9,9,9,9,9,9,6,6,6,6,6,6,34,34,34,34,34,34,34,34,34,152,152,152,152,152,152,155,155,155,155,155,155,155,155,155,155,155,155,154,154,154,153,153,153,152,152,152,147,147,147,147,147,147,150,150,150,150,150,150,150,150,150,146,146,146,146,146,146,144,144,144,144,144,144,149,149,149,148,148,148,148,148,148,146,146,146,146,146,146,149,149,149,149,149,149,149,149,149,148,148,148,148,148,148,142,142,142,142,142,142,145,145,145,144,144,144,141,141,141,141,141,141,141,141,141,144,144,144,144,144,144,145,116,145,145,116,145,143,114,143,143,114,143,209,209,209,209,209,209,216,172,216,216,172,216,215,172,215,215,172,215,215,172,215,211,168,211,211,168,211,210,168,210,208,166,208,208,166,208,210,168,210,210,168,210,214,171,214,214,171,214,214,171,214,214,171,214,214,171,214,211,169,211,211,169,211,209,167,209,209,167,209,209,167,209,208,167,208,208,167,208,212,170,212,212,170,212,210,168,210,210,168,210,210,168,210,203,162,203,203,162,203,130,104,130,130,104,130,25,20,25,25,20,25,25,20,25,17,13,17,17,13,17,83,66,83,82,66,82,53,42,53,53,42,53,53,42,53,74,59,74,74,59,74,91,72,91,90,72,90,73,59,73,73,59,73,73,59,73,92,74,92,92,74,92,73,58,73,73,58,73,46,36,46,46,36,46,46,36,46,77,62,77,77,61,77,112,90,112,112,90,112,8,6,8,8,6,8,8,6,8,24,19,24,24,19,24,4,3,4,4,3,4,22,18,22,22,18,22,22,18,22,35,28,35,35,28,35,57,46,57,57,46,57,105,84,105,104,83,104,104,83,104,39,31,39,38,31,38,100,80,100,100,80,100,47,37,47,46,37,46,46,37,46,63,50,63,63,50,63,50,40,50,50,40,50,42,34,42,42,34,42,42,34,42,60,48,60,60,48,60,106,85,106,106,85,106,44,35,44,44,35,44,44,35,44,38,30,38,38,30,38,20,16,20,19,15,19,19,15,19,27,22,27,27,22,27,23,19,23,23,19,23,7,6,7,7,6,7,7,6,7,116,93,116,116,93,116,193,154,193,193,154,193,194,155,194,194,155,194,194,155,194,190,152,190,255,255,255,255,255,255,255,232,245,213,164,198,255,255,255,212,164,198,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,244,184,255,244,184,255,244,184,255,250,189,255,248,189,255,247,187,255,246,187,255,248,186,255,248,186,255,247,186,255,242,182,255,242,181,255,239,181,255,223,181,239,168,181,255,225,180,255,239,180,255,255,185,208,197,185,190,187,185,233,209,185,255,255,184,255,248,180,255,255,180,255,255,178,255,255,178,255,255,179,255,255,179,255,236,179,255,224,182,255,236,182,255,255,181,255,255,181,255,255,179,255,255,179,255,255,179,255,255,176,255,255,176,255,255,176,255,255,176,255,255,179,255,255,179,255,255,178,255,255,176,255,255,176,255,255,170,255,255,170,253,181,109,247,178,109,108,108,108,21,21,21,21,21,21,14,14,14,14,14,14,69,69,69,69,69,69,68,68,68,44,44,44,44,44,44,61,61,61,61,61,61,75,75,75,75,75,75,75,75,75,61,61,61,60,60,60,76,76,76,76,76,76,76,76,76,60,60,60,60,60,60,37,37,37,37,37,37,63,63,63,63,63,63,63,63,63,92,92,92,92,92,92,6,6,6,6,6,6,20,20,20,20,20,20,20,20,20,3,3,3,3,3,3,18,18,18,18,18,18,28,28,28,28,28,28,28,28,28,46,46,46,46,46,46,85,85,85,84,84,84,31,31,31,31,31,31,31,31,31,81,81,81,80,80,80,37,37,37,37,37,37,50,50,50,50,50,50,50,50,50,40,40,40,40,40,40,34,34,34,34,34,34,48,48,48,48,48,48,48,48,48,85,85,85,85,85,85,35,35,35,35,35,35,30,30,30,30,30,30,30,30,30,16,16,16,15,15,15,22,22,22,22,22,22,19,19,19,19,19,19,19,19,19,6,6,6,6,6,6,93,93,93,93,93,93,154,154,154,154,154,154,153,153,153,155,155,155,155,155,155,151,151,151,151,151,151,149,149,149,149,149,149,149,149,149,150,150,150,150,150,150,151,151,151,151,151,151,151,151,151,151,151,151,150,150,150,147,147,147,147,147,147,147,147,147,146,146,146,151,151,151,151,151,151,150,150,150,149,149,149,149,149,149,148,148,148,148,148,148,145,145,145,145,145,145,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,148,118,148,148,118,148,203,203,203,216,173,216,216,173,216,216,173,216,216,172,216,216,172,216,215,172,215,215,172,215,209,167,209,209,167,209,208,167,208,208,167,208,208,166,208,210,168,210,210,168,210,210,168,210,210,168,210,212,169,212,212,169,212,212,169,212,214,171,214,213,171,213,211,169,211,211,169,211,211,169,211,211,168,211,211,168,211,210,168,210,210,168,210,189,151,189,189,151,189,188,151,188,66,53,66,66,53,66,27,22,27,27,22,27,25,20,25,25,20,25,25,20,25,59,47,59,59,47,59,53,42,53,53,42,53,87,69,87,87,69,87,87,69,87,114,91,114,114,91,114,59,47,59,59,47,59,59,47,59,54,43,54,54,43,54,71,57,71,71,57,71,54,43,54,54,43,54,54,43,54,100,80,100,100,80,100,119,95,119,119,95,119,10,8,10,10,8,10,10,8,10,6,5,6,6,5,6,10,8,10,10,8,10,24,19,24,24,19,24,24,19,24,58,46,58,58,46,58,62,49,62,62,49,62,61,49,61,41,33,41,41,32,41,41,32,41,41,32,41,43,34,43,43,34,43,43,34,43,14,11,14,14,11,14,44,35,44,44,35,44,69,55,69,69,55,69,69,55,69,77,61,77,77,61,77,40,32,40,40,32,40,40,32,40,30,24,30,30,24,30,6,4,6,6,4,6,4,3,4,4,3,4,4,3,4,0,0,0,0,0,0,4,3,4,3,3,3,7,6,7,7,6,7,7,6,7,7,6,7,7,6,7,35,28,35,35,28,35,178,142,178,177,142,177,177,142,177,193,154,193,192,154,192,190,152,190,190,152,190,255,255,255,255,255,255,255,255,255,227,172,203,255,255,255,255,251,255,229,174,207,255,255,255,255,243,254,255,255,255,255,255,255,255,255,255,255,245,185,255,244,184,255,244,184,255,249,188,255,249,188,255,243,183,255,242,183,255,243,183,255,243,183,255,243,182,255,243,182,255,242,182,255,238,180,255,235,179,230,164,179,255,204,175,255,208,175,255,254,186,203,194,186,190,188,185,255,255,185,255,255,185,255,255,184,255,255,184,255,255,178,255,255,178,255,255,178,255,246,178,255,255,177,255,255,179,255,255,179,255,255,178,255,255,178,255,255,178,255,255,179,255,240,179,255,255,181,255,255,180,255,255,178,255,255,178,255,255,178,255,255,177,255,255,177,255,255,177,255,255,176,255,255,158,255,255,158,255,255,158,126,91,55,55,55,55,23,23,23,23,23,23,23,23,23,21,21,21,21,21,21,49,49,49,49,49,49,44,44,44,44,44,44,44,44,44,72,72,72,72,72,72,94,94,94,94,94,94,48,48,48,48,48,48,48,48,48,45,45,45,45,45,45,58,58,58,58,58,58,44,44,44,44,44,44,44,44,44,82,82,82,82,82,82,97,97,97,97,97,97,97,97,97,8,8,8,8,8,8,5,5,5,5,5,5,8,8,8,8,8,8,8,8,8,20,20,20,20,20,20,47,47,47,47,47,47,50,50,50,50,50,50,50,50,50,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,34,34,34,34,34,34,11,11,11,11,11,11,36,36,36,36,36,36,36,36,36,55,55,55,55,55,55,62,62,62,61,61,61,32,32,32,32,32,32,32,32,32,24,24,24,24,24,24,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,6,6,6,6,6,6,6,6,6,6,6,6,28,28,28,28,28,28,28,28,28,141,141,141,141,141,141,153,153,153,153,153,153,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,149,149,149,149,149,149,153,153,153,153,153,153,153,153,153,151,151,151,151,151,151,147,147,147,147,147,147,147,147,147,147,147,147,146,146,146,149,149,149,149,149,149,146,146,146,146,146,146,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,143,143,143,143,143,143,143,143,143,139,139,139,139,139,139,148,118,148,217,173,217,216,173,216,216,173,216,216,173,216,216,173,216,216,173,216,209,167,209,209,167,209,209,167,209,209,167,209,209,167,209,211,169,211,211,168,211,211,168,211,210,168,210,210,168,210,212,170,212,212,170,212,214,171,214,214,171,214,214,171,214,212,169,212,211,169,211,211,169,211,211,169,211,211,169,211,211,169,211,211,169,211,189,151,189,189,151,189,66,53,66,66,53,66,66,53,66,27,22,27,27,22,27,25,20,25,25,20,25,59,47,59,59,47,59,59,47,59,53,42,53,53,42,53,87,69,87,87,69,87,87,69,87,114,91,114,114,91,114,59,47,59,59,47,59,55,44,55,55,44,55,55,44,55,71,57,71,71,57,71,54,43,54,54,43,54,54,43,54,101,80,101,101,80,101,119,95,119,119,95,119,10,8,10,10,8,10,10,8,10,6,5,6,6,5,6,10,8,10,10,8,10,10,8,10,25,20,25,24,19,24,58,46,58,58,46,58,62,49,62,62,49,62,62,49,62,41,33,41,41,33,41,41,33,41,41,33,41,41,32,41,43,34,43,43,34,43,14,11,14,14,11,14,45,36,45,45,36,45,45,36,45,69,55,69,69,55,69,77,62,77,77,61,77,77,61,77,40,32,40,40,32,40,30,24,30,30,24,30,6,4,6,6,4,6,6,4,6,4,3,4,4,3,4,0,0,0,0,0,0,0,0,0,4,3,4,4,3,4,8,6,8,7,6,7,7,6,7,7,6,7,7,6,7,35,28,35,35,28,35,178,142,178,178,142,178,193,155,193,193,154,193,193,154,193,191,152,191,190,152,190,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,202,226,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,245,185,255,245,185,255,245,185,255,249,188,255,249,188,255,244,184,255,244,184,255,243,183,255,243,183,255,243,183,255,243,183,255,243,182,255,240,180,255,239,180,255,192,180,255,174,176,255,202,175,239,213,186,196,191,186,201,193,186,255,255,185,255,255,185,255,255,185,255,255,185,255,255,179,255,255,178,255,255,178,255,255,178,255,255,178,255,255,179,255,255,179,255,221,179,255,255,178,255,255,178,255,255,180,255,249,179,255,255,181,255,255,181,255,255,180,255,255,178,255,255,178,255,255,178,255,255,177,255,255,177,255,255,177,255,255,177,255,255,158,255,255,158,126,91,55,55,55,55,55,55,55,23,23,23,23,23,23,21,21,21,21,21,21,49,49,49,49,49,49,49,49,49,44,44,44,44,44,44,72,72,72,72,72,72,94,94,94,94,94,94,94,94,94,49,49,49,48,48,48,45,45,45,45,45,45,45,45,45,59,59,59,58,58,58,45,45,45,44,44,44,82,82,82,82,82,82,82,82,82,97,97,97,97,97,97,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,8,8,8,8,8,8,20,20,20,20,20,20,20,20,20,47,47,47,47,47,47,50,50,50,50,50,50,50,50,50,33,33,33,33,33,33,33,33,33,33,33,33,34,34,34,34,34,34,34,34,34,11,11,11,11,11,11,36,36,36,36,36,36,36,36,36,55,55,55,55,55,55,62,62,62,62,62,62,32,32,32,32,32,32,32,32,32,24,24,24,24,24,24,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,28,28,28,28,28,28,141,141,141,141,141,141,154,154,154,153,153,153,153,153,153,151,151,151,151,151,151,151,151,151,151,151,151,149,149,149,149,149,149,149,149,149,153,153,153,153,153,153,151,151,151,151,151,151,151,151,151,147,147,147,147,147,147,147,147,147,147,147,147,150,150,150,149,149,149,149,149,149,146,146,146,146,146,146,146,146,146,145,145,145,145,145,145,145,145,145,145,145,145,143,143,143,143,143,143,140,140,140,139,139,139,217,173,217,217,173,217,217,173,217,216,173,216,216,173,216,214,171,214,214,171,214,216,173,216,216,173,216,216,172,216,216,172,216,215,172,215,215,172,215,215,172,215,215,172,215,215,172,215,215,172,215,215,172,215,214,171,214,214,171,214,214,171,214,214,171,214,210,168,210,209,167,209,181,145,181,181,145,181,181,145,181,125,100,125,125,100,125,99,79,99,99,79,99,17,13,17,17,13,17,17,13,17,23,18,23,23,18,23,12,10,12,12,10,12,12,10,12,55,44,55,55,44,55,57,46,57,57,46,57,68,54,68,68,54,68,68,54,68,95,76,95,95,76,95,31,25,31,31,25,31,31,25,31,65,52,65,65,52,65,55,44,55,54,43,54,54,43,54,82,65,82,82,65,82,105,84,105,105,84,105,8,6,8,8,6,8,8,6,8,12,10,12,12,10,12,31,25,31,31,25,31,31,25,31,16,13,16,16,13,16,68,55,68,68,54,68,68,54,68,45,36,45,45,36,45,51,41,51,51,41,51,20,16,20,20,16,20,20,16,20,20,16,20,20,16,20,35,28,35,34,27,34,34,27,34,57,46,57,57,45,57,40,32,40,40,32,40,65,52,65,65,52,65,65,52,65,26,21,26,26,21,26,6,4,6,6,4,6,6,4,6,0,0,0,0,0,0,8,6,8,8,6,8,8,6,8,36,29,36,36,28,36,10,8,10,10,8,10,8,6,8,8,6,8,8,6,8,17,14,17,17,14,17,1,1,1,1,1,1,1,1,1,97,77,97,97,77,97,192,153,192,191,153,191,191,153,191,191,153,191,191,153,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,207,230,255,255,255,255,191,218,255,255,255,255,255,255,255,255,255,255,248,187,255,247,187,255,253,191,255,252,191,255,252,190,255,244,184,255,244,184,255,236,178,255,236,178,255,236,177,255,243,183,255,243,183,255,243,182,255,242,182,255,227,182,190,146,176,255,212,176,197,192,187,199,193,186,255,239,186,255,255,186,255,246,186,255,255,185,255,255,185,255,255,183,255,255,183,255,255,182,255,255,184,255,255,184,255,255,183,255,227,183,231,207,183,255,238,183,255,255,182,255,255,182,255,255,182,255,255,181,255,255,181,255,255,181,255,255,181,255,255,180,255,255,176,255,255,176,255,255,176,255,255,152,255,248,152,240,172,104,227,166,104,192,137,82,194,138,82,82,82,82,14,14,14,14,14,14,19,19,19,19,19,19,19,19,19,10,10,10,10,10,10,46,46,46,46,46,46,45,45,45,47,47,47,47,47,47,56,56,56,56,56,56,78,78,78,78,78,78,78,78,78,26,26,26,26,26,26,53,53,53,53,53,53,53,53,53,45,45,45,44,44,44,67,67,67,67,67,67,67,67,67,85,85,85,85,85,85,6,6,6,6,6,6,10,10,10,10,10,10,10,10,10,25,25,25,25,25,25,13,13,13,13,13,13,13,13,13,55,55,55,55,55,55,36,36,36,36,36,36,41,41,41,41,41,41,41,41,41,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,28,28,28,28,28,28,46,46,46,46,46,46,46,46,46,32,32,32,32,32,32,52,52,52,52,52,52,21,21,21,21,21,21,21,21,21,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,28,28,28,28,28,28,28,28,28,8,8,8,7,7,7,6,6,6,6,6,6,14,14,14,14,14,14,14,14,14,1,1,1,1,1,1,77,77,77,77,77,77,77,77,77,152,152,152,152,152,152,152,152,152,151,151,151,151,151,151,151,151,151,151,151,151,152,152,152,152,152,152,153,153,153,153,153,153,153,153,153,151,151,151,151,151,151,148,148,148,147,147,147,147,147,147,148,148,148,148,148,148,151,151,151,151,151,151,146,146,146,146,146,146,146,146,146,141,141,141,141,141,141,145,145,145,145,145,145,145,145,145,145,145,145,144,144,144,217,174,217,217,173,217,217,173,217,217,173,217,217,173,217,216,173,216,216,173,216,216,173,216,216,173,216,216,173,216,216,173,216,216,172,216,216,172,216,215,172,215,215,172,215,215,172,215,215,172,215,215,172,215,215,172,215,215,172,215,212,170,212,212,170,212,212,170,212,190,152,190,190,152,190,190,152,190,190,152,190,190,152,190,95,76,95,94,75,94,6,5,6,6,5,6,6,5,6,51,41,51,51,41,51,8,6,8,8,6,8,32,25,32,32,25,32,32,25,32,62,49,62,62,49,62,32,25,32,32,25,32,32,25,32,42,34,42,42,34,42,59,47,59,59,47,59,59,47,59,38,30,38,38,30,38,59,47,59,59,47,59,59,47,59,110,88,110,109,87,109,95,76,95,95,76,95,10,8,10,10,8,10,10,8,10,8,6,8,8,6,8,33,26,33,33,26,33,33,26,33,27,21,27,27,21,27,79,63,79,79,63,79,79,63,79,27,21,27,27,21,27,76,61,76,76,61,76,76,61,76,49,39,49,49,39,49,26,21,26,26,21,26,90,72,90,90,72,90,90,72,90,32,26,32,32,26,32,24,19,24,24,19,24,24,19,24,18,14,18,18,14,18,16,13,16,16,13,16,16,13,16,8,6,8,8,6,8,4,3,4,4,3,4,4,3,4,6,4,6,6,4,6,28,22,28,28,22,28,28,22,28,20,16,20,20,16,20,8,6,8,8,6,8,8,6,8,8,6,8,8,6,8,3,3,3,3,3,3,35,28,35,35,28,35,35,28,35,194,155,194,194,155,194,196,156,196,195,156,195,195,156,195,255,255,255,255,255,255,255,255,255,255,199,225,255,255,255,255,255,255,255,255,255,222,170,204,255,203,227,255,255,255,255,255,255,255,255,255,255,248,188,255,248,188,255,250,189,255,250,189,255,250,189,255,245,185,255,244,184,255,236,178,255,236,178,255,236,178,255,244,183,255,243,183,255,243,183,255,243,183,255,237,182,236,169,186,255,176,186,197,192,187,235,211,187,255,255,187,255,255,186,255,253,186,255,255,186,255,255,186,255,255,185,255,255,185,255,255,185,255,255,184,255,255,184,255,233,184,226,205,184,255,255,183,255,236,183,255,255,183,255,255,182,255,255,182,255,242,182,255,255,182,255,255,181,255,255,181,255,255,181,255,255,179,255,255,178,255,255,178,255,255,160,255,255,159,255,255,159,255,255,159,255,255,159,187,133,79,79,79,79,5,5,5,5,5,5,5,5,5,42,42,42,42,42,42,7,7,7,7,7,7,7,7,7,26,26,26,26,26,26,51,51,51,51,51,51,26,26,26,26,26,26,26,26,26,35,35,35,35,35,35,49,49,49,48,48,48,48,48,48,31,31,31,31,31,31,48,48,48,48,48,48,48,48,48,89,89,89,89,89,89,77,77,77,77,77,77,77,77,77,8,8,8,8,8,8,6,6,6,6,6,6,6,6,6,27,27,27,27,27,27,22,22,22,22,22,22,64,64,64,64,64,64,64,64,64,21,21,21,21,21,21,62,62,62,61,61,61,61,61,61,40,40,40,40,40,40,21,21,21,21,21,21,21,21,21,72,72,72,72,72,72,26,26,26,26,26,26,26,26,26,19,19,19,19,19,19,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13,6,6,6,6,6,6,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,22,22,22,22,22,22,22,22,22,16,16,16,15,15,15,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,3,3,3,3,3,3,28,28,28,28,28,28,28,28,28,154,154,154,154,154,154,155,155,155,155,155,155,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,152,152,152,151,151,151,150,150,150,149,149,149,148,148,148,150,150,150,150,150,150,149,149,149,146,146,146,146,146,146,141,141,141,141,141,141,141,141,141,145,145,145,145,145,145,145,145,145,217,174,217,217,174,217,217,174,217,217,173,217,217,173,217,217,173,217,217,173,217,216,173,216,216,173,216,216,173,216,216,173,216,216,173,216,216,173,216,216,172,216,216,172,216,215,172,215,215,172,215,215,172,215,215,172,215,213,170,213,213,170,213,191,152,191,191,152,191,190,152,190,190,152,190,190,152,190,95,76,95,95,76,95,95,76,95,6,5,6,6,5,6,51,41,51,51,41,51,51,41,51,8,6,8,8,6,8,32,25,32,32,25,32,32,25,32,62,49,62,62,49,62,32,25,32,32,25,32,32,25,32,42,34,42,42,34,42,59,47,59,59,47,59,59,47,59,38,30,38,38,30,38,59,47,59,59,47,59,59,47,59,110,88,110,110,88,110,95,76,95,95,76,95,10,8,10,10,8,10,10,8,10,8,6,8,8,6,8,33,26,33,33,26,33,33,26,33,27,21,27,27,21,27,79,63,79,79,63,79,79,63,79,27,21,27,27,21,27,77,61,77,77,61,77,77,61,77,49,39,49,49,39,49,26,21,26,26,21,26,26,21,26,91,72,91,90,72,90,33,26,33,33,26,33,32,26,32,24,19,24,24,19,24,18,14,18,18,14,18,18,14,18,16,13,16,16,13,16,8,6,8,8,6,8,8,6,8,4,3,4,4,3,4,6,4,6,6,4,6,6,4,6,28,22,28,28,22,28,20,16,20,20,16,20,8,6,8,8,6,8,8,6,8,8,6,8,8,6,8,4,3,4,4,3,4,3,3,3,35,28,35,35,28,35,195,156,195,195,156,195,194,155,194,196,157,196,196,157,196,196,156,196,255,255,255,255,255,255,255,255,255,255,241,254,255,254,255,255,255,255,255,255,255,210,164,200,255,194,221,255,255,255,255,255,255,255,255,255,255,255,255,255,248,188,255,251,190,255,250,189,255,250,189,255,245,185,255,245,185,255,235,179,255,236,178,255,235,178,255,243,184,255,244,183,255,243,183,255,243,183,255,241,183,255,204,186,255,187,186,231,209,188,243,215,187,255,250,187,255,237,187,255,255,187,255,253,186,255,255,186,255,255,186,255,255,185,255,255,185,255,255,185,255,255,185,255,255,184,255,251,184,255,255,184,255,255,183,255,255,183,255,255,183,255,255,183,255,255,182,255,255,182,255,255,182,255,255,181,255,255,181,255,255,181,255,255,179,255,255,179,255,255,160,255,255,160,255,255,159,255,255,159,255,255,159,187,133,79,79,79,79,79,79,79,5,5,5,5,5,5,43,43,43,43,43,43,42,42,42,7,7,7,7,7,7,26,26,26,26,26,26,26,26,26,51,51,51,51,51,51,26,26,26,26,26,26,35,35,35,35,35,35,35,35,35,49,49,49,49,49,49,31,31,31,31,31,31,31,31,31,48,48,48,48,48,48,90,90,90,89,89,89,89,89,89,77,77,77,77,77,77,8,8,8,8,8,8,8,8,8,6,6,6,6,6,6,27,27,27,27,27,27,27,27,27,22,22,22,22,22,22,64,64,64,64,64,64,64,64,64,21,21,21,21,21,21,62,62,62,62,62,62,61,61,61,40,40,40,40,40,40,21,21,21,21,21,21,21,21,21,72,72,72,72,72,72,26,26,26,26,26,26,26,26,26,19,19,19,19,19,19,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13,6,6,6,6,6,6,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,22,22,22,22,22,22,22,22,22,16,16,16,16,16,16,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,3,3,3,3,3,3,3,3,3,28,28,28,28,28,28,154,154,154,154,154,154,154,154,154,155,155,155,155,155,155,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,151,151,151,151,151,151,150,150,150,149,149,149,148,148,148,150,150,150,150,150,150,146,146,146,146,146,146,146,146,146,141,141,141,141,141,141,145,145,145,145,145,145,218,174,218,217,174,217,217,174,217,217,174,217,217,174,217,217,173,217,217,173,217,217,173,217,217,173,217,217,173,217,216,173,216,216,173,216,214,171,214,214,171,214,214,171,214,214,171,214,213,171,213,213,171,213,213,170,213,213,170,213,176,141,176,176,141,176,130,104,130,130,104,130,130,104,130,88,71,88,88,71,88,6,5,6,6,5,6,6,5,6,23,19,23,23,19,23,15,12,15,15,12,15,15,12,15,49,39,49,49,39,49,30,24,30,30,24,30,30,24,30,25,20,25,25,20,25,45,36,45,45,36,45,44,35,44,134,107,134,134,107,134,91,73,91,91,73,91,91,73,91,83,66,83,83,66,83,161,129,161,161,129,161,161,129,161,131,105,131,131,105,131,10,8,10,10,8,10,10,8,10,16,13,16,16,13,16,18,15,18,18,15,18,18,15,18,21,16,21,21,16,21,60,48,60,60,48,60,60,48,60,16,13,16,16,13,16,35,28,35,35,28,35,35,28,35,27,21,27,27,21,27,47,38,47,47,38,47,47,38,47,60,48,60,60,48,60,14,11,14,14,11,14,14,11,14,26,21,26,26,21,26,53,42,53,53,42,53,53,42,53,78,62,78,77,62,77,73,59,73,73,58,73,73,58,73,98,78,98,97,78,97,42,34,42,42,34,42,42,34,42,26,21,26,26,21,26,24,19,24,24,19,24,24,19,24,10,8,10,10,8,10,22,17,22,22,17,22,22,17,22,12,9,12,12,9,12,8,6,8,8,6,8,7,6,7,173,138,173,173,138,173,197,157,197,196,157,196,196,157,196,196,157,196,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,242,251,210,162,195,255,255,255,255,255,255,255,255,255,255,255,255,255,241,183,255,246,186,255,246,186,255,245,186,255,245,185,255,245,185,255,238,181,255,239,181,255,220,167,255,219,167,255,220,167,255,244,184,255,244,183,255,250,189,255,243,189,226,166,188,211,199,188,216,202,188,255,244,187,250,219,187,255,255,187,255,247,187,255,255,186,255,255,186,255,255,186,255,255,186,255,255,185,255,255,185,255,255,185,255,255,184,255,255,184,255,255,184,255,255,184,255,255,183,255,255,183,255,255,183,255,252,181,255,255,180,255,255,180,255,255,180,255,255,180,255,255,179,255,255,179,255,242,148,255,240,147,255,245,147,255,182,109,252,180,109,170,122,74,74,74,74,74,74,74,5,5,5,5,5,5,19,19,19,19,19,19,19,19,19,12,12,12,12,12,12,12,12,12,41,41,41,40,40,40,24,24,24,24,24,24,21,21,21,21,21,21,21,21,21,37,37,37,36,36,36,36,36,36,110,110,110,110,110,110,75,75,75,75,75,75,67,67,67,67,67,67,67,67,67,131,131,131,131,131,131,131,131,131,107,107,107,106,106,106,8,8,8,8,8,8,13,13,13,13,13,13,13,13,13,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,49,49,49,49,49,49,48,48,48,13,13,13,13,13,13,28,28,28,28,28,28,28,28,28,21,21,21,21,21,21,38,38,38,38,38,38,38,38,38,48,48,48,48,48,48,11,11,11,11,11,11,11,11,11,21,21,21,21,21,21,42,42,42,42,42,42,42,42,42,62,62,62,62,62,62,58,58,58,58,58,58,58,58,58,77,77,77,77,77,77,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,19,19,19,19,19,19,19,19,19,7,7,7,7,7,7,17,17,17,17,17,17,17,17,17,9,9,9,9,9,9,6,6,6,6,6,6,6,6,6,137,137,137,136,136,136,155,155,155,155,155,155,155,155,155,154,154,154,154,154,154,152,152,152,152,152,152,152,152,152,150,150,150,150,150,150,147,147,147,147,147,147,146,146,146,143,143,143,143,143,143,144,144,144,144,144,144,144,144,144,147,147,147,147,147,147,146,146,146,146,146,146,146,146,146,143,143,143,143,143,143,216,172,216,218,174,218,218,174,218,218,174,218,217,174,217,217,174,217,217,174,217,217,174,217,217,173,217,217,173,217,217,173,217,217,173,217,216,173,216,216,173,216,216,173,216,216,173,216,214,171,214,214,171,214,213,171,213,207,165,207,207,165,207,200,160,200,200,160,200,200,160,200,84,67,84,84,67,84,21,17,21,21,17,21,21,17,21,13,10,13,12,10,12,36,29,36,36,29,36,36,29,36,36,29,36,36,29,36,56,44,56,56,44,56,56,44,56,17,13,17,17,13,17,19,15,19,19,15,19,19,15,19,79,63,79,79,63,79,92,73,92,92,73,92,91,73,91,94,75,94,93,75,93,185,148,185,185,148,185,185,148,185,200,160,200,199,159,199,199,159,199,121,96,121,120,96,120,23,18,23,23,18,23,23,18,23,12,10,12,12,10,12,14,11,14,14,11,14,14,11,14,18,15,18,18,15,18,39,31,39,39,31,39,39,31,39,64,51,64,64,51,64,127,102,127,127,101,127,127,101,127,139,111,139,139,111,139,137,109,137,137,109,137,137,109,137,149,119,149,149,119,149,169,135,169,169,135,169,169,135,169,152,122,152,152,122,152,127,102,127,127,102,127,127,101,127,102,82,102,102,82,102,96,77,96,96,76,96,96,76,96,145,116,145,144,115,144,118,94,118,118,94,118,117,94,117,26,21,26,26,21,26,26,21,26,8,6,8,8,6,8,14,11,14,14,11,14,14,11,14,14,11,14,14,11,14,4,3,4,4,3,4,4,3,4,160,128,160,159,127,159,195,156,195,195,156,195,195,156,195,196,157,196,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,233,245,255,255,255,255,255,255,255,255,255,255,255,255,255,244,185,255,246,187,255,246,186,255,253,192,255,253,192,255,253,191,255,248,187,255,247,187,255,233,177,255,232,177,255,233,177,255,247,186,255,246,186,255,251,189,255,250,189,255,191,189,211,200,188,224,206,188,213,201,188,255,243,188,255,254,187,255,255,187,255,255,187,255,255,187,255,255,184,255,255,184,255,255,186,255,255,185,255,255,185,255,255,185,255,255,185,255,255,184,255,255,184,255,255,184,255,255,183,255,255,183,255,255,183,255,255,183,255,255,182,255,255,182,255,255,182,255,255,180,255,255,179,255,255,179,255,255,173,255,255,173,255,255,167,255,255,167,255,255,167,167,119,70,70,70,70,18,18,18,18,18,18,18,18,18,10,10,10,10,10,10,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,46,46,46,46,46,46,46,46,46,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,65,65,65,64,64,64,64,64,64,75,75,75,75,75,75,76,76,76,76,76,76,76,76,76,151,151,151,150,150,150,162,162,162,162,162,162,162,162,162,98,98,98,98,98,98,18,18,18,18,18,18,18,18,18,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,15,15,15,15,15,15,32,32,32,32,32,32,32,32,32,52,52,52,52,52,52,102,102,102,102,102,102,102,102,102,111,111,111,111,111,111,109,109,109,109,109,109,109,109,109,119,119,119,119,119,119,135,135,135,135,135,135,135,135,135,121,121,121,121,121,121,121,121,121,101,101,101,101,101,101,81,81,81,81,81,81,81,81,81,76,76,76,76,76,76,115,115,115,114,114,114,114,114,114,93,93,93,93,93,93,20,20,20,20,20,20,20,20,20,6,6,6,6,6,6,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,3,3,3,3,3,3,3,126,126,126,126,126,126,154,154,154,154,154,154,153,153,153,155,155,155,154,154,154,154,154,154,154,154,154,154,154,154,151,151,151,150,150,150,147,147,147,147,147,147,147,147,147,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,147,147,147,147,147,147,147,147,147,151,151,151,151,151,151,148,148,148,218,174,218,218,174,218,218,174,218,218,174,218,218,174,218,218,174,218,217,174,217,217,174,217,217,174,217,217,174,217,217,173,217,217,173,217,217,173,217,217,173,217,216,173,216,214,171,214,214,171,214,207,166,207,207,166,207,207,166,207,200,160,200,200,160,200,85,68,85,84,67,84,84,67,84,21,17,21,21,17,21,13,10,13,13,10,13,13,10,13,36,29,36,36,29,36,36,29,36,36,29,36,36,29,36,56,44,56,56,44,56,56,44,56,17,13,17,17,13,17,19,15,19,19,15,19,19,15,19,79,63,79,79,63,79,92,73,92,92,73,92,92,73,92,94,75,94,94,75,94,186,148,186,185,148,185,185,148,185,200,160,200,200,160,200,200,160,200,121,97,121,121,96,121,23,18,23,23,18,23,23,18,23,12,10,12,12,10,12,14,11,14,14,11,14,14,11,14,18,15,18,18,15,18,40,32,40,39,31,39,39,31,39,65,52,65,65,52,65,127,102,127,127,102,127,127,102,127,140,112,140,139,111,139,139,111,139,137,110,137,137,109,137,149,119,149,149,119,149,149,119,149,170,136,170,169,135,169,153,122,153,153,122,153,152,122,152,127,102,127,127,102,127,102,82,102,102,82,102,102,82,102,96,77,96,96,77,96,145,116,145,145,116,145,145,116,145,118,94,118,118,94,118,26,21,26,26,21,26,26,21,26,8,6,8,8,6,8,8,6,8,14,11,14,14,11,14,14,11,14,14,11,14,14,11,14,4,3,4,4,3,4,160,128,160,160,128,160,160,128,160,195,156,195,195,156,195,197,157,197,197,157,197,255,255,255,255,255,255,255,255,255,255,255,255,255,230,245,255,255,255,255,255,255,255,238,249,246,182,210,255,255,255,255,255,255,255,255,255,255,255,255,255,244,185,255,246,187,255,246,187,255,253,192,255,252,192,255,251,192,255,247,188,255,247,187,255,232,177,255,233,177,255,234,177,255,247,186,255,247,186,255,252,190,255,251,189,255,239,189,255,224,189,255,233,189,209,198,188,255,222,188,255,255,188,255,255,187,255,255,187,255,255,187,255,255,185,255,255,184,255,255,186,255,255,186,255,255,186,255,255,185,255,255,185,255,255,185,255,255,184,255,255,184,255,255,184,255,255,184,255,255,183,255,255,183,255,255,183,255,255,182,255,255,182,255,255,182,255,255,180,255,255,180,255,255,174,255,255,173,255,255,173,255,255,167,255,255,167,167,119,70,70,70,70,70,70,70,18,18,18,18,18,18,10,10,10,10,10,10,10,10,10,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,46,46,46,46,46,46,46,46,46,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,65,65,65,65,65,65,75,75,75,75,75,75,75,75,75,76,76,76,76,76,76,151,151,151,151,151,151,151,151,151,162,162,162,162,162,162,98,98,98,98,98,98,98,98,98,18,18,18,18,18,18,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,15,15,15,15,15,15,32,32,32,32,32,32,32,32,32,52,52,52,52,52,52,102,102,102,102,102,102,102,102,102,112,112,112,111,111,111,110,110,110,109,109,109,109,109,109,119,119,119,119,119,119,135,135,135,135,135,135,135,135,135,121,121,121,121,121,121,121,121,121,101,101,101,101,101,101,81,81,81,81,81,81,81,81,81,76,76,76,76,76,76,115,115,115,115,115,115,114,114,114,93,93,93,93,93,93,20,20,20,20,20,20,20,20,20,6,6,6,6,6,6,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,3,3,3,3,126,126,126,126,126,126,126,126,126,154,154,154,154,154,154,155,155,155,155,155,155,154,154,154,154,154,154,154,154,154,151,151,151,151,151,151,150,150,150,147,147,147,147,147,147,147,147,147,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,147,147,147,147,147,147,151,151,151,151,151,151,218,175,218,218,175,218,218,174,218,218,174,218,218,174,218,218,174,218,218,174,218,218,174,218,211,169,211,211,168,211,211,168,211,215,172,215,215,172,215,217,173,217,217,173,217,217,173,217,214,171,214,214,171,214,181,145,181,181,145,181,181,145,181,85,68,85,85,68,85,85,68,85,17,13,17,17,13,17,23,19,23,23,19,23,23,19,23,30,24,30,30,24,30,30,24,30,30,24,30,30,24,30,28,22,28,28,22,28,28,22,28,10,8,10,10,8,10,43,34,43,43,34,43,43,34,43,133,106,133,133,106,133,180,144,180,180,144,180,180,144,180,197,157,197,197,157,197,212,169,212,211,169,211,211,169,211,207,165,207,207,165,207,207,165,207,206,165,206,206,165,206,191,153,191,191,153,191,191,153,191,165,132,165,165,132,165,131,105,131,131,105,131,131,104,131,133,106,133,133,106,133,162,130,162,162,129,162,162,129,162,197,158,197,197,158,197,197,158,197,205,164,205,205,164,205,205,164,205,205,164,205,205,164,205,204,163,204,204,163,204,206,165,206,206,165,206,206,164,206,203,163,203,203,162,203,203,162,203,203,162,203,203,162,203,196,157,196,196,157,196,196,156,196,127,102,127,127,102,127,135,108,135,135,108,135,135,108,135,170,136,170,170,136,170,102,81,102,102,81,102,102,81,102,67,53,67,67,53,67,67,53,67,12,9,12,12,9,12,6,4,6,6,4,6,6,4,6,4,3,4,4,3,4,8,6,8,8,6,8,8,6,8,164,131,164,164,131,164,198,158,198,198,158,198,198,158,198,197,158,197,197,158,197,197,157,197,255,255,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,214,236,227,173,205,255,255,255,255,255,255,255,255,255,255,255,255,255,247,188,255,247,187,255,247,187,255,244,187,255,245,187,255,243,186,255,244,186,255,246,186,255,244,186,255,245,185,255,245,185,255,247,187,255,247,186,255,251,190,255,250,190,255,247,190,255,226,189,224,207,189,249,219,189,249,219,188,255,254,188,255,255,188,255,255,188,255,255,187,255,255,183,255,255,183,255,255,187,255,255,186,255,255,186,255,255,186,255,255,185,255,255,185,255,255,185,255,255,185,247,216,184,255,242,184,255,255,184,255,245,178,255,255,178,255,255,181,255,255,181,255,255,180,255,255,182,255,255,182,255,255,180,255,255,179,255,255,179,255,253,151,255,253,151,255,255,151,71,71,71,70,70,70,14,14,14,14,14,14,14,14,14,19,19,19,19,19,19,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,23,23,23,23,23,23,23,23,23,8,8,8,8,8,8,8,8,8,35,35,35,35,35,35,109,109,109,109,109,109,109,109,109,147,147,147,147,147,147,161,161,161,160,160,160,160,160,160,172,172,172,172,172,172,168,168,168,168,168,168,168,168,168,167,167,167,167,167,167,167,167,167,154,154,154,154,154,154,133,133,133,133,133,133,133,133,133,105,105,105,105,105,105,107,107,107,107,107,107,106,106,106,130,130,130,130,130,130,130,130,130,158,158,158,158,158,158,164,164,164,164,164,164,164,164,164,164,164,164,163,163,163,163,163,163,163,163,163,163,163,163,164,164,164,164,164,164,162,162,162,162,162,162,161,161,161,161,161,161,161,161,161,161,161,161,155,155,155,155,155,155,101,101,101,101,101,101,101,101,101,107,107,107,107,107,107,134,134,134,134,134,134,134,134,134,80,80,80,80,80,80,53,53,53,53,53,53,53,53,53,9,9,9,9,9,9,9,9,9,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,6,6,6,6,6,6,129,129,129,129,129,129,129,129,129,156,156,156,155,155,155,155,155,155,155,155,155,155,155,155,153,153,153,153,153,153,152,152,152,154,154,154,154,154,154,153,153,153,153,153,153,153,153,153,150,150,150,149,149,149,148,148,148,148,148,148,147,147,147,147,147,147,147,147,147,147,147,147,219,175,219,219,175,219,218,175,218,218,175,218,218,174,218,218,174,218,218,174,218,218,174,218,218,174,218,218,174,218,217,174,217,217,174,217,217,174,217,217,174,217,217,173,217,217,173,217,217,173,217,160,128,160,159,127,159,159,127,159,74,59,74,74,59,74,17,13,17,17,13,17,17,13,17,24,19,24,23,19,23,23,19,23,6,5,6,6,5,6,32,26,32,32,26,32,32,26,32,23,19,23,23,19,23,19,15,19,19,15,19,19,15,19,19,15,19,19,15,19,19,15,19,144,115,144,144,115,144,202,162,202,202,161,202,202,161,202,208,166,208,208,166,208,208,166,208,208,166,208,207,166,207,209,167,209,209,167,209,209,167,209,211,169,211,211,169,211,209,167,209,208,167,208,208,167,208,210,168,210,210,168,210,208,166,208,208,166,208,207,166,207,207,166,207,207,166,207,207,165,207,207,165,207,207,165,207,208,167,208,208,167,208,208,166,208,206,165,206,206,164,206,208,166,208,207,166,207,207,166,207,207,165,207,207,165,207,207,165,207,206,165,206,206,165,206,206,165,206,206,165,206,206,164,206,203,163,203,203,162,203,203,162,203,203,162,203,202,162,202,200,160,200,200,160,200,200,160,200,144,115,144,144,115,144,94,75,94,94,75,94,94,75,94,114,91,114,114,91,114,153,122,153,153,122,153,153,122,153,36,29,36,36,29,36,36,29,36,8,6,8,8,6,8,20,16,20,20,16,20,20,16,20,38,30,38,38,30,38,38,30,38,187,149,187,187,149,187,194,155,194,194,155,194,194,155,194,194,155,194,193,155,193,195,156,195,255,255,255,255,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,255,255,209,228,255,255,255,255,255,255,255,255,255,255,255,255,255,245,186,255,244,186,255,244,186,255,240,183,255,241,183,255,240,183,255,244,186,255,246,186,255,251,190,255,251,190,255,250,189,255,248,187,255,247,187,255,249,189,255,244,188,255,216,188,233,211,190,232,211,189,207,198,189,212,200,189,255,254,189,255,255,188,255,255,188,255,255,188,255,255,187,255,255,187,255,255,187,255,255,187,255,255,186,255,255,186,255,255,186,255,255,186,255,255,185,255,235,185,200,192,185,255,255,184,255,238,184,255,247,184,255,243,184,255,255,183,255,255,183,255,255,183,255,255,182,255,255,182,255,255,182,255,255,182,255,255,181,255,224,133,255,223,133,255,223,133,62,62,62,61,61,61,14,14,14,14,14,14,14,14,14,19,19,19,19,19,19,19,19,19,5,5,5,5,5,5,26,26,26,26,26,26,26,26,26,19,19,19,19,19,19,19,19,19,16,16,16,16,16,16,15,15,15,15,15,15,15,15,15,118,118,118,118,118,118,165,165,165,165,165,165,165,165,165,170,170,170,169,169,169,169,169,169,169,169,169,168,168,168,170,170,170,170,170,170,169,169,169,171,171,171,171,171,171,169,169,169,168,168,168,168,168,168,170,170,170,169,169,169,169,169,169,167,167,167,167,167,167,167,167,167,166,166,166,166,166,166,166,166,166,165,165,165,167,167,167,167,167,167,166,166,166,164,164,164,164,164,164,164,164,164,165,165,165,165,165,165,165,165,165,165,165,165,164,164,164,164,164,164,164,164,164,164,164,164,163,163,163,163,163,163,161,161,161,161,161,161,161,161,161,161,161,161,160,160,160,158,158,158,158,158,158,158,158,158,114,114,114,113,113,113,74,74,74,74,74,74,74,74,74,90,90,90,90,90,90,90,90,90,120,120,120,120,120,120,28,28,28,28,28,28,28,28,28,6,6,6,6,6,6,15,15,15,15,15,15,15,15,15,30,30,30,30,30,30,30,30,30,147,147,147,146,146,146,153,153,153,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,153,153,153,153,153,153,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,145,145,145,145,145,145,145,145,145,138,138,138,138,138,138,138,138,138,146,146,146,219,175,219,219,175,219,219,175,219,219,175,219,218,175,218,218,175,218,218,174,218,218,174,218,218,174,218,218,174,218,218,174,218,218,174,218,217,174,217,217,174,217,217,174,217,217,174,217,160,128,160,160,128,160,74,59,74,74,59,74,74,59,74,17,14,17,17,14,17,17,14,17,24,19,24,24,19,24,6,5,6,6,5,6,6,5,6,32,26,32,32,26,32,32,26,32,23,19,23,23,19,23,19,15,19,19,15,19,19,15,19,19,15,19,19,15,19,145,116,145,144,115,144,144,115,144,203,162,203,202,162,202,202,162,202,209,167,209,208,167,208,208,167,208,208,166,208,208,166,208,210,168,210,210,168,210,210,168,210,212,169,212,211,169,211,209,167,209,209,167,209,209,167,209,211,168,211,211,168,211,210,168,210,208,166,208,208,166,208,208,166,208,208,166,208,207,166,207,207,166,207,207,166,207,209,167,209,209,167,209,209,167,209,206,165,206,206,165,206,206,165,206,208,166,208,208,166,208,207,166,207,207,166,207,207,166,207,207,165,207,207,165,207,206,165,206,206,165,206,206,165,206,204,163,204,204,163,204,203,163,203,203,162,203,203,162,203,201,160,201,200,160,200,200,160,200,144,115,144,144,115,144,144,115,144,94,75,94,94,75,94,115,92,115,115,92,115,114,91,114,153,123,153,153,122,153,153,122,153,36,29,36,36,29,36,8,6,8,8,6,8,8,6,8,20,16,20,20,16,20,20,16,20,38,30,38,38,30,38,187,150,187,187,150,187,187,149,187,195,156,195,195,156,195,194,155,194,194,155,194,194,155,194,196,156,196,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,225,239,255,255,255,255,255,255,255,255,255,255,255,255,255,245,186,255,245,186,255,244,186,255,241,184,255,242,183,255,247,187,255,244,187,255,245,187,255,251,190,255,251,190,255,251,190,255,248,188,255,248,187,255,250,189,255,217,189,213,161,188,208,199,190,200,195,190,205,197,190,222,206,189,255,255,189,255,255,189,255,255,188,255,255,188,255,255,188,255,255,188,255,255,187,255,255,187,255,255,187,255,255,187,255,255,186,255,255,186,255,224,186,251,218,185,238,212,185,255,232,185,255,231,185,255,250,184,255,219,184,255,255,184,255,255,183,255,255,183,255,255,183,255,255,183,255,255,182,255,255,182,255,255,182,255,255,182,255,224,134,255,225,133,146,104,62,62,62,62,62,62,62,14,14,14,14,14,14,19,19,19,19,19,19,19,19,19,5,5,5,5,5,5,5,5,5,26,26,26,26,26,26,19,19,19,19,19,19,19,19,19,16,16,16,16,16,16,16,16,16,15,15,15,15,15,15,118,118,118,118,118,118,118,118,118,165,165,165,165,165,165,165,165,165,170,170,170,169,169,169,169,169,169,169,169,169,169,169,169,170,170,170,170,170,170,171,171,171,171,171,171,171,171,171,169,169,169,169,169,169,168,168,168,170,170,170,169,169,169,167,167,167,167,167,167,167,167,167,167,167,167,166,166,166,166,166,166,166,166,166,166,166,166,167,167,167,167,167,167,167,167,167,165,165,165,164,164,164,166,166,166,166,166,166,165,165,165,165,165,165,165,165,165,165,165,165,164,164,164,164,164,164,164,164,164,164,164,164,163,163,163,161,161,161,161,161,161,161,161,161,161,161,161,160,160,160,159,159,159,158,158,158,158,158,158,114,114,114,114,114,114,113,113,113,74,74,74,74,74,74,90,90,90,90,90,90,90,90,90,121,121,121,120,120,120,28,28,28,28,28,28,28,28,28,6,6,6,6,6,6,6,6,6,15,15,15,15,15,15,30,30,30,30,30,30,30,30,30,147,147,147,147,147,147,146,146,146,153,153,153,152,152,152,152,152,152,152,152,152,152,152,152,153,153,153,153,153,153,153,153,153,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,145,145,145,145,145,145,139,139,139,138,138,138,138,138,138] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/test.T b/testsuite/tests/hpc/raytrace/test.T new file mode 100644 index 0000000000000000000000000000000000000000..28d80ae92d8047534e71c0b48050c472242d3e06 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/test.T @@ -0,0 +1,20 @@ +setTestOpts([ + omit_ghci, # really slow + when(fast(), skip) +]) + +hpc_prefix = "perl hpcrun.pl --clear --exeext={exeext} --hpc={hpc}" + +# TODO. It is unclear what the purpose of this test is. It produces lots of +# output, but the expected output file is missing. I (thomie) added +# the ignore_stdout setup function, just to make the test pass for the +# moment. +# Note that the subdirectory tixs also has a test.T file, and those tests +# depend on some of the files in this directory. +# Also note that testsuite/tests/programs/galois_raytrace has a similar (but +# not the same) copy of this program. +test('hpc_raytrace', + [extra_files(['../hpcrun.pl', 'CSG.hs', 'Construct.hs', 'Data.hs', 'Eval.hs', 'Geometry.hs', 'Illumination.hs', 'Intersections.hs', 'Interval.hs', 'Main.hs', 'Misc.hs', 'Parse.hs', 'Primitives.hs', 'Surface.hs', 'galois.gml', 'galois.sample']), + cmd_prefix(hpc_prefix), ignore_stdout], + multimod_compile_and_run, ['Main','-fhpc -package parsec']) + diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/CSG.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/CSG.mix new file mode 100644 index 0000000000000000000000000000000000000000..8dc1d3d569806598e113c5fab7598751901f7c31 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/CSG.mix @@ -0,0 +1 @@ +Mix "./CSG.hs" 2011-06-30 14:14:25 UTC 1441175296 8 [] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Construct.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Construct.mix new file mode 100644 index 0000000000000000000000000000000000000000..6a06e4bd11a50099d5292174e2d29160adc0afbb --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Construct.mix @@ -0,0 +1 @@ +Mix "./Construct.hs" 2011-06-30 14:14:25 UTC 2039014732 8 [(258:23-258:24,ExpBox False),(258:26-258:27,ExpBox False),(258:29-258:30,ExpBox False),(258:17-258:30,ExpBox False),(259:23-259:24,ExpBox False),(259:26-259:27,ExpBox False),(259:29-259:30,ExpBox False),(259:17-259:30,ExpBox False),(260:23-260:24,ExpBox False),(260:26-260:27,ExpBox False),(260:29-260:30,ExpBox False),(260:17-260:30,ExpBox False),(261:23-261:24,ExpBox False),(261:26-261:27,ExpBox False),(261:29-261:30,ExpBox False),(261:17-261:30,ExpBox False),(262:23-262:24,ExpBox False),(262:26-262:27,ExpBox False),(262:29-262:30,ExpBox False),(262:17-262:30,ExpBox False),(263:23-263:24,ExpBox False),(263:26-263:27,ExpBox False),(263:29-263:30,ExpBox False),(263:17-263:30,ExpBox False),(264:23-264:24,ExpBox False),(264:26-264:27,ExpBox False),(264:29-264:30,ExpBox False),(264:17-264:30,ExpBox False),(265:23-265:24,ExpBox False),(265:26-265:27,ExpBox False),(265:29-265:30,ExpBox False),(265:17-265:30,ExpBox False),(258:16-265:31,ExpBox False),(258:9-265:31,LocalBox ["transformBox","pts"]),(257:28-257:28,ExpBox False),(257:20-257:29,ExpBox False),(257:31-257:33,ExpBox False),(257:16-257:33,ExpBox False),(257:9-257:33,LocalBox ["transformBox","pts'"]),(251:16-251:18,ExpBox False),(251:25-251:30,ExpBox False),(251:32-251:35,ExpBox False),(251:20-251:36,ExpBox False),(251:8-251:37,ExpBox False),(252:16-252:18,ExpBox False),(252:25-252:30,ExpBox False),(252:32-252:35,ExpBox False),(252:20-252:36,ExpBox False),(252:8-252:37,ExpBox False),(253:16-253:18,ExpBox False),(253:25-253:30,ExpBox False),(253:32-253:35,ExpBox False),(253:20-253:36,ExpBox False),(253:8-253:37,ExpBox False),(254:16-254:18,ExpBox False),(254:25-254:30,ExpBox False),(254:32-254:35,ExpBox False),(254:20-254:36,ExpBox False),(254:8-254:37,ExpBox False),(255:16-255:18,ExpBox False),(255:25-255:30,ExpBox False),(255:32-255:35,ExpBox False),(255:20-255:36,ExpBox False),(255:8-255:37,ExpBox False),(256:16-256:18,ExpBox False),(256:25-256:30,ExpBox False),(256:32-256:35,ExpBox False),(256:20-256:36,ExpBox False),(256:8-256:37,ExpBox False),(251:5-256:38,ExpBox False),(250:1-265:31,TopLevelBox ["transformBox"]),(246:8-246:10,ExpBox False),(246:18-246:20,ExpBox False),(246:7-246:21,ExpBox False),(246:24-246:26,ExpBox False),(246:34-246:36,ExpBox False),(246:23-246:37,ExpBox False),(247:8-247:10,ExpBox False),(247:18-247:20,ExpBox False),(247:7-247:21,ExpBox False),(247:24-247:26,ExpBox False),(247:34-247:36,ExpBox False),(247:23-247:37,ExpBox False),(248:8-248:10,ExpBox False),(248:18-248:20,ExpBox False),(248:7-248:21,ExpBox False),(248:24-248:26,ExpBox False),(248:34-248:36,ExpBox False),(248:23-248:37,ExpBox False),(246:5-248:37,ExpBox False),(245:1-248:37,TopLevelBox ["mergeBox"]),(205:16-205:16,ExpBox False),(205:12-205:16,ExpBox False),(205:24-205:24,ExpBox False),(205:20-205:24,ExpBox False),(205:19-205:24,ExpBox False),(205:32-205:32,ExpBox False),(205:35-205:35,ExpBox False),(205:9-205:37,ExpBox False),(206:16-206:16,ExpBox False),(206:12-206:16,ExpBox False),(206:24-206:24,ExpBox False),(206:20-206:24,ExpBox False),(206:32-206:32,ExpBox False),(206:35-206:35,ExpBox False),(206:9-206:37,ExpBox False),(207:16-207:16,ExpBox False),(207:24-207:24,ExpBox False),(207:32-207:32,ExpBox False),(207:35-207:35,ExpBox False),(207:9-207:37,ExpBox False),(208:16-208:16,ExpBox False),(208:24-208:24,ExpBox False),(208:32-208:32,ExpBox False),(208:35-208:35,ExpBox False),(208:9-208:37,ExpBox False),(205:7-208:39,ExpBox False),(204:7-208:39,ExpBox False),(210:16-210:16,ExpBox False),(210:12-210:16,ExpBox False),(210:24-210:24,ExpBox False),(210:20-210:24,ExpBox False),(210:32-210:32,ExpBox False),(210:35-210:35,ExpBox False),(210:9-210:37,ExpBox False),(211:16-211:16,ExpBox False),(211:12-211:16,ExpBox False),(211:11-211:16,ExpBox False),(211:24-211:24,ExpBox False),(211:20-211:24,ExpBox False),(211:32-211:32,ExpBox False),(211:35-211:35,ExpBox False),(211:9-211:37,ExpBox False),(212:16-212:16,ExpBox False),(212:24-212:24,ExpBox False),(212:32-212:32,ExpBox False),(212:35-212:35,ExpBox False),(212:9-212:37,ExpBox False),(213:16-213:16,ExpBox False),(213:24-213:24,ExpBox False),(213:32-213:32,ExpBox False),(213:35-213:35,ExpBox False),(213:9-213:37,ExpBox False),(210:7-213:39,ExpBox False),(209:7-213:39,ExpBox False),(204:5-213:41,ExpBox False),(203:1-213:41,TopLevelBox ["rotzM"]),(239:26-239:26,ExpBox False),(239:20-239:26,ExpBox False),(238:13-238:14,ExpBox False),(238:16-238:19,ExpBox False),(238:6-238:19,ExpBox False),(238:29-238:32,ExpBox False),(238:34-238:35,ExpBox False),(238:22-238:35,ExpBox False),(238:5-238:36,ExpBox False),(237:1-239:26,TopLevelBox ["rotateEyeZ"]),(193:16-193:16,ExpBox False),(193:12-193:16,ExpBox False),(193:24-193:24,ExpBox False),(193:32-193:32,ExpBox False),(193:28-193:32,ExpBox False),(193:35-193:35,ExpBox False),(193:9-193:37,ExpBox False),(194:16-194:16,ExpBox False),(194:24-194:24,ExpBox False),(194:32-194:32,ExpBox False),(194:35-194:35,ExpBox False),(194:9-194:37,ExpBox False),(195:16-195:16,ExpBox False),(195:12-195:16,ExpBox False),(195:11-195:16,ExpBox False),(195:24-195:24,ExpBox False),(195:32-195:32,ExpBox False),(195:28-195:32,ExpBox False),(195:35-195:35,ExpBox False),(195:9-195:37,ExpBox False),(196:16-196:16,ExpBox False),(196:24-196:24,ExpBox False),(196:32-196:32,ExpBox False),(196:35-196:35,ExpBox False),(196:9-196:37,ExpBox False),(193:7-196:39,ExpBox False),(192:7-196:39,ExpBox False),(198:16-198:16,ExpBox False),(198:12-198:16,ExpBox False),(198:24-198:24,ExpBox False),(198:32-198:32,ExpBox False),(198:28-198:32,ExpBox False),(198:27-198:32,ExpBox False),(198:35-198:35,ExpBox False),(198:9-198:37,ExpBox False),(199:16-199:16,ExpBox False),(199:24-199:24,ExpBox False),(199:32-199:32,ExpBox False),(199:35-199:35,ExpBox False),(199:9-199:37,ExpBox False),(200:16-200:16,ExpBox False),(200:12-200:16,ExpBox False),(200:24-200:24,ExpBox False),(200:32-200:32,ExpBox False),(200:28-200:32,ExpBox False),(200:35-200:35,ExpBox False),(200:9-200:37,ExpBox False),(201:16-201:16,ExpBox False),(201:24-201:24,ExpBox False),(201:32-201:32,ExpBox False),(201:35-201:35,ExpBox False),(201:9-201:37,ExpBox False),(198:7-201:39,ExpBox False),(197:7-201:39,ExpBox False),(192:5-201:41,ExpBox False),(191:1-201:41,TopLevelBox ["rotyM"]),(236:26-236:26,ExpBox False),(236:20-236:26,ExpBox False),(235:13-235:14,ExpBox False),(235:16-235:19,ExpBox False),(235:6-235:19,ExpBox False),(235:29-235:32,ExpBox False),(235:34-235:35,ExpBox False),(235:22-235:35,ExpBox False),(235:5-235:36,ExpBox False),(234:1-236:26,TopLevelBox ["rotateEyeY"]),(181:16-181:16,ExpBox False),(181:24-181:24,ExpBox False),(181:32-181:32,ExpBox False),(181:35-181:35,ExpBox False),(181:9-181:37,ExpBox False),(182:16-182:16,ExpBox False),(182:24-182:24,ExpBox False),(182:20-182:24,ExpBox False),(182:32-182:32,ExpBox False),(182:28-182:32,ExpBox False),(182:27-182:32,ExpBox False),(182:35-182:35,ExpBox False),(182:9-182:37,ExpBox False),(183:16-183:16,ExpBox False),(183:24-183:24,ExpBox False),(183:20-183:24,ExpBox False),(183:32-183:32,ExpBox False),(183:28-183:32,ExpBox False),(183:35-183:35,ExpBox False),(183:9-183:37,ExpBox False),(184:16-184:16,ExpBox False),(184:24-184:24,ExpBox False),(184:32-184:32,ExpBox False),(184:35-184:35,ExpBox False),(184:9-184:37,ExpBox False),(181:7-184:39,ExpBox False),(180:7-184:39,ExpBox False),(186:16-186:16,ExpBox False),(186:24-186:24,ExpBox False),(186:32-186:32,ExpBox False),(186:35-186:35,ExpBox False),(186:9-186:37,ExpBox False),(187:16-187:16,ExpBox False),(187:24-187:24,ExpBox False),(187:20-187:24,ExpBox False),(187:32-187:32,ExpBox False),(187:28-187:32,ExpBox False),(187:35-187:35,ExpBox False),(187:9-187:37,ExpBox False),(188:16-188:16,ExpBox False),(188:24-188:24,ExpBox False),(188:20-188:24,ExpBox False),(188:19-188:24,ExpBox False),(188:32-188:32,ExpBox False),(188:28-188:32,ExpBox False),(188:35-188:35,ExpBox False),(188:9-188:37,ExpBox False),(189:16-189:16,ExpBox False),(189:24-189:24,ExpBox False),(189:32-189:32,ExpBox False),(189:35-189:35,ExpBox False),(189:9-189:37,ExpBox False),(186:7-189:39,ExpBox False),(185:7-189:39,ExpBox False),(180:5-189:41,ExpBox False),(179:1-189:41,TopLevelBox ["rotxM"]),(233:26-233:26,ExpBox False),(233:20-233:26,ExpBox False),(232:13-232:14,ExpBox False),(232:16-232:19,ExpBox False),(232:6-232:19,ExpBox False),(232:29-232:32,ExpBox False),(232:34-232:35,ExpBox False),(232:22-232:35,ExpBox False),(232:5-232:36,ExpBox False),(231:1-233:26,TopLevelBox ["rotateEyeX"]),(177:22-177:22,ExpBox False),(177:14-177:22,ExpBox False),(177:9-177:22,LocalBox ["scaleM","z'"]),(176:22-176:22,ExpBox False),(176:14-176:22,ExpBox False),(176:9-176:22,LocalBox ["scaleM","y'"]),(175:22-175:22,ExpBox False),(175:14-175:22,ExpBox False),(175:9-175:22,LocalBox ["scaleM","x'"]),(166:13-166:14,ExpBox False),(166:20-166:20,ExpBox False),(166:26-166:26,ExpBox False),(166:29-166:29,ExpBox False),(166:9-166:31,ExpBox False),(167:14-167:14,ExpBox False),(167:19-167:20,ExpBox False),(167:26-167:26,ExpBox False),(167:29-167:29,ExpBox False),(167:9-167:31,ExpBox False),(168:14-168:14,ExpBox False),(168:20-168:20,ExpBox False),(168:25-168:26,ExpBox False),(168:29-168:29,ExpBox False),(168:9-168:31,ExpBox False),(169:14-169:14,ExpBox False),(169:20-169:20,ExpBox False),(169:26-169:26,ExpBox False),(169:29-169:29,ExpBox False),(169:9-169:31,ExpBox False),(166:7-169:33,ExpBox False),(165:7-169:33,ExpBox False),(171:11-171:11,ExpBox False),(171:13-171:14,ExpBox False),(171:11-171:14,ExpBox False),(171:20-171:20,ExpBox False),(171:26-171:26,ExpBox False),(171:29-171:29,ExpBox False),(171:9-171:31,ExpBox False),(172:14-172:14,ExpBox False),(172:17-172:17,ExpBox False),(172:19-172:20,ExpBox False),(172:17-172:20,ExpBox False),(172:26-172:26,ExpBox False),(172:29-172:29,ExpBox False),(172:9-172:31,ExpBox False),(173:14-173:14,ExpBox False),(173:20-173:20,ExpBox False),(173:23-173:23,ExpBox False),(173:25-173:26,ExpBox False),(173:23-173:26,ExpBox False),(173:29-173:29,ExpBox False),(173:9-173:31,ExpBox False),(174:14-174:14,ExpBox False),(174:20-174:20,ExpBox False),(174:26-174:26,ExpBox False),(174:29-174:29,ExpBox False),(174:9-174:31,ExpBox False),(171:7-174:33,ExpBox False),(170:7-174:33,ExpBox False),(165:5-174:35,ExpBox False),(164:1-177:22,TopLevelBox ["scaleM"]),(154:11-154:11,ExpBox False),(154:14-154:14,ExpBox False),(154:17-154:17,ExpBox False),(154:20-154:20,ExpBox False),(154:9-154:22,ExpBox False),(155:11-155:11,ExpBox False),(155:14-155:14,ExpBox False),(155:17-155:17,ExpBox False),(155:20-155:20,ExpBox False),(155:9-155:22,ExpBox False),(156:11-156:11,ExpBox False),(156:14-156:14,ExpBox False),(156:17-156:17,ExpBox False),(156:20-156:20,ExpBox False),(156:9-156:22,ExpBox False),(157:11-157:11,ExpBox False),(157:14-157:14,ExpBox False),(157:17-157:17,ExpBox False),(157:20-157:20,ExpBox False),(157:9-157:22,ExpBox False),(154:7-157:24,ExpBox False),(153:7-157:24,ExpBox False),(159:11-159:11,ExpBox False),(159:14-159:14,ExpBox False),(159:17-159:17,ExpBox False),(159:21-159:21,ExpBox False),(159:20-159:21,ExpBox False),(159:9-159:23,ExpBox False),(160:11-160:11,ExpBox False),(160:14-160:14,ExpBox False),(160:17-160:17,ExpBox False),(160:21-160:21,ExpBox False),(160:20-160:21,ExpBox False),(160:9-160:23,ExpBox False),(161:11-161:11,ExpBox False),(161:14-161:14,ExpBox False),(161:17-161:17,ExpBox False),(161:21-161:21,ExpBox False),(161:20-161:21,ExpBox False),(161:9-161:23,ExpBox False),(162:11-162:11,ExpBox False),(162:14-162:14,ExpBox False),(162:17-162:17,ExpBox False),(162:21-162:21,ExpBox False),(162:9-162:23,ExpBox False),(159:7-162:25,ExpBox False),(158:7-162:25,ExpBox False),(153:5-162:27,ExpBox False),(152:1-162:27,TopLevelBox ["transM"]),(230:27-230:29,ExpBox False),(230:20-230:29,ExpBox False),(229:13-229:14,ExpBox False),(229:16-229:19,ExpBox False),(229:6-229:19,ExpBox False),(229:29-229:32,ExpBox False),(229:34-229:35,ExpBox False),(229:22-229:35,ExpBox False),(229:5-229:36,ExpBox False),(228:1-230:29,TopLevelBox ["translateEye"]),(147:11-147:13,ExpBox False),(147:16-147:18,ExpBox False),(147:21-147:23,ExpBox False),(147:26-147:28,ExpBox False),(147:9-147:30,ExpBox False),(148:11-148:13,ExpBox False),(148:16-148:18,ExpBox False),(148:21-148:23,ExpBox False),(148:26-148:28,ExpBox False),(148:9-148:30,ExpBox False),(149:11-149:13,ExpBox False),(149:16-149:18,ExpBox False),(149:21-149:23,ExpBox False),(149:26-149:28,ExpBox False),(149:9-149:30,ExpBox False),(150:11-150:13,ExpBox False),(150:16-150:18,ExpBox False),(150:21-150:23,ExpBox False),(150:26-150:28,ExpBox False),(150:9-150:30,ExpBox False),(147:7-150:32,ExpBox False),(146:8-150:32,ExpBox False),(146:1-150:32,TopLevelBox ["unit"]),(227:8-227:11,ExpBox False),(227:14-227:17,ExpBox False),(227:7-227:18,ExpBox False),(227:1-227:18,TopLevelBox ["eye"]),(116:63-116:63,ExpBox False),(116:65-116:66,ExpBox False),(116:55-116:67,ExpBox False),(116:83-116:85,ExpBox False),(116:87-116:88,ExpBox False),(116:75-116:89,ExpBox False),(116:91-116:91,ExpBox False),(116:44-116:91,ExpBox True),(117:66-117:68,ExpBox False),(117:70-117:70,ExpBox False),(117:55-117:71,ExpBox False),(117:86-117:88,ExpBox False),(117:90-117:90,ExpBox False),(117:75-117:91,ExpBox False),(117:44-117:91,ExpBox True),(118:66-118:68,ExpBox False),(118:70-118:70,ExpBox False),(118:55-118:71,ExpBox False),(118:86-118:88,ExpBox False),(118:90-118:90,ExpBox False),(118:75-118:91,ExpBox False),(118:44-118:91,ExpBox True),(119:66-119:68,ExpBox False),(119:70-119:70,ExpBox False),(119:55-119:71,ExpBox False),(119:86-119:88,ExpBox False),(119:90-119:90,ExpBox False),(119:75-119:91,ExpBox False),(119:44-119:91,ExpBox True),(120:69-120:69,ExpBox False),(120:71-120:73,ExpBox False),(120:55-120:74,ExpBox False),(120:87-120:89,ExpBox False),(120:91-120:91,ExpBox False),(120:76-120:92,ExpBox False),(120:44-120:92,ExpBox True),(121:55-121:55,ExpBox False),(121:57-121:58,ExpBox False),(121:60-121:63,ExpBox False),(121:44-121:63,ExpBox True),(116:1-121:63,TopLevelBox ["transform"]),(126:17-126:25,ExpBox False),(126:36-126:38,ExpBox False),(126:29-126:38,ExpBox False),(126:17-126:38,ExpBox False),(126:1-126:38,TopLevelBox ["translate"]),(127:27-127:27,ExpBox False),(127:30-127:30,ExpBox False),(127:33-127:33,ExpBox False),(127:26-127:34,ExpBox False),(127:16-127:34,ExpBox False),(127:1-127:34,TopLevelBox ["translateX"]),(128:27-128:27,ExpBox False),(128:30-128:30,ExpBox False),(128:33-128:33,ExpBox False),(128:26-128:34,ExpBox False),(128:16-128:34,ExpBox False),(128:1-128:34,TopLevelBox ["translateY"]),(129:27-129:27,ExpBox False),(129:30-129:30,ExpBox False),(129:33-129:33,ExpBox False),(129:26-129:34,ExpBox False),(129:16-129:34,ExpBox False),(129:1-129:34,TopLevelBox ["translateZ"]),(134:13-134:21,ExpBox False),(134:32-134:34,ExpBox False),(134:25-134:34,ExpBox False),(134:13-134:34,ExpBox False),(134:1-134:34,TopLevelBox ["scale"]),(135:19-135:19,ExpBox False),(135:22-135:22,ExpBox False),(135:25-135:25,ExpBox False),(135:18-135:26,ExpBox False),(135:12-135:26,ExpBox False),(135:1-135:26,TopLevelBox ["scaleX"]),(136:19-136:19,ExpBox False),(136:22-136:22,ExpBox False),(136:25-136:25,ExpBox False),(136:18-136:26,ExpBox False),(136:12-136:26,ExpBox False),(136:1-136:26,TopLevelBox ["scaleY"]),(137:19-137:19,ExpBox False),(137:22-137:22,ExpBox False),(137:25-137:25,ExpBox False),(137:18-137:26,ExpBox False),(137:12-137:26,ExpBox False),(137:1-137:26,TopLevelBox ["scaleZ"]),(138:19-138:19,ExpBox False),(138:21-138:21,ExpBox False),(138:23-138:23,ExpBox False),(138:18-138:24,ExpBox False),(138:12-138:24,ExpBox False),(138:1-138:24,TopLevelBox ["uscale"]),(142:13-142:21,ExpBox False),(142:31-142:31,ExpBox False),(142:25-142:31,ExpBox False),(142:13-142:31,ExpBox False),(142:1-142:31,TopLevelBox ["rotateX"]),(143:13-143:21,ExpBox False),(143:31-143:31,ExpBox False),(143:25-143:31,ExpBox False),(143:13-143:31,ExpBox False),(143:1-143:31,TopLevelBox ["rotateY"]),(144:13-144:21,ExpBox False),(144:31-144:31,ExpBox False),(144:25-144:31,ExpBox False),(144:13-144:31,ExpBox False),(144:1-144:31,TopLevelBox ["rotateZ"]),(90:9-90:13,ExpBox False),(90:1-90:13,TopLevelBox ["plane"]),(86:17-86:17,ExpBox False),(86:19-86:19,ExpBox False),(86:13-86:19,ExpBox False),(86:1-86:19,TopLevelBox ["mkBox"]),(92:16-92:16,ExpBox False),(92:15-92:16,ExpBox False),(92:20-92:26,ExpBox False),(92:14-92:27,ExpBox False),(92:30-92:30,ExpBox False),(92:34-92:40,ExpBox False),(92:29-92:41,ExpBox False),(93:16-93:16,ExpBox False),(93:15-93:16,ExpBox False),(93:20-93:26,ExpBox False),(93:14-93:27,ExpBox False),(93:30-93:30,ExpBox False),(93:34-93:40,ExpBox False),(93:29-93:41,ExpBox False),(94:16-94:16,ExpBox False),(94:15-94:16,ExpBox False),(94:20-94:26,ExpBox False),(94:14-94:27,ExpBox False),(94:30-94:30,ExpBox False),(94:34-94:40,ExpBox False),(94:29-94:41,ExpBox False),(92:11-94:42,ExpBox False),(94:52-94:52,ExpBox False),(94:44-94:53,ExpBox False),(92:5-94:53,ExpBox False),(91:1-94:53,TopLevelBox ["sphere"]),(96:16-96:16,ExpBox False),(96:15-96:16,ExpBox False),(96:20-96:26,ExpBox False),(96:14-96:27,ExpBox False),(96:30-96:30,ExpBox False),(96:34-96:40,ExpBox False),(96:29-96:41,ExpBox False),(97:20-97:26,ExpBox False),(97:14-97:27,ExpBox False),(97:30-97:30,ExpBox False),(97:34-97:40,ExpBox False),(97:29-97:41,ExpBox False),(98:16-98:16,ExpBox False),(98:15-98:16,ExpBox False),(98:20-98:26,ExpBox False),(98:14-98:27,ExpBox False),(98:30-98:30,ExpBox False),(98:34-98:40,ExpBox False),(98:29-98:41,ExpBox False),(96:11-98:42,ExpBox False),(98:50-98:50,ExpBox False),(98:44-98:51,ExpBox False),(96:5-98:51,ExpBox False),(95:1-98:51,TopLevelBox ["cone"]),(100:17-100:23,ExpBox False),(100:14-100:24,ExpBox False),(100:27-100:27,ExpBox False),(100:31-100:37,ExpBox False),(100:26-100:38,ExpBox False),(101:17-101:23,ExpBox False),(101:14-101:24,ExpBox False),(101:27-101:27,ExpBox False),(101:31-101:37,ExpBox False),(101:26-101:38,ExpBox False),(102:17-102:23,ExpBox False),(102:14-102:24,ExpBox False),(102:27-102:27,ExpBox False),(102:31-102:37,ExpBox False),(102:26-102:38,ExpBox False),(100:11-102:39,ExpBox False),(102:47-102:47,ExpBox False),(102:41-102:48,ExpBox False),(100:5-102:48,ExpBox False),(99:1-102:48,TopLevelBox ["cube"]),(104:16-104:16,ExpBox False),(104:15-104:16,ExpBox False),(104:20-104:26,ExpBox False),(104:14-104:27,ExpBox False),(104:30-104:30,ExpBox False),(104:34-104:40,ExpBox False),(104:29-104:41,ExpBox False),(105:20-105:26,ExpBox False),(105:14-105:27,ExpBox False),(105:30-105:30,ExpBox False),(105:34-105:40,ExpBox False),(105:29-105:41,ExpBox False),(106:16-106:16,ExpBox False),(106:15-106:16,ExpBox False),(106:20-106:26,ExpBox False),(106:14-106:27,ExpBox False),(106:30-106:30,ExpBox False),(106:34-106:40,ExpBox False),(106:29-106:41,ExpBox False),(104:11-106:42,ExpBox False),(106:54-106:54,ExpBox False),(106:44-106:55,ExpBox False),(104:5-106:55,ExpBox False),(103:1-106:55,TopLevelBox ["cylinder"]),(81:31-81:32,ExpBox False),(81:46-81:46,ExpBox False),(81:48-81:48,ExpBox False),(81:34-81:49,ExpBox False),(81:27-81:49,ExpBox True),(84:29-84:29,ExpBox False),(84:31-84:31,ExpBox False),(84:18-84:31,ExpBox True),(81:1-84:31,TopLevelBox ["difference"]),(78:53-78:54,ExpBox False),(78:56-78:57,ExpBox False),(78:43-78:58,ExpBox False),(78:71-78:71,ExpBox False),(78:73-78:73,ExpBox False),(78:60-78:74,ExpBox False),(78:39-78:74,ExpBox True),(79:27-79:27,ExpBox False),(79:29-79:29,ExpBox False),(79:17-79:29,ExpBox True),(78:1-79:29,TopLevelBox ["intersect"]),(74:49-74:50,ExpBox False),(74:52-74:53,ExpBox False),(74:39-74:54,ExpBox False),(74:63-74:63,ExpBox False),(74:65-74:65,ExpBox False),(74:56-74:66,ExpBox False),(74:35-74:66,ExpBox True),(75:19-75:19,ExpBox False),(75:21-75:21,ExpBox False),(75:13-75:21,ExpBox True),(74:1-75:21,TopLevelBox ["union"]),(35:12-35:15,TopLevelBox ["showsPrec"]),(35:12-35:15,TopLevelBox ["showList"]),(51:12-51:15,TopLevelBox ["showsPrec"]),(51:12-51:15,TopLevelBox ["showList"]),(64:13-64:16,TopLevelBox ["showsPrec"]),(64:13-64:16,TopLevelBox ["showList"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Data.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Data.mix new file mode 100644 index 0000000000000000000000000000000000000000..9a22f57339da43b887325a32d8da3e40f8a1a7b2 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Data.mix @@ -0,0 +1 @@ +Mix "./Data.hs" 2011-09-06 12:02:04 UTC 2953926806 8 [(407:46-407:46,ExpBox False),(407:49-407:49,ExpBox False),(407:53-407:53,ExpBox False),(407:48-407:54,ExpBox False),(407:56-407:56,ExpBox False),(407:44-407:56,ExpBox False),(407:33-407:57,ExpBox False),(407:27-407:58,ExpBox False),(407:20-407:58,ExpBox True),(408:20-408:20,ExpBox False),(408:13-408:20,ExpBox True),(407:1-408:20,TopLevelBox ["sphere'"]),(398:46-398:47,ExpBox False),(398:49-398:50,ExpBox False),(398:52-398:54,ExpBox False),(398:65-398:70,ExpBox False),(398:56-398:71,ExpBox False),(398:73-398:75,ExpBox False),(398:36-398:75,ExpBox False),(398:1-398:75,TopLevelBox ["mySpotlight"]),(394:13-394:13,ExpBox False),(394:17-394:17,ExpBox False),(394:13-394:17,ExpBox False),(394:13-394:17,BinBox GuardBinBox True),(394:13-394:17,BinBox GuardBinBox False),(394:31-394:72,ExpBox False),(394:25-394:72,ExpBox True),(395:13-395:21,ExpBox False),(395:13-395:21,BinBox GuardBinBox True),(395:13-395:21,BinBox GuardBinBox False),(395:30-395:30,ExpBox False),(395:25-395:30,ExpBox True),(394:1-395:30,TopLevelBox ["ourSqrt"]),(390:20-390:55,ExpBox False),(390:14-390:55,ExpBox True),(391:14-391:14,ExpBox False),(391:22-391:22,ExpBox False),(391:14-391:22,ExpBox True),(390:1-391:22,TopLevelBox ["ourRem"]),(386:21-386:56,ExpBox False),(386:15-386:56,ExpBox True),(387:15-387:15,ExpBox False),(387:24-387:24,ExpBox False),(387:15-387:24,ExpBox True),(386:1-387:24,TopLevelBox ["ourQuot"]),(379:22-379:24,ExpBox False),(379:14-379:25,ExpBox False),(379:27-379:27,ExpBox False),(379:6-379:27,ExpBox False),(379:6-379:27,BinBox GuardBinBox True),(379:6-379:27,BinBox GuardBinBox False),(379:31-379:33,ExpBox False),(379:37-379:37,ExpBox False),(379:31-379:37,ExpBox True),(380:6-380:14,ExpBox False),(380:6-380:14,BinBox GuardBinBox True),(380:6-380:14,BinBox GuardBinBox False),(380:25-380:57,ExpBox False),(381:30-381:30,ExpBox False),(381:25-381:30,ExpBox False),(382:25-382:52,ExpBox False),(383:43-383:45,ExpBox False),(383:35-383:46,ExpBox False),(383:30-383:47,ExpBox False),(383:25-383:47,ExpBox False),(383:52-383:54,ExpBox False),(383:25-383:54,ExpBox False),(382:25-383:54,ExpBox False),(381:25-383:54,ExpBox False),(380:24-383:55,ExpBox False),(380:18-383:55,ExpBox True),(378:1-383:55,TopLevelBox ["ixGet"]),(374:22-374:22,ExpBox False),(374:26-374:30,ExpBox False),(374:39-374:39,ExpBox False),(374:34-374:39,ExpBox False),(374:44-374:47,ExpBox False),(374:34-374:47,ExpBox False),(374:26-374:47,ExpBox False),(374:21-374:48,ExpBox False),(374:50-374:50,ExpBox False),(374:15-374:50,ExpBox False),(374:1-374:50,TopLevelBox ["mytrace"]),(342:38-342:42,ExpBox False),(342:37-342:43,ExpBox True),(343:38-343:43,ExpBox False),(343:37-343:44,ExpBox True),(344:38-344:44,ExpBox False),(344:37-344:45,ExpBox True),(345:38-345:43,ExpBox False),(345:37-345:44,ExpBox True),(346:38-346:43,ExpBox False),(346:37-346:44,ExpBox True),(347:38-347:42,ExpBox False),(347:37-347:43,ExpBox True),(348:38-348:44,ExpBox False),(348:37-348:45,ExpBox True),(349:38-349:42,ExpBox False),(349:44-349:48,ExpBox False),(349:37-349:49,ExpBox True),(350:38-350:42,ExpBox False),(350:44-350:48,ExpBox False),(350:37-350:49,ExpBox True),(351:38-351:43,ExpBox False),(351:45-351:50,ExpBox False),(351:37-351:51,ExpBox True),(352:38-352:43,ExpBox False),(352:45-352:50,ExpBox False),(352:37-352:51,ExpBox True),(353:38-353:44,ExpBox False),(353:46-353:50,ExpBox False),(353:37-353:51,ExpBox True),(354:45-354:52,ExpBox False),(354:54-354:61,ExpBox False),(354:44-354:62,ExpBox True),(355:45-355:51,ExpBox False),(355:53-355:59,ExpBox False),(355:44-355:60,ExpBox True),(356:45-356:50,ExpBox False),(356:52-356:57,ExpBox False),(356:59-356:64,ExpBox False),(356:44-356:65,ExpBox True),(357:45-357:52,ExpBox False),(357:54-357:59,ExpBox False),(357:44-357:60,ExpBox True),(358:45-358:52,ExpBox False),(358:54-358:59,ExpBox False),(358:61-358:66,ExpBox False),(358:68-358:73,ExpBox False),(358:44-358:74,ExpBox True),(359:45-359:51,ExpBox False),(359:53-359:60,ExpBox False),(359:44-359:61,ExpBox True),(361:45-361:51,ExpBox False),(361:53-361:59,ExpBox False),(361:61-361:67,ExpBox False),(361:69-361:74,ExpBox False),(361:76-361:81,ExpBox False),(361:44-361:82,ExpBox True),(362:45-362:51,ExpBox False),(363:45-363:51,ExpBox False),(364:45-364:52,ExpBox False),(365:45-365:49,ExpBox False),(366:45-366:50,ExpBox False),(367:45-367:50,ExpBox False),(368:45-368:50,ExpBox False),(369:45-369:52,ExpBox False),(362:44-369:53,ExpBox True),(342:1-369:53,TopLevelBox ["getPrimOpType"]),(323:7-323:12,ExpBox False),(323:17-323:22,ExpBox False),(323:5-323:23,ExpBox False),(324:7-324:11,ExpBox False),(324:17-324:21,ExpBox False),(324:5-324:22,ExpBox False),(325:7-325:12,ExpBox False),(325:17-325:22,ExpBox False),(325:5-325:23,ExpBox False),(326:7-326:14,ExpBox False),(326:17-326:24,ExpBox False),(326:5-326:25,ExpBox False),(327:7-327:12,ExpBox False),(327:17-327:22,ExpBox False),(327:5-327:23,ExpBox False),(328:7-328:13,ExpBox False),(328:17-328:23,ExpBox False),(328:5-328:24,ExpBox False),(329:7-329:13,ExpBox False),(329:17-329:23,ExpBox False),(329:5-329:24,ExpBox False),(330:7-330:14,ExpBox False),(330:17-330:24,ExpBox False),(330:5-330:25,ExpBox False),(331:7-331:13,ExpBox False),(331:17-331:23,ExpBox False),(331:5-331:24,ExpBox False),(332:7-332:13,ExpBox False),(332:17-332:28,ExpBox False),(332:5-332:29,ExpBox False),(333:7-333:14,ExpBox False),(333:17-333:23,ExpBox False),(333:5-333:24,ExpBox False),(323:3-334:3,ExpBox False),(322:1-334:3,TopLevelBox ["typeTable"]),(336:20-336:27,ExpBox False),(336:29-336:36,ExpBox False),(336:19-336:37,ExpBox False),(336:39-336:47,ExpBox False),(336:13-336:47,ExpBox False),(336:1-336:47,TopLevelBox ["typeNames"]),(213:5-213:11,ExpBox False),(213:19-213:24,ExpBox False),(213:47-213:70,ExpBox False),(213:41-213:70,ExpBox False),(213:4-213:71,ExpBox False),(214:5-214:8,ExpBox False),(214:19-214:21,ExpBox False),(214:47-214:67,ExpBox False),(214:41-214:67,ExpBox False),(214:4-214:68,ExpBox False),(215:5-215:11,ExpBox False),(215:25-215:29,ExpBox False),(215:19-215:29,ExpBox False),(215:47-215:70,ExpBox False),(215:41-215:70,ExpBox False),(215:4-215:71,ExpBox False),(216:5-216:10,ExpBox False),(216:25-216:28,ExpBox False),(216:19-216:28,ExpBox False),(216:47-216:69,ExpBox False),(216:41-216:69,ExpBox False),(216:4-216:70,ExpBox False),(213:2-217:2,ExpBox False),(217:26-217:26,ExpBox False),(217:32-217:32,ExpBox False),(217:28-217:32,ExpBox False),(217:34-217:34,ExpBox False),(217:25-217:35,ExpBox False),(217:11-217:36,ExpBox False),(220:5-220:10,ExpBox False),(220:19-220:25,ExpBox False),(220:45-220:51,ExpBox False),(220:55-220:58,ExpBox False),(220:44-220:59,ExpBox False),(220:34-220:59,ExpBox False),(220:4-220:60,ExpBox False),(221:5-221:10,ExpBox False),(221:19-221:25,ExpBox False),(221:46-221:48,ExpBox False),(221:34-221:48,ExpBox False),(221:4-221:49,ExpBox False),(222:5-222:10,ExpBox False),(222:19-222:25,ExpBox False),(222:49-222:51,ExpBox False),(222:34-222:51,ExpBox False),(222:4-222:52,ExpBox False),(223:5-223:10,ExpBox False),(223:19-223:25,ExpBox False),(223:45-223:51,ExpBox False),(223:55-223:58,ExpBox False),(223:44-223:59,ExpBox False),(223:34-223:59,ExpBox False),(223:4-223:60,ExpBox False),(224:5-224:12,ExpBox False),(224:19-224:27,ExpBox False),(224:44-224:49,ExpBox False),(224:34-224:49,ExpBox False),(224:4-224:50,ExpBox False),(225:5-225:10,ExpBox False),(225:19-225:25,ExpBox False),(225:46-225:49,ExpBox False),(225:34-225:49,ExpBox False),(225:4-225:50,ExpBox False),(226:5-226:9,ExpBox False),(226:19-226:24,ExpBox False),(226:45-226:47,ExpBox False),(226:51-226:57,ExpBox False),(226:44-226:58,ExpBox False),(226:34-226:58,ExpBox False),(226:4-226:59,ExpBox False),(227:5-227:10,ExpBox False),(227:19-227:25,ExpBox False),(227:46-227:49,ExpBox False),(227:34-227:49,ExpBox False),(227:4-227:50,ExpBox False),(228:5-228:14,ExpBox False),(228:19-228:29,ExpBox False),(228:46-228:53,ExpBox False),(228:34-228:53,ExpBox False),(228:4-228:54,ExpBox False),(229:5-229:16,ExpBox False),(229:19-229:31,ExpBox False),(229:46-229:55,ExpBox False),(229:34-229:55,ExpBox False),(229:4-229:56,ExpBox False),(230:5-230:10,ExpBox False),(230:19-230:25,ExpBox False),(230:46-230:54,ExpBox False),(230:34-230:54,ExpBox False),(230:4-230:55,ExpBox False),(231:5-231:10,ExpBox False),(231:19-231:25,ExpBox False),(231:49-231:51,ExpBox False),(231:34-231:51,ExpBox False),(231:4-231:52,ExpBox False),(232:5-232:9,ExpBox False),(232:19-232:24,ExpBox False),(232:47-232:50,ExpBox False),(232:34-232:50,ExpBox False),(232:4-232:51,ExpBox False),(233:5-233:9,ExpBox False),(233:19-233:24,ExpBox False),(233:49-233:52,ExpBox False),(233:34-233:52,ExpBox False),(233:4-233:53,ExpBox False),(234:5-234:11,ExpBox False),(234:19-234:26,ExpBox False),(234:43-234:47,ExpBox False),(234:34-234:47,ExpBox False),(234:4-234:48,ExpBox False),(235:5-235:10,ExpBox False),(235:19-235:25,ExpBox False),(235:45-235:47,ExpBox False),(235:51-235:64,ExpBox False),(235:44-235:65,ExpBox False),(235:34-235:65,ExpBox False),(235:4-235:66,ExpBox False),(236:5-236:9,ExpBox False),(236:19-236:24,ExpBox False),(236:48-236:52,ExpBox False),(236:34-236:52,ExpBox False),(236:4-236:53,ExpBox False),(237:5-237:10,ExpBox False),(237:19-237:25,ExpBox False),(237:57-237:57,ExpBox False),(237:45-237:58,ExpBox False),(237:34-237:58,ExpBox False),(237:4-237:59,ExpBox False),(238:5-238:10,ExpBox False),(238:19-238:25,ExpBox False),(238:57-238:57,ExpBox False),(238:45-238:58,ExpBox False),(238:34-238:58,ExpBox False),(238:4-238:59,ExpBox False),(239:5-239:10,ExpBox False),(239:19-239:25,ExpBox False),(239:57-239:57,ExpBox False),(239:45-239:58,ExpBox False),(239:34-239:58,ExpBox False),(239:4-239:59,ExpBox False),(240:5-240:15,ExpBox False),(240:19-240:30,ExpBox False),(240:46-240:54,ExpBox False),(240:34-240:54,ExpBox False),(240:4-240:55,ExpBox False),(241:5-241:12,ExpBox False),(241:19-241:27,ExpBox False),(241:43-241:46,ExpBox False),(241:50-241:52,ExpBox False),(241:56-241:61,ExpBox False),(241:50-241:61,ExpBox False),(241:42-241:62,ExpBox False),(241:34-241:62,ExpBox False),(241:4-241:63,ExpBox False),(242:5-242:11,ExpBox False),(242:19-242:26,ExpBox False),(242:47-242:49,ExpBox False),(242:34-242:49,ExpBox False),(242:4-242:50,ExpBox False),(243:5-243:11,ExpBox False),(243:19-243:26,ExpBox False),(243:49-243:51,ExpBox False),(243:34-243:51,ExpBox False),(243:4-243:52,ExpBox False),(244:5-244:11,ExpBox False),(244:19-244:26,ExpBox False),(244:52-244:56,ExpBox False),(244:34-244:56,ExpBox False),(244:4-244:57,ExpBox False),(245:5-245:10,ExpBox False),(245:19-245:25,ExpBox False),(245:46-245:53,ExpBox False),(245:34-245:53,ExpBox False),(245:4-245:54,ExpBox False),(246:5-246:10,ExpBox False),(246:19-246:25,ExpBox False),(246:46-246:48,ExpBox False),(246:34-246:48,ExpBox False),(246:4-246:49,ExpBox False),(247:5-247:10,ExpBox False),(247:19-247:25,ExpBox False),(247:49-247:51,ExpBox False),(247:34-247:51,ExpBox False),(247:4-247:52,ExpBox False),(248:5-248:10,ExpBox False),(248:19-248:25,ExpBox False),(248:42-248:47,ExpBox False),(248:34-248:47,ExpBox False),(248:4-248:48,ExpBox False),(249:5-249:10,ExpBox False),(249:19-249:25,ExpBox False),(249:44-249:49,ExpBox False),(249:34-249:49,ExpBox False),(249:4-249:50,ExpBox False),(250:5-250:11,ExpBox False),(250:19-250:26,ExpBox False),(250:46-250:50,ExpBox False),(250:34-250:50,ExpBox False),(250:4-250:51,ExpBox False),(251:5-251:11,ExpBox False),(251:19-251:26,ExpBox False),(251:55-251:60,ExpBox False),(251:34-251:60,ExpBox False),(251:4-251:61,ExpBox False),(252:5-252:16,ExpBox False),(252:19-252:31,ExpBox False),(252:52-252:61,ExpBox False),(252:34-252:61,ExpBox False),(252:4-252:62,ExpBox False),(253:5-253:10,ExpBox False),(253:19-253:25,ExpBox False),(253:43-253:54,ExpBox False),(253:34-253:54,ExpBox False),(253:4-253:55,ExpBox False),(254:5-254:12,ExpBox False),(254:19-254:27,ExpBox False),(254:34-254:39,ExpBox False),(254:50-254:52,ExpBox False),(254:43-254:52,ExpBox False),(254:34-254:52,ExpBox False),(254:4-254:53,ExpBox False),(255:5-255:13,ExpBox False),(255:19-255:28,ExpBox False),(255:74-255:74,ExpBox False),(255:65-255:75,ExpBox False),(255:77-255:77,ExpBox False),(255:57-255:77,ExpBox False),(255:47-255:78,ExpBox False),(255:34-255:78,ExpBox False),(255:4-255:79,ExpBox False),(256:5-256:13,ExpBox False),(256:19-256:28,ExpBox False),(256:74-256:74,ExpBox False),(256:65-256:75,ExpBox False),(256:77-256:77,ExpBox False),(256:57-256:77,ExpBox False),(256:47-256:78,ExpBox False),(256:34-256:78,ExpBox False),(256:4-256:79,ExpBox False),(257:5-257:13,ExpBox False),(257:19-257:28,ExpBox False),(257:74-257:74,ExpBox False),(257:65-257:75,ExpBox False),(257:77-257:77,ExpBox False),(257:57-257:77,ExpBox False),(257:47-257:78,ExpBox False),(257:34-257:78,ExpBox False),(257:4-257:79,ExpBox False),(258:5-258:11,ExpBox False),(258:19-258:26,ExpBox False),(258:78-258:78,ExpBox False),(258:80-258:80,ExpBox False),(258:82-258:82,ExpBox False),(258:77-258:83,ExpBox False),(258:85-258:85,ExpBox False),(258:71-258:85,ExpBox False),(258:57-258:86,ExpBox False),(258:34-258:86,ExpBox False),(258:4-258:87,ExpBox False),(259:5-259:9,ExpBox False),(259:19-259:24,ExpBox False),(259:45-259:47,ExpBox False),(259:51-259:57,ExpBox False),(259:44-259:58,ExpBox False),(259:34-259:58,ExpBox False),(259:4-259:59,ExpBox False),(260:5-260:12,ExpBox False),(260:19-260:27,ExpBox False),(260:46-260:52,ExpBox False),(260:34-260:52,ExpBox False),(260:4-260:53,ExpBox False),(261:5-261:15,ExpBox False),(261:19-261:30,ExpBox False),(261:68-261:78,ExpBox False),(261:34-261:78,ExpBox False),(261:4-261:79,ExpBox False),(262:5-262:10,ExpBox False),(262:19-262:25,ExpBox False),(262:44-262:50,ExpBox False),(262:34-262:50,ExpBox False),(262:4-262:51,ExpBox False),(263:5-263:10,ExpBox False),(263:19-263:25,ExpBox False),(263:46-263:48,ExpBox False),(263:34-263:48,ExpBox False),(263:4-263:49,ExpBox False),(264:5-264:10,ExpBox False),(264:19-264:25,ExpBox False),(264:49-264:51,ExpBox False),(264:34-264:51,ExpBox False),(264:4-264:52,ExpBox False),(265:5-265:11,ExpBox False),(265:19-265:26,ExpBox False),(265:53-265:59,ExpBox False),(265:34-265:59,ExpBox False),(265:4-265:60,ExpBox False),(266:5-266:15,ExpBox False),(266:19-266:30,ExpBox False),(266:82-266:82,ExpBox False),(266:84-266:84,ExpBox False),(266:86-266:86,ExpBox False),(266:81-266:87,ExpBox False),(266:89-266:89,ExpBox False),(266:71-266:89,ExpBox False),(266:57-266:90,ExpBox False),(266:34-266:90,ExpBox False),(266:4-266:91,ExpBox False),(267:5-267:11,ExpBox False),(267:19-267:26,ExpBox False),(267:46-267:50,ExpBox False),(267:34-267:50,ExpBox False),(267:4-267:51,ExpBox False),(268:5-268:12,ExpBox False),(268:19-268:27,ExpBox False),(268:64-268:64,ExpBox False),(268:66-268:66,ExpBox False),(268:57-268:66,ExpBox False),(268:47-268:67,ExpBox False),(268:34-268:67,ExpBox False),(268:4-268:68,ExpBox False),(220:2-269:2,ExpBox False),(217:7-269:2,ExpBox False),(213:2-269:2,ExpBox False),(212:1-269:2,TopLevelBox ["opcodes"]),(206:15-206:55,ExpBox False),(206:9-206:55,ExpBox False),(206:1-206:55,TopLevelBox ["image"]),(205:15-205:34,ExpBox False),(205:9-205:34,ExpBox False),(205:1-205:34,TopLevelBox ["undef"]),(202:22-202:29,ExpBox False),(202:31-202:38,ExpBox False),(202:21-202:39,ExpBox False),(203:52-203:58,ExpBox False),(203:22-203:23,ExpBox False),(203:25-203:28,ExpBox False),(203:21-203:29,ExpBox False),(203:19-203:60,ExpBox False),(202:15-203:60,ExpBox False),(202:1-203:60,TopLevelBox ["opNameTable"]),(199:38-199:44,ExpBox False),(199:14-199:16,ExpBox False),(199:18-199:19,ExpBox False),(199:13-199:20,ExpBox False),(199:11-199:46,ExpBox False),(199:1-199:46,TopLevelBox ["opTable"]),(195:33-195:39,ExpBox False),(195:14-195:16,ExpBox False),(195:12-195:41,ExpBox False),(195:1-195:41,TopLevelBox ["keyWords"]),(123:30-123:30,ExpBox False),(123:32-123:32,ExpBox False),(123:23-123:32,ExpBox False),(123:1-123:32,TopLevelBox ["lookupEnv"]),(120:31-120:31,ExpBox False),(120:34-120:34,ExpBox False),(120:30-120:35,ExpBox False),(120:37-120:37,ExpBox False),(120:29-120:38,ExpBox False),(120:25-120:38,ExpBox False),(120:1-120:38,TopLevelBox ["extendEnv"]),(117:16-117:17,ExpBox False),(117:12-117:17,ExpBox False),(117:1-117:17,TopLevelBox ["emptyEnv"]),(97:34-97:34,ExpBox False),(97:29-97:34,ExpBox False),(97:39-97:48,ExpBox False),(97:29-97:48,ExpBox True),(98:34-98:34,ExpBox False),(98:29-98:34,ExpBox False),(98:39-98:47,ExpBox False),(98:29-98:47,ExpBox True),(99:34-99:34,ExpBox False),(99:29-99:34,ExpBox False),(99:39-99:48,ExpBox False),(99:29-99:48,ExpBox True),(100:34-100:34,ExpBox False),(100:29-100:34,ExpBox False),(100:39-100:50,ExpBox False),(100:29-100:50,ExpBox True),(101:29-101:50,ExpBox True),(103:8-103:17,ExpBox False),(103:47-103:49,ExpBox False),(103:39-103:50,ExpBox False),(103:34-103:51,ExpBox False),(103:28-103:52,ExpBox False),(103:23-103:52,ExpBox False),(103:57-103:78,ExpBox False),(103:23-103:78,ExpBox False),(103:8-103:78,ExpBox True),(104:29-104:31,ExpBox False),(104:41-104:41,ExpBox False),(104:36-104:41,ExpBox False),(105:29-105:31,ExpBox False),(105:41-105:41,ExpBox False),(105:36-105:41,ExpBox False),(106:29-106:31,ExpBox False),(106:41-106:41,ExpBox False),(106:36-106:41,ExpBox False),(107:29-107:40,ExpBox False),(106:36-107:40,ExpBox False),(106:29-107:40,ExpBox False),(105:36-107:40,ExpBox False),(105:29-107:40,ExpBox False),(104:36-107:40,ExpBox False),(104:29-107:40,ExpBox True),(108:29-108:48,ExpBox True),(109:29-109:47,ExpBox True),(110:29-110:33,ExpBox False),(110:43-110:46,ExpBox False),(110:38-110:46,ExpBox False),(110:51-110:64,ExpBox False),(110:38-110:64,ExpBox False),(110:29-110:64,ExpBox True),(97:1-110:64,TopLevelBox ["showStkEle"]),(91:17-91:20,TopLevelBox ["showsPrec"]),(91:17-91:20,TopLevelBox ["showList"]),(180:15-180:16,TopLevelBox ["=="]),(180:15-180:16,TopLevelBox ["/="]),(180:18-180:20,TopLevelBox ["compare"]),(180:18-180:20,TopLevelBox ["<"]),(180:18-180:20,TopLevelBox [">="]),(180:18-180:20,TopLevelBox [">"]),(180:18-180:20,TopLevelBox ["<="]),(180:22-180:23,TopLevelBox ["range"]),(180:22-180:23,TopLevelBox ["unsafeIndex"]),(180:22-180:23,TopLevelBox ["inRange"]),(180:25-180:31,TopLevelBox ["minBound"]),(180:25-180:31,TopLevelBox ["maxBound"]),(114:47-114:50,TopLevelBox ["showsPrec"]),(114:47-114:50,TopLevelBox ["showList"]),(320:17-320:18,TopLevelBox ["=="]),(320:17-320:18,TopLevelBox ["/="]),(320:20-320:22,TopLevelBox ["compare"]),(320:20-320:22,TopLevelBox ["<"]),(320:20-320:22,TopLevelBox [">="]),(320:20-320:22,TopLevelBox [">"]),(320:20-320:22,TopLevelBox ["<="]),(320:24-320:25,TopLevelBox ["range"]),(320:24-320:25,TopLevelBox ["unsafeIndex"]),(320:24-320:25,TopLevelBox ["inRange"]),(320:27-320:33,TopLevelBox ["minBound"]),(320:27-320:33,TopLevelBox ["maxBound"]),(339:33-339:41,ExpBox False),(339:45-339:46,ExpBox False),(339:32-339:47,ExpBox False),(339:21-339:47,ExpBox False),(339:4-339:47,TopLevelBox ["showsPrec"]),(183:33-183:43,ExpBox False),(183:47-183:48,ExpBox False),(183:32-183:49,ExpBox False),(183:21-183:49,ExpBox False),(183:4-183:49,TopLevelBox ["showsPrec"]),(94:47-94:51,ExpBox False),(94:35-94:52,ExpBox False),(94:24-94:52,ExpBox False),(94:4-94:52,TopLevelBox ["showsPrec"]),(42:37-42:38,ExpBox False),(42:31-42:38,ExpBox True),(43:42-43:43,ExpBox False),(43:31-43:43,ExpBox True),(44:43-44:45,ExpBox False),(44:49-44:50,ExpBox False),(44:42-44:51,ExpBox False),(44:31-44:51,ExpBox True),(45:37-45:40,ExpBox False),(45:31-45:40,ExpBox True),(46:37-46:37,ExpBox False),(46:31-46:37,ExpBox True),(47:37-47:37,ExpBox False),(47:31-47:37,ExpBox True),(48:37-48:37,ExpBox False),(48:31-48:37,ExpBox True),(49:37-49:40,ExpBox False),(49:31-49:40,ExpBox True),(50:43-50:46,ExpBox False),(50:32-50:46,ExpBox False),(51:47-51:47,ExpBox False),(51:60-51:62,ExpBox False),(51:51-51:62,ExpBox False),(51:66-51:66,ExpBox False),(51:51-51:66,ExpBox False),(51:47-51:66,ExpBox False),(51:37-51:67,ExpBox False),(51:69-51:70,ExpBox False),(51:77-51:81,ExpBox False),(51:83-51:86,ExpBox False),(51:72-51:87,ExpBox False),(51:31-51:87,ExpBox False),(52:42-52:44,ExpBox False),(52:31-52:44,ExpBox False),(51:31-52:44,ExpBox False),(50:32-52:44,ExpBox True),(53:42-53:48,ExpBox False),(53:31-53:48,ExpBox True),(54:42-54:45,ExpBox False),(54:31-54:45,ExpBox True),(42:4-54:45,TopLevelBox ["showsPrec"]),(56:32-56:35,ExpBox False),(56:21-56:35,ExpBox False),(57:37-57:37,ExpBox False),(57:50-57:52,ExpBox False),(57:41-57:52,ExpBox False),(57:56-57:56,ExpBox False),(57:41-57:56,ExpBox False),(57:37-57:56,ExpBox False),(57:27-57:57,ExpBox False),(57:59-57:60,ExpBox False),(57:67-57:71,ExpBox False),(57:73-57:76,ExpBox False),(57:62-57:77,ExpBox False),(57:21-57:77,ExpBox False),(58:32-58:34,ExpBox False),(58:21-58:34,ExpBox False),(57:21-58:34,ExpBox False),(56:21-58:34,ExpBox False),(56:4-58:34,TopLevelBox ["showList"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Eval.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Eval.mix new file mode 100644 index 0000000000000000000000000000000000000000..29d2b383c830b3b9d175f3cf51fbc17fff010d23 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Eval.mix @@ -0,0 +1 @@ +Mix "./Eval.hs" 2011-09-06 12:02:04 UTC 1993219040 8 [(347:12-347:73,ExpBox False),(347:1-347:73,TopLevelBox ["abstest1"]),(328:8-328:69,ExpBox False),(328:1-328:69,TopLevelBox ["done"]),(305:34-305:35,ExpBox False),(305:37-305:38,ExpBox False),(305:40-305:41,ExpBox False),(305:26-305:42,ExpBox False),(305:46-305:48,ExpBox False),(305:25-305:49,ExpBox False),(305:18-305:49,ExpBox True),(308:23-308:49,ExpBox False),(308:59-308:60,ExpBox False),(308:54-308:60,ExpBox False),(308:65-308:67,ExpBox False),(308:54-308:67,ExpBox False),(308:22-308:68,ExpBox False),(308:18-308:68,ExpBox True),(304:1-308:68,TopLevelBox ["doAbsOp"]),(145:20-145:27,ExpBox False),(145:29-145:36,ExpBox False),(145:19-145:37,ExpBox False),(146:52-146:58,ExpBox False),(146:22-146:23,ExpBox False),(146:25-146:28,ExpBox False),(146:21-146:29,ExpBox False),(146:19-146:60,ExpBox False),(145:13-146:60,ExpBox False),(145:1-146:60,TopLevelBox ["opFnTable"]),(67:32-67:36,ExpBox True),(68:32-68:35,ExpBox True),(67:1-68:35,TopLevelBox ["moreCode"]),(77:15-77:16,ExpBox False),(77:35-77:35,ExpBox False),(77:28-77:36,ExpBox False),(77:38-77:42,ExpBox False),(77:28-77:42,ExpBox False),(77:55-77:56,ExpBox False),(77:14-77:59,ExpBox False),(77:7-77:59,ExpBox True),(79:15-79:16,ExpBox False),(79:34-79:34,ExpBox False),(79:28-79:35,ExpBox False),(79:37-79:41,ExpBox False),(79:28-79:41,ExpBox False),(79:55-79:56,ExpBox False),(79:14-79:59,ExpBox False),(79:7-79:59,ExpBox True),(81:15-81:16,ExpBox False),(81:35-81:35,ExpBox False),(81:28-81:36,ExpBox False),(81:38-81:42,ExpBox False),(81:28-81:42,ExpBox False),(81:55-81:56,ExpBox False),(81:14-81:59,ExpBox False),(81:7-81:59,ExpBox True),(83:15-83:16,ExpBox False),(83:37-83:37,ExpBox False),(83:28-83:38,ExpBox False),(83:40-83:44,ExpBox False),(83:28-83:44,ExpBox False),(83:55-83:56,ExpBox False),(83:14-83:59,ExpBox False),(83:7-83:59,ExpBox True),(87:35-87:37,ExpBox False),(87:39-87:40,ExpBox False),(87:42-87:42,ExpBox False),(87:25-87:42,ExpBox False),(87:53-87:57,ExpBox False),(87:68-87:69,ExpBox False),(87:10-87:72,ExpBox False),(87:3-87:72,ExpBox True),(89:7-89:49,ExpBox False),(89:3-89:49,ExpBox True),(93:19-93:21,ExpBox False),(93:23-93:24,ExpBox False),(93:8-93:25,ExpBox False),(94:21-94:22,ExpBox False),(94:34-94:34,ExpBox False),(94:36-94:40,ExpBox False),(94:34-94:40,ExpBox False),(94:51-94:52,ExpBox False),(94:20-94:55,ExpBox False),(94:13-94:55,ExpBox True),(95:19-95:54,ExpBox False),(95:59-95:60,ExpBox False),(95:18-95:61,ExpBox False),(95:14-95:61,ExpBox True),(93:3-95:61,ExpBox True),(99:11-99:12,ExpBox False),(99:34-99:36,ExpBox False),(99:38-99:41,ExpBox False),(99:24-99:42,ExpBox False),(99:44-99:48,ExpBox False),(99:24-99:48,ExpBox False),(99:58-99:59,ExpBox False),(99:10-99:62,ExpBox False),(99:3-99:62,ExpBox True),(103:34-103:37,ExpBox False),(103:48-103:52,ExpBox False),(103:62-103:66,ExpBox False),(103:20-103:68,ExpBox False),(103:15-103:68,ExpBox False),(104:16-104:17,ExpBox False),(104:29-104:31,ExpBox False),(104:41-104:42,ExpBox False),(104:15-104:45,ExpBox False),(104:8-104:45,ExpBox False),(103:3-105:6,ExpBox True),(107:7-107:39,ExpBox False),(107:3-107:39,ExpBox True),(109:7-109:36,ExpBox False),(109:3-109:36,ExpBox True),(113:34-113:36,ExpBox False),(113:47-113:48,ExpBox False),(113:58-113:62,ExpBox False),(113:20-113:64,ExpBox False),(113:15-113:64,ExpBox False),(114:26-114:28,ExpBox False),(114:19-114:28,ExpBox False),(114:30-114:30,ExpBox False),(114:19-114:30,ExpBox False),(114:12-114:30,LocalBox ["step","last"]),(115:25-115:25,ExpBox False),(115:27-115:30,ExpBox False),(115:24-115:31,ExpBox False),(115:39-115:42,ExpBox False),(115:44-115:47,ExpBox False),(115:49-115:49,ExpBox False),(115:44-115:49,ExpBox False),(115:38-115:52,ExpBox False),(115:54-115:56,ExpBox False),(115:33-115:57,ExpBox False),(115:18-115:57,ExpBox False),(115:12-115:57,LocalBox ["step","arr"]),(116:16-116:17,ExpBox False),(116:37-116:39,ExpBox False),(116:29-116:40,ExpBox False),(116:42-116:46,ExpBox False),(116:29-116:46,ExpBox False),(116:56-116:57,ExpBox False),(116:15-116:60,ExpBox False),(116:8-116:60,ExpBox False),(113:3-117:6,ExpBox True),(121:34-121:35,ExpBox False),(121:46-121:50,ExpBox False),(121:60-121:61,ExpBox False),(121:20-121:63,ExpBox False),(121:15-121:63,ExpBox False),(122:16-122:17,ExpBox False),(122:29-122:31,ExpBox False),(122:41-122:42,ExpBox False),(122:15-122:45,ExpBox False),(122:8-122:45,ExpBox False),(121:3-123:6,ExpBox True),(125:34-125:35,ExpBox False),(125:46-125:50,ExpBox False),(125:60-125:61,ExpBox False),(125:20-125:63,ExpBox False),(125:15-125:63,ExpBox False),(126:16-126:17,ExpBox False),(126:29-126:31,ExpBox False),(126:41-126:42,ExpBox False),(126:15-126:45,ExpBox False),(126:8-126:45,ExpBox False),(125:3-127:6,ExpBox True),(129:7-129:74,ExpBox False),(129:3-129:74,ExpBox True),(133:21-133:29,ExpBox False),(133:33-133:34,ExpBox False),(133:20-133:35,ExpBox False),(133:37-133:38,ExpBox False),(133:40-133:44,ExpBox False),(133:15-133:44,ExpBox False),(134:16-134:17,ExpBox False),(134:29-134:31,ExpBox False),(134:41-134:42,ExpBox False),(134:15-134:45,ExpBox False),(134:8-134:45,ExpBox False),(133:3-135:6,ExpBox True),(138:14-138:50,ExpBox False),(138:10-138:50,ExpBox True),(76:1-138:50,TopLevelBox ["step"]),(57:21-57:22,ExpBox False),(57:14-57:22,ExpBox False),(58:20-58:21,ExpBox False),(58:11-58:21,ExpBox False),(58:11-58:21,BinBox CondBinBox True),(58:11-58:21,BinBox CondBinBox False),(59:13-59:16,ExpBox False),(60:27-60:28,ExpBox False),(60:22-60:28,ExpBox False),(61:20-61:22,ExpBox False),(61:15-61:22,ExpBox False),(59:8-62:13,ExpBox True),(63:28-63:29,ExpBox False),(63:21-63:30,ExpBox False),(63:14-63:30,ExpBox True),(58:8-63:30,ExpBox False),(57:3-64:6,ExpBox False),(56:1-64:6,TopLevelBox ["eval"]),(281:31-281:33,ExpBox False),(281:35-281:37,ExpBox False),(281:39-281:42,ExpBox False),(281:24-281:43,ExpBox False),(281:18-281:44,ExpBox False),(281:46-281:48,ExpBox False),(281:11-281:48,ExpBox False),(282:31-282:33,ExpBox False),(282:26-282:33,ExpBox True),(283:26-283:32,ExpBox True),(281:6-283:32,ExpBox False),(280:1-283:32,TopLevelBox ["absapply"]),(314:41-314:48,ExpBox False),(314:50-314:51,ExpBox False),(314:53-314:56,ExpBox False),(314:34-314:57,ExpBox False),(314:29-314:57,ExpBox False),(315:29-315:30,ExpBox False),(315:22-315:30,ExpBox False),(314:17-316:20,ExpBox False),(314:1-316:20,TopLevelBox ["mainEval"]),(334:23-334:30,ExpBox False),(334:32-334:33,ExpBox False),(334:45-334:46,ExpBox False),(334:35-334:47,ExpBox False),(334:16-334:48,ExpBox False),(334:11-334:48,ExpBox False),(334:1-334:48,TopLevelBox ["test"]),(350:12-350:46,ExpBox False),(350:7-350:46,ExpBox False),(350:1-350:46,TopLevelBox ["et1"]),(337:33-337:34,ExpBox False),(337:23-337:34,ExpBox False),(338:27-338:34,ExpBox False),(338:36-338:37,ExpBox False),(338:39-338:42,ExpBox False),(338:20-338:43,ExpBox False),(338:15-338:43,ExpBox False),(337:12-338:43,ExpBox False),(337:1-338:43,TopLevelBox ["testF"]),(341:37-341:44,ExpBox False),(342:46-342:52,ExpBox False),(342:38-342:52,ExpBox False),(342:62-342:65,ExpBox False),(342:54-342:65,ExpBox False),(342:75-342:78,ExpBox False),(342:67-342:78,ExpBox False),(342:37-342:79,ExpBox False),(343:47-343:48,ExpBox False),(343:37-343:49,ExpBox False),(341:30-343:50,ExpBox False),(341:24-343:51,ExpBox False),(343:53-343:55,ExpBox False),(341:17-343:55,ExpBox False),(344:37-344:37,ExpBox False),(344:39-344:39,ExpBox False),(344:36-344:40,ExpBox False),(344:30-344:40,ExpBox True),(345:32-345:32,ExpBox False),(345:27-345:32,ExpBox True),(341:12-345:32,ExpBox False),(341:1-345:32,TopLevelBox ["testA"]),(49:34-49:36,ExpBox False),(49:47-49:49,ExpBox False),(49:59-49:62,ExpBox False),(49:19-49:64,ExpBox False),(49:14-49:64,ExpBox False),(50:26-50:28,ExpBox False),(49:9-50:28,ExpBox False),(48:1-50:28,TopLevelBox ["callback"]),(165:23-165:24,ExpBox False),(165:19-165:25,ExpBox False),(165:13-165:26,ExpBox False),(165:30-165:32,ExpBox False),(165:12-165:33,ExpBox False),(165:5-165:33,ExpBox True),(167:24-167:25,ExpBox False),(167:20-167:26,ExpBox False),(167:13-167:27,ExpBox False),(167:31-167:33,ExpBox False),(167:12-167:34,ExpBox False),(167:5-167:34,ExpBox True),(169:24-169:24,ExpBox False),(169:26-169:26,ExpBox False),(169:28-169:28,ExpBox False),(169:20-169:29,ExpBox False),(169:13-169:30,ExpBox False),(169:34-169:36,ExpBox False),(169:12-169:37,ExpBox False),(169:5-169:37,ExpBox True),(183:25-183:27,ExpBox False),(183:29-183:32,ExpBox False),(183:41-183:42,ExpBox False),(183:35-183:42,ExpBox False),(183:50-183:51,ExpBox False),(183:44-183:51,ExpBox False),(183:58-183:58,ExpBox False),(183:53-183:58,ExpBox False),(183:34-183:59,ExpBox False),(183:16-183:59,ExpBox False),(185:33-185:34,ExpBox False),(185:36-185:37,ExpBox False),(185:39-185:40,ExpBox False),(185:26-185:41,ExpBox False),(185:43-185:44,ExpBox False),(185:46-185:47,ExpBox False),(185:49-185:50,ExpBox False),(185:21-185:50,ExpBox True),(186:28-186:80,ExpBox False),(187:34-187:36,ExpBox False),(187:29-187:36,ExpBox False),(186:27-187:37,ExpBox False),(186:21-187:37,ExpBox True),(183:11-187:37,ExpBox False),(182:9-187:37,LocalBox ["doPrimOp","call"]),(173:19-173:21,ExpBox False),(173:23-173:26,ExpBox False),(173:37-173:43,ExpBox False),(173:29-173:43,ExpBox False),(173:53-173:56,ExpBox False),(173:45-173:56,ExpBox False),(173:66-173:69,ExpBox False),(173:58-173:69,ExpBox False),(173:28-173:70,ExpBox False),(173:10-173:70,ExpBox False),(176:34-176:35,ExpBox False),(176:37-176:38,ExpBox False),(176:40-176:41,ExpBox False),(176:27-176:42,ExpBox False),(176:44-176:45,ExpBox False),(176:47-176:48,ExpBox False),(176:50-176:51,ExpBox False),(176:22-176:51,ExpBox False),(176:16-176:51,LocalBox ["doPrimOp","res"]),(178:45-178:47,ExpBox False),(178:37-178:48,ExpBox False),(178:33-178:49,ExpBox False),(178:24-178:50,ExpBox False),(178:54-178:56,ExpBox False),(178:23-178:57,ExpBox False),(175:12-178:57,ExpBox True),(179:39-179:42,ExpBox False),(179:33-179:43,ExpBox False),(179:29-179:44,ExpBox False),(179:20-179:45,ExpBox False),(179:49-179:51,ExpBox False),(179:19-179:52,ExpBox False),(179:12-179:52,ExpBox True),(173:5-179:52,ExpBox True),(190:23-190:24,ExpBox False),(190:19-190:25,ExpBox False),(190:13-190:26,ExpBox False),(190:30-190:32,ExpBox False),(190:12-190:33,ExpBox False),(190:5-190:33,ExpBox True),(192:24-192:25,ExpBox False),(192:20-192:26,ExpBox False),(192:13-192:27,ExpBox False),(192:31-192:33,ExpBox False),(192:12-192:34,ExpBox False),(192:5-192:34,ExpBox True),(194:23-194:25,ExpBox False),(194:19-194:26,ExpBox False),(194:13-194:27,ExpBox False),(194:31-194:33,ExpBox False),(194:12-194:34,ExpBox False),(194:5-194:34,ExpBox True),(199:23-199:24,ExpBox False),(199:26-199:27,ExpBox False),(199:19-199:28,ExpBox False),(199:13-199:29,ExpBox False),(199:33-199:35,ExpBox False),(199:12-199:36,ExpBox False),(199:5-199:36,ExpBox True),(201:24-201:25,ExpBox False),(201:27-201:28,ExpBox False),(201:20-201:29,ExpBox False),(201:13-201:30,ExpBox False),(201:34-201:36,ExpBox False),(201:12-201:37,ExpBox False),(201:5-201:37,ExpBox True),(203:24-203:25,ExpBox False),(203:27-203:28,ExpBox False),(203:20-203:29,ExpBox False),(203:13-203:30,ExpBox False),(203:34-203:36,ExpBox False),(203:12-203:37,ExpBox False),(203:5-203:37,ExpBox True),(205:24-205:25,ExpBox False),(205:27-205:28,ExpBox False),(205:20-205:29,ExpBox False),(205:13-205:30,ExpBox False),(205:34-205:36,ExpBox False),(205:12-205:37,ExpBox False),(205:5-205:37,ExpBox True),(207:17-207:19,ExpBox False),(207:21-207:21,ExpBox False),(207:13-207:22,ExpBox False),(207:26-207:28,ExpBox False),(207:12-207:29,ExpBox False),(207:5-207:29,ExpBox True),(213:26-213:27,ExpBox False),(213:29-213:30,ExpBox False),(213:22-213:31,ExpBox False),(213:13-213:32,ExpBox False),(213:36-213:38,ExpBox False),(213:12-213:39,ExpBox False),(213:5-213:39,ExpBox True),(215:25-215:25,ExpBox False),(215:27-215:27,ExpBox False),(215:29-215:29,ExpBox False),(215:24-215:30,ExpBox False),(215:39-215:39,ExpBox False),(215:41-215:41,ExpBox False),(215:43-215:43,ExpBox False),(215:32-215:44,ExpBox False),(215:20-215:45,ExpBox False),(215:13-215:45,ExpBox False),(215:49-215:51,ExpBox False),(215:12-215:52,ExpBox False),(215:5-215:52,ExpBox True),(218:25-218:26,ExpBox False),(218:28-218:29,ExpBox False),(218:31-218:32,ExpBox False),(218:24-218:33,ExpBox False),(218:36-218:37,ExpBox False),(218:39-218:40,ExpBox False),(218:42-218:43,ExpBox False),(218:35-218:44,ExpBox False),(218:53-218:53,ExpBox False),(218:55-218:55,ExpBox False),(218:57-218:57,ExpBox False),(218:46-218:58,ExpBox False),(218:60-218:61,ExpBox False),(218:63-218:64,ExpBox False),(218:20-218:65,ExpBox False),(218:13-218:65,ExpBox False),(218:69-218:71,ExpBox False),(218:12-218:72,ExpBox False),(218:5-218:72,ExpBox True),(220:17-220:18,ExpBox False),(220:20-220:21,ExpBox False),(220:23-220:24,ExpBox False),(220:13-220:25,ExpBox False),(220:29-220:31,ExpBox False),(220:12-220:32,ExpBox False),(220:5-220:32,ExpBox True),(222:25-222:25,ExpBox False),(222:27-222:27,ExpBox False),(222:21-222:28,ExpBox False),(222:13-222:28,ExpBox False),(222:32-222:34,ExpBox False),(222:12-222:35,ExpBox False),(222:5-222:35,ExpBox True),(224:25-224:25,ExpBox False),(224:27-224:28,ExpBox False),(224:30-224:31,ExpBox False),(224:33-224:34,ExpBox False),(224:21-224:35,ExpBox False),(224:13-224:35,ExpBox False),(224:39-224:41,ExpBox False),(224:12-224:42,ExpBox False),(224:5-224:42,ExpBox True),(230:15-230:15,ExpBox False),(230:17-230:17,ExpBox False),(230:12-230:17,ExpBox False),(230:6-230:17,LocalBox ["doPrimOp","res"]),(228:5-228:7,ExpBox False),(228:23-228:25,ExpBox False),(228:29-228:31,ExpBox False),(228:22-228:32,ExpBox False),(228:15-228:32,ExpBox False),(228:5-228:32,ExpBox True),(248:29-248:34,ExpBox False),(248:15-248:34,ExpBox False),(248:7-248:34,LocalBox ["doPrimOp","types"]),(244:22-244:26,ExpBox False),(244:15-244:26,ExpBox False),(244:7-244:26,LocalBox ["doPrimOp","len"]),(245:16-245:18,ExpBox False),(245:23-245:23,ExpBox False),(245:16-245:23,ExpBox False),(245:16-245:23,BinBox CondBinBox True),(245:16-245:23,BinBox CondBinBox False),(245:30-245:32,ExpBox True),(245:39-245:40,ExpBox True),(245:12-245:41,ExpBox False),(245:7-245:41,LocalBox ["doPrimOp","s"]),(246:18-246:20,ExpBox False),(246:25-246:25,ExpBox False),(246:18-246:25,ExpBox False),(246:18-246:25,BinBox CondBinBox True),(246:18-246:25,BinBox CondBinBox False),(246:32-246:36,ExpBox True),(246:43-246:46,ExpBox True),(246:14-246:47,ExpBox False),(246:7-246:47,LocalBox ["doPrimOp","are"]),(247:18-247:20,ExpBox False),(247:25-247:25,ExpBox False),(247:18-247:25,ExpBox False),(247:18-247:25,BinBox CondBinBox True),(247:18-247:25,BinBox CondBinBox False),(247:32-247:33,ExpBox True),(247:40-247:45,ExpBox True),(247:14-247:46,ExpBox False),(247:7-247:46,LocalBox ["doPrimOp","the"]),(233:10-233:73,ExpBox False),(234:16-234:17,ExpBox False),(234:11-234:17,ExpBox False),(234:22-234:31,ExpBox False),(235:16-235:17,ExpBox False),(235:11-235:17,ExpBox False),(235:22-235:30,ExpBox False),(235:48-235:52,ExpBox False),(235:40-235:53,ExpBox False),(235:35-235:53,ExpBox False),(235:58-235:68,ExpBox False),(235:73-235:73,ExpBox False),(236:23-236:29,ExpBox False),(236:34-236:36,ExpBox False),(236:41-236:47,ExpBox False),(236:52-236:52,ExpBox False),(236:57-236:64,ExpBox False),(237:11-237:18,ExpBox False),(237:49-237:53,ExpBox False),(237:38-237:39,ExpBox False),(237:33-237:39,ExpBox False),(237:31-237:55,ExpBox False),(237:23-237:55,ExpBox False),(237:61-237:68,ExpBox False),(238:11-238:45,ExpBox False),(238:50-238:50,ExpBox False),(238:55-238:70,ExpBox False),(239:19-239:21,ExpBox False),(239:26-239:34,ExpBox False),(241:51-241:55,ExpBox False),(241:43-241:56,ExpBox False),(241:58-241:61,ExpBox False),(241:37-241:62,ExpBox False),(241:29-241:62,ExpBox False),(240:21-240:23,ExpBox False),(240:33-240:35,ExpBox False),(240:28-240:35,ExpBox False),(240:40-240:42,ExpBox False),(240:28-240:42,ExpBox False),(240:21-240:42,ExpBox False),(240:19-241:64,ExpBox False),(240:11-241:64,ExpBox False),(241:70-241:78,ExpBox False),(242:14-242:63,ExpBox False),(241:70-242:63,ExpBox False),(240:11-242:63,ExpBox False),(239:26-242:63,ExpBox False),(239:19-242:63,ExpBox False),(238:55-242:63,ExpBox False),(238:50-242:63,ExpBox False),(238:11-242:63,ExpBox False),(237:61-242:63,ExpBox False),(237:23-242:63,ExpBox False),(237:11-242:63,ExpBox False),(236:57-242:63,ExpBox False),(236:52-242:63,ExpBox False),(236:41-242:63,ExpBox False),(236:34-242:63,ExpBox False),(236:23-242:63,ExpBox False),(235:73-242:63,ExpBox False),(235:58-242:63,ExpBox False),(235:35-242:63,ExpBox False),(235:22-242:63,ExpBox False),(235:11-242:63,ExpBox False),(234:22-242:63,ExpBox False),(234:11-242:63,ExpBox False),(233:9-242:64,ExpBox False),(233:5-242:64,ExpBox True),(164:1-248:34,TopLevelBox ["doPrimOp"]),(153:9-153:81,ExpBox False),(153:5-153:81,ExpBox True),(154:35-154:40,ExpBox False),(154:42-154:43,ExpBox False),(154:45-154:47,ExpBox False),(154:26-154:47,ExpBox True),(152:1-154:47,TopLevelBox ["doPureOp"]),(263:50-263:52,ExpBox False),(263:44-263:52,ExpBox False),(263:18-263:22,ExpBox False),(263:16-263:54,ExpBox False),(263:7-263:54,LocalBox ["doAllOp","lights"]),(259:24-259:24,ExpBox False),(259:26-259:26,ExpBox False),(259:28-259:28,ExpBox False),(259:17-259:29,ExpBox False),(259:31-259:36,ExpBox False),(259:38-259:40,ExpBox False),(259:42-259:44,ExpBox False),(259:47-259:49,ExpBox False),(259:54-259:55,ExpBox False),(259:59-259:63,ExpBox False),(259:53-259:64,ExpBox False),(259:46-259:65,ExpBox False),(259:67-259:69,ExpBox False),(259:71-259:72,ExpBox False),(259:74-259:76,ExpBox False),(259:10-259:76,ExpBox False),(260:17-260:19,ExpBox False),(260:10-260:19,ExpBox False),(259:5-261:8,ExpBox True),(265:34-265:39,ExpBox False),(265:41-265:42,ExpBox False),(265:44-265:46,ExpBox False),(265:25-265:46,ExpBox True),(255:1-265:46,TopLevelBox ["doAllOp"]),(21:17-21:18,ExpBox False),(21:10-21:18,ExpBox False),(21:3-21:18,TopLevelBox ["tick"]),(23:34-23:37,TopLevelBox ["showsPrec"]),(23:34-23:37,TopLevelBox ["showList"]),(45:28-45:31,TopLevelBox ["showsPrec"]),(45:28-45:31,TopLevelBox ["showList"]),(297:10-297:16,ExpBox False),(297:3-297:16,TopLevelBox ["doOp"]),(299:25-299:25,ExpBox False),(299:30-299:30,ExpBox False),(299:25-299:30,ExpBox False),(299:25-299:30,BinBox CondBinBox True),(299:25-299:30,BinBox CondBinBox False),(300:35-300:51,ExpBox False),(300:27-300:51,ExpBox True),(301:36-301:37,ExpBox False),(301:40-301:40,ExpBox False),(301:42-301:42,ExpBox False),(301:39-301:43,ExpBox False),(301:27-301:43,ExpBox True),(299:22-301:43,ExpBox False),(299:14-301:44,ExpBox False),(299:10-301:44,ExpBox False),(299:3-301:44,TopLevelBox ["tick"]),(298:10-298:13,ExpBox False),(298:3-298:13,TopLevelBox ["err"]),(290:42-290:42,ExpBox False),(290:39-290:42,ExpBox False),(291:63-291:63,ExpBox False),(291:60-291:64,ExpBox False),(291:66-291:67,ExpBox False),(291:53-291:67,ExpBox True),(292:61-292:61,ExpBox False),(292:53-292:61,ExpBox True),(290:34-292:61,ExpBox False),(290:26-292:62,ExpBox False),(290:22-292:62,ExpBox False),(290:5-292:62,TopLevelBox [">>="]),(293:41-293:41,ExpBox False),(293:43-293:43,ExpBox False),(293:32-293:43,ExpBox False),(293:24-293:44,ExpBox False),(293:20-293:44,ExpBox False),(293:5-293:44,TopLevelBox ["return"]),(294:40-294:40,ExpBox False),(294:32-294:40,ExpBox False),(294:24-294:41,ExpBox False),(294:20-294:41,ExpBox False),(294:5-294:41,TopLevelBox ["fail"]),(37:36-37:39,ExpBox False),(37:41-37:42,ExpBox False),(37:44-37:46,ExpBox False),(37:27-37:46,ExpBox False),(35:22-38:25,ExpBox False),(35:3-38:25,TopLevelBox ["doOp"]),(39:18-39:18,ExpBox False),(39:12-39:18,ExpBox False),(39:3-39:18,TopLevelBox ["err"]),(31:12-31:19,ExpBox False),(31:3-31:19,TopLevelBox ["doOp"]),(32:18-32:18,ExpBox False),(32:12-32:18,ExpBox False),(32:3-32:18,TopLevelBox ["err"]),(26:22-26:22,ExpBox False),(26:20-26:22,ExpBox False),(26:5-26:22,TopLevelBox [">>="]),(27:20-27:23,ExpBox False),(27:5-27:23,TopLevelBox ["return"]),(28:26-28:26,ExpBox False),(28:20-28:26,ExpBox False),(28:5-28:26,TopLevelBox ["fail"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Geometry.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Geometry.mix new file mode 100644 index 0000000000000000000000000000000000000000..5307f9849164a77e1646fa9f13cce4ff532fd063 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Geometry.mix @@ -0,0 +1 @@ +Mix "./Geometry.hs" 2011-09-06 12:02:04 UTC 1504513891 8 [(311:12-311:12,ExpBox False),(311:16-311:16,ExpBox False),(311:12-311:16,ExpBox False),(311:12-311:16,BinBox GuardBinBox True),(311:12-311:16,BinBox GuardBinBox False),(311:20-311:20,ExpBox True),(312:12-312:12,ExpBox False),(312:16-312:16,ExpBox False),(312:12-312:16,ExpBox False),(312:12-312:16,BinBox GuardBinBox True),(312:12-312:16,BinBox GuardBinBox False),(312:20-312:20,ExpBox True),(313:12-313:15,ExpBox False),(313:12-313:15,BinBox GuardBinBox True),(313:12-313:15,BinBox GuardBinBox False),(313:20-313:20,ExpBox True),(311:1-313:20,TopLevelBox ["clampf"]),(299:7-299:12,ExpBox False),(299:1-299:12,TopLevelBox ["inf"]),(298:11-298:17,ExpBox False),(298:1-298:17,TopLevelBox ["epsilon"]),(302:13-302:13,ExpBox False),(302:17-302:23,ExpBox False),(302:13-302:23,ExpBox False),(302:13-302:23,BinBox GuardBinBox True),(302:13-302:23,BinBox GuardBinBox False),(302:28-302:28,ExpBox True),(303:13-303:13,ExpBox False),(303:18-303:24,ExpBox False),(303:17-303:24,ExpBox False),(303:13-303:24,ExpBox False),(303:13-303:24,BinBox GuardBinBox True),(303:13-303:24,BinBox GuardBinBox False),(303:28-303:28,ExpBox True),(304:13-304:21,ExpBox False),(304:13-304:21,BinBox GuardBinBox True),(304:13-304:21,BinBox GuardBinBox False),(304:28-304:34,ExpBox True),(302:1-304:34,TopLevelBox ["nonZero"]),(307:18-307:18,ExpBox False),(307:20-307:20,ExpBox False),(307:17-307:21,ExpBox False),(307:13-307:21,ExpBox False),(307:25-307:31,ExpBox False),(307:13-307:31,ExpBox False),(307:1-307:31,TopLevelBox ["eqEps"]),(308:8-308:12,ExpBox False),(308:1-308:12,TopLevelBox ["near"]),(290:29-290:29,ExpBox False),(290:38-290:38,ExpBox False),(290:29-290:38,ExpBox False),(290:43-290:43,ExpBox False),(290:52-290:52,ExpBox False),(290:43-290:52,ExpBox False),(290:57-290:57,ExpBox False),(290:66-290:66,ExpBox False),(290:57-290:66,ExpBox False),(290:43-290:66,ExpBox False),(290:29-290:66,ExpBox False),(290:1-290:66,TopLevelBox ["nearC"]),(287:31-287:31,ExpBox False),(287:33-287:33,ExpBox False),(287:30-287:34,ExpBox False),(287:37-287:37,ExpBox False),(287:39-287:39,ExpBox False),(287:36-287:40,ExpBox False),(287:43-287:43,ExpBox False),(287:45-287:45,ExpBox False),(287:42-287:46,ExpBox False),(287:28-287:46,ExpBox False),(287:1-287:46,TopLevelBox ["multSC"]),(284:33-284:33,ExpBox False),(284:35-284:35,ExpBox False),(284:32-284:36,ExpBox False),(284:39-284:39,ExpBox False),(284:41-284:41,ExpBox False),(284:38-284:42,ExpBox False),(284:45-284:45,ExpBox False),(284:47-284:47,ExpBox False),(284:44-284:48,ExpBox False),(284:30-284:48,ExpBox False),(284:1-284:48,TopLevelBox ["multCC"]),(278:32-278:32,ExpBox False),(278:34-278:34,ExpBox False),(278:31-278:35,ExpBox False),(278:38-278:38,ExpBox False),(278:40-278:40,ExpBox False),(278:37-278:41,ExpBox False),(278:44-278:44,ExpBox False),(278:46-278:46,ExpBox False),(278:43-278:47,ExpBox False),(278:29-278:47,ExpBox False),(278:1-278:47,TopLevelBox ["subCC"]),(275:32-275:32,ExpBox False),(275:34-275:34,ExpBox False),(275:31-275:35,ExpBox False),(275:38-275:38,ExpBox False),(275:40-275:40,ExpBox False),(275:37-275:41,ExpBox False),(275:44-275:44,ExpBox False),(275:46-275:46,ExpBox False),(275:43-275:47,ExpBox False),(275:29-275:47,ExpBox False),(275:1-275:47,TopLevelBox ["addCC"]),(272:11-272:11,ExpBox False),(272:13-272:13,ExpBox False),(272:15-272:15,ExpBox False),(272:9-272:15,ExpBox False),(272:1-272:15,TopLevelBox ["black"]),(281:15-281:19,ExpBox False),(281:21-281:25,ExpBox False),(281:9-281:25,ExpBox False),(281:1-281:25,TopLevelBox ["sumCC"]),(270:11-270:11,ExpBox False),(270:13-270:13,ExpBox False),(270:15-270:15,ExpBox False),(270:9-270:15,ExpBox False),(270:1-270:15,TopLevelBox ["white"]),(239:47-239:49,ExpBox False),(239:52-239:54,ExpBox False),(239:57-239:59,ExpBox False),(239:62-239:64,ExpBox False),(239:44-239:65,ExpBox False),(240:47-240:49,ExpBox False),(240:52-240:54,ExpBox False),(240:57-240:59,ExpBox False),(240:62-240:64,ExpBox False),(240:44-240:65,ExpBox False),(241:47-241:49,ExpBox False),(241:52-241:54,ExpBox False),(241:57-241:59,ExpBox False),(241:62-241:64,ExpBox False),(241:44-241:65,ExpBox False),(242:47-242:49,ExpBox False),(242:52-242:54,ExpBox False),(242:57-242:59,ExpBox False),(242:62-242:64,ExpBox False),(242:44-242:65,ExpBox False),(239:41-242:66,ExpBox False),(236:1-242:66,TopLevelBox ["transposeM"]),(222:25-222:25,ExpBox False),(222:27-222:27,ExpBox False),(222:24-222:28,ExpBox False),(222:31-222:31,ExpBox False),(222:33-222:33,ExpBox False),(222:30-222:34,ExpBox False),(222:37-222:37,ExpBox False),(222:39-222:39,ExpBox False),(222:36-222:40,ExpBox False),(222:22-222:40,ExpBox False),(222:1-222:40,TopLevelBox ["multSV"]),(210:8-210:8,ExpBox False),(210:12-210:12,ExpBox False),(210:8-210:12,ExpBox False),(210:1-210:12,TopLevelBox ["sq"]),(214:28-214:28,ExpBox False),(214:25-214:28,ExpBox False),(214:35-214:35,ExpBox False),(214:32-214:35,ExpBox False),(214:25-214:35,ExpBox False),(214:42-214:42,ExpBox False),(214:39-214:42,ExpBox False),(214:25-214:42,ExpBox False),(214:1-214:42,TopLevelBox ["distFrom0Sq"]),(218:33-218:33,ExpBox False),(218:20-218:34,ExpBox False),(218:15-218:34,ExpBox False),(218:1-218:34,TopLevelBox ["distFrom0"]),(200:27-200:27,ExpBox False),(200:24-200:27,ExpBox False),(200:34-200:34,ExpBox False),(200:31-200:34,ExpBox False),(200:24-200:34,ExpBox False),(200:41-200:41,ExpBox False),(200:38-200:41,ExpBox False),(200:23-200:42,ExpBox False),(200:18-200:42,ExpBox False),(200:11-200:42,LocalBox ["normalize","norm"]),(198:16-198:19,ExpBox False),(198:24-198:24,ExpBox False),(198:16-198:24,ExpBox False),(198:16-198:24,BinBox GuardBinBox True),(198:16-198:24,BinBox GuardBinBox False),(198:36-198:36,ExpBox False),(198:38-198:41,ExpBox False),(198:35-198:42,ExpBox False),(198:44-198:44,ExpBox False),(198:28-198:44,ExpBox True),(199:16-199:24,ExpBox False),(199:16-199:24,BinBox GuardBinBox True),(199:16-199:24,BinBox GuardBinBox False),(199:34-199:51,ExpBox False),(199:28-199:51,ExpBox True),(197:1-200:42,TopLevelBox ["normalize"]),(192:27-192:27,ExpBox False),(192:24-192:27,ExpBox False),(192:34-192:34,ExpBox False),(192:31-192:34,ExpBox False),(192:24-192:34,ExpBox False),(192:41-192:41,ExpBox False),(192:38-192:41,ExpBox False),(192:23-192:42,ExpBox False),(192:18-192:42,ExpBox False),(192:1-192:42,TopLevelBox ["norm"]),(188:10-188:11,ExpBox False),(188:15-188:16,ExpBox False),(188:9-188:17,ExpBox False),(188:20-188:21,ExpBox False),(188:25-188:26,ExpBox False),(188:19-188:27,ExpBox False),(188:30-188:31,ExpBox False),(188:35-188:36,ExpBox False),(188:29-188:37,ExpBox False),(188:7-188:37,ExpBox False),(187:1-188:37,TopLevelBox ["subPP"]),(206:26-206:27,ExpBox False),(206:29-206:30,ExpBox False),(206:20-206:30,ExpBox False),(204:18-204:18,ExpBox False),(204:15-204:18,ExpBox False),(204:25-204:25,ExpBox False),(204:22-204:25,ExpBox False),(204:15-204:25,ExpBox False),(204:32-204:32,ExpBox False),(204:29-204:32,ExpBox False),(204:15-204:32,ExpBox False),(204:1-206:30,TopLevelBox ["dist2"]),(184:11-184:12,ExpBox False),(184:9-184:13,ExpBox False),(184:17-184:18,ExpBox False),(184:15-184:19,ExpBox False),(184:23-184:24,ExpBox False),(184:21-184:25,ExpBox False),(184:7-184:25,ExpBox False),(183:1-184:25,TopLevelBox ["negV"]),(180:10-180:11,ExpBox False),(180:15-180:16,ExpBox False),(180:9-180:17,ExpBox False),(180:20-180:21,ExpBox False),(180:25-180:26,ExpBox False),(180:19-180:27,ExpBox False),(180:30-180:31,ExpBox False),(180:35-180:36,ExpBox False),(180:29-180:37,ExpBox False),(180:7-180:37,ExpBox False),(179:1-180:37,TopLevelBox ["subVV"]),(176:10-176:11,ExpBox False),(176:15-176:16,ExpBox False),(176:9-176:17,ExpBox False),(176:20-176:21,ExpBox False),(176:25-176:26,ExpBox False),(176:19-176:27,ExpBox False),(176:30-176:31,ExpBox False),(176:35-176:36,ExpBox False),(176:29-176:37,ExpBox False),(176:7-176:37,ExpBox False),(175:1-176:37,TopLevelBox ["addPV"]),(293:25-293:25,ExpBox False),(293:36-293:36,ExpBox False),(293:47-293:47,ExpBox False),(293:35-293:48,ExpBox False),(293:25-293:48,ExpBox False),(293:1-293:48,TopLevelBox ["offsetToPoint"]),(172:10-172:11,ExpBox False),(172:15-172:16,ExpBox False),(172:9-172:17,ExpBox False),(172:20-172:21,ExpBox False),(172:25-172:26,ExpBox False),(172:19-172:27,ExpBox False),(172:30-172:31,ExpBox False),(172:35-172:36,ExpBox False),(172:29-172:37,ExpBox False),(172:7-172:37,ExpBox False),(171:1-172:37,TopLevelBox ["addVV"]),(168:40-168:41,ExpBox False),(168:45-168:46,ExpBox False),(168:40-168:46,ExpBox False),(168:50-168:51,ExpBox False),(168:55-168:56,ExpBox False),(168:50-168:56,ExpBox False),(168:40-168:56,ExpBox False),(168:60-168:61,ExpBox False),(168:65-168:66,ExpBox False),(168:60-168:66,ExpBox False),(168:40-168:66,ExpBox False),(168:70-168:71,ExpBox False),(168:75-168:76,ExpBox False),(168:70-168:76,ExpBox False),(168:40-168:76,ExpBox False),(168:1-168:76,TopLevelBox ["dot4"]),(260:18-260:18,ExpBox False),(260:20-260:21,ExpBox False),(260:12-260:22,ExpBox False),(261:18-261:18,ExpBox False),(261:20-261:21,ExpBox False),(261:12-261:22,ExpBox False),(262:18-262:18,ExpBox False),(262:20-262:21,ExpBox False),(262:12-262:22,ExpBox False),(263:18-263:18,ExpBox False),(263:20-263:21,ExpBox False),(263:12-263:22,ExpBox False),(260:10-263:22,ExpBox False),(259:1-263:22,TopLevelBox ["multMQ"]),(232:23-232:24,ExpBox False),(232:12-232:24,ExpBox False),(232:6-232:24,LocalBox ["multMM","m2'"]),(227:18-227:20,ExpBox False),(227:22-227:23,ExpBox False),(227:10-227:24,ExpBox False),(228:18-228:20,ExpBox False),(228:22-228:23,ExpBox False),(228:10-228:24,ExpBox False),(229:18-229:20,ExpBox False),(229:22-229:23,ExpBox False),(229:10-229:24,ExpBox False),(230:18-230:20,ExpBox False),(230:22-230:23,ExpBox False),(230:10-230:24,ExpBox False),(227:8-230:24,ExpBox False),(226:1-232:24,TopLevelBox ["multMM"]),(157:8-157:9,ExpBox False),(157:13-157:14,ExpBox False),(157:8-157:14,ExpBox False),(157:18-157:19,ExpBox False),(157:23-157:24,ExpBox False),(157:18-157:24,ExpBox False),(157:7-157:25,ExpBox False),(157:28-157:29,ExpBox False),(157:33-157:34,ExpBox False),(157:28-157:34,ExpBox False),(157:38-157:39,ExpBox False),(157:43-157:44,ExpBox False),(157:38-157:44,ExpBox False),(157:27-157:45,ExpBox False),(157:48-157:49,ExpBox False),(157:53-157:54,ExpBox False),(157:48-157:54,ExpBox False),(157:58-157:59,ExpBox False),(157:63-157:64,ExpBox False),(157:58-157:64,ExpBox False),(157:47-157:65,ExpBox False),(157:5-157:65,ExpBox False),(156:1-157:65,TopLevelBox ["cross"]),(153:33-153:34,ExpBox False),(153:38-153:39,ExpBox False),(153:33-153:39,ExpBox False),(153:43-153:44,ExpBox False),(153:48-153:49,ExpBox False),(153:43-153:49,ExpBox False),(153:33-153:49,ExpBox False),(153:53-153:54,ExpBox False),(153:58-153:59,ExpBox False),(153:53-153:59,ExpBox False),(153:33-153:59,ExpBox False),(153:1-153:59,TopLevelBox ["dot"]),(149:32-149:32,ExpBox False),(149:34-149:34,ExpBox False),(149:36-149:36,ExpBox False),(149:30-149:36,ExpBox False),(149:1-149:36,TopLevelBox ["quad_to_vector"]),(145:31-145:31,ExpBox False),(145:33-145:33,ExpBox False),(145:35-145:35,ExpBox False),(145:29-145:35,ExpBox False),(145:1-145:35,TopLevelBox ["quad_to_point"]),(141:29-141:29,ExpBox False),(141:31-141:31,ExpBox False),(141:33-141:33,ExpBox False),(141:35-141:35,ExpBox False),(141:27-141:35,ExpBox False),(141:1-141:35,TopLevelBox ["point_to_quad"]),(253:36-253:36,ExpBox False),(253:53-253:53,ExpBox False),(253:38-253:54,ExpBox False),(253:28-253:55,ExpBox False),(253:14-253:55,ExpBox False),(253:1-253:55,TopLevelBox ["multMP"]),(137:30-137:30,ExpBox False),(137:32-137:32,ExpBox False),(137:34-137:34,ExpBox False),(137:36-137:36,ExpBox False),(137:28-137:36,ExpBox False),(137:1-137:36,TopLevelBox ["vector_to_quad"]),(249:37-249:37,ExpBox False),(249:55-249:55,ExpBox False),(249:39-249:56,ExpBox False),(249:29-249:57,ExpBox False),(249:14-249:57,ExpBox False),(249:1-249:57,TopLevelBox ["multMV"]),(267:27-267:27,ExpBox False),(267:29-267:29,ExpBox False),(267:20-267:29,ExpBox False),(267:39-267:39,ExpBox False),(267:41-267:41,ExpBox False),(267:32-267:41,ExpBox False),(267:19-267:42,ExpBox False),(267:1-267:42,TopLevelBox ["multMR"]),(133:32-133:32,ExpBox False),(133:34-133:34,ExpBox False),(133:36-133:36,ExpBox False),(133:30-133:36,ExpBox False),(133:1-133:36,TopLevelBox ["vector_to_point"]),(130:31-130:31,ExpBox False),(130:33-130:33,ExpBox False),(130:35-130:35,ExpBox False),(130:29-130:35,ExpBox False),(130:1-130:35,TopLevelBox ["point_to_vector"]),(127:29-127:29,ExpBox False),(127:38-127:38,ExpBox False),(127:29-127:38,ExpBox False),(127:43-127:43,ExpBox False),(127:52-127:52,ExpBox False),(127:43-127:52,ExpBox False),(127:57-127:57,ExpBox False),(127:66-127:66,ExpBox False),(127:57-127:66,ExpBox False),(127:43-127:66,ExpBox False),(127:29-127:66,ExpBox False),(127:1-127:66,TopLevelBox ["nearV"]),(124:18-124:18,ExpBox False),(124:20-124:20,ExpBox False),(124:22-124:22,ExpBox False),(124:16-124:22,ExpBox False),(124:1-124:22,TopLevelBox ["vector"]),(163:14-163:14,ExpBox False),(163:19-163:19,ExpBox False),(163:14-163:19,ExpBox False),(163:14-163:19,BinBox GuardBinBox True),(163:14-163:19,BinBox GuardBinBox False),(163:44-163:44,ExpBox False),(163:46-163:46,ExpBox False),(163:50-163:50,ExpBox False),(163:48-163:51,ExpBox False),(163:36-163:52,ExpBox False),(163:26-163:52,ExpBox True),(164:14-164:22,ExpBox False),(164:14-164:22,BinBox GuardBinBox True),(164:14-164:22,BinBox GuardBinBox False),(164:46-164:46,ExpBox False),(164:44-164:47,ExpBox False),(164:49-164:49,ExpBox False),(164:51-164:51,ExpBox False),(164:36-164:52,ExpBox False),(164:26-164:52,ExpBox True),(163:9-164:52,LocalBox ["tangents","v1"]),(162:6-162:7,ExpBox False),(162:10-162:10,ExpBox False),(162:20-162:21,ExpBox False),(162:10-162:21,ExpBox False),(162:5-162:22,ExpBox False),(161:1-164:52,TopLevelBox ["tangents"]),(121:17-121:17,ExpBox False),(121:19-121:19,ExpBox False),(121:21-121:21,ExpBox False),(121:15-121:21,ExpBox False),(121:1-121:21,TopLevelBox ["point"]),(118:24-118:24,ExpBox False),(118:1-118:24,TopLevelBox ["zComponent"]),(116:24-116:24,ExpBox False),(116:1-116:24,TopLevelBox ["yComponent"]),(114:24-114:24,ExpBox False),(114:1-114:24,TopLevelBox ["xComponent"]),(111:20-111:20,ExpBox False),(111:1-111:20,TopLevelBox ["zCoord"]),(109:20-109:20,ExpBox False),(109:1-109:20,TopLevelBox ["yCoord"]),(107:20-107:20,ExpBox False),(107:1-107:20,TopLevelBox ["xCoord"]),(104:22-104:22,ExpBox False),(104:24-104:24,ExpBox False),(104:26-104:26,ExpBox False),(104:21-104:27,ExpBox False),(104:1-104:27,TopLevelBox ["uncolor"]),(102:17-102:17,ExpBox False),(102:19-102:19,ExpBox False),(102:21-102:21,ExpBox False),(102:15-102:21,ExpBox False),(102:1-102:21,TopLevelBox ["color"]),(100:16-100:16,ExpBox False),(100:19-100:19,ExpBox False),(100:22-100:22,ExpBox False),(100:15-100:23,ExpBox False),(100:1-100:23,TopLevelBox ["coord"]),(95:10-95:12,ExpBox False),(95:14-95:16,ExpBox False),(95:18-95:20,ExpBox False),(95:22-95:24,ExpBox False),(95:7-95:25,ExpBox False),(96:10-96:12,ExpBox False),(96:14-96:16,ExpBox False),(96:18-96:20,ExpBox False),(96:22-96:24,ExpBox False),(96:7-96:25,ExpBox False),(97:10-97:12,ExpBox False),(97:14-97:16,ExpBox False),(97:18-97:20,ExpBox False),(97:22-97:24,ExpBox False),(97:7-97:25,ExpBox False),(98:10-98:12,ExpBox False),(98:14-98:16,ExpBox False),(98:18-98:20,ExpBox False),(98:22-98:24,ExpBox False),(98:7-98:25,ExpBox False),(95:5-98:25,ExpBox False),(91:1-98:25,TopLevelBox ["matrix"]),(70:15-70:18,TopLevelBox ["showsPrec"]),(70:15-70:18,TopLevelBox ["showList"]),(72:15-72:18,TopLevelBox ["showsPrec"]),(72:15-72:18,TopLevelBox ["showList"]),(72:21-72:22,TopLevelBox ["=="]),(72:21-72:22,TopLevelBox ["/="]),(77:15-77:18,TopLevelBox ["showsPrec"]),(77:15-77:18,TopLevelBox ["showList"]),(77:21-77:22,TopLevelBox ["=="]),(77:21-77:22,TopLevelBox ["/="]),(80:15-80:18,TopLevelBox ["showsPrec"]),(80:15-80:18,TopLevelBox ["showList"]),(83:15-83:18,TopLevelBox ["showsPrec"]),(83:15-83:18,TopLevelBox ["showList"]),(74:15-74:18,TopLevelBox ["showsPrec"]),(74:15-74:18,TopLevelBox ["showList"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Illumination.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Illumination.mix new file mode 100644 index 0000000000000000000000000000000000000000..f66f21198c05a8a0ad69565c34334e1200047023 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Illumination.mix @@ -0,0 +1 @@ +Mix "./Illumination.hs" 2011-09-06 12:02:04 UTC 615204115 8 [(226:33-226:35,ExpBox False),(226:37-226:37,ExpBox False),(226:10-226:37,ExpBox False),(227:38-227:42,ExpBox True),(228:38-228:42,ExpBox True),(229:38-229:42,ExpBox True),(230:38-230:42,ExpBox True),(231:38-231:38,ExpBox False),(231:42-231:44,ExpBox False),(231:38-231:44,ExpBox True),(226:5-231:44,ExpBox False),(225:1-231:44,TopLevelBox ["intersectWithin"]),(217:33-217:35,ExpBox False),(217:37-217:37,ExpBox False),(217:10-217:37,ExpBox False),(218:38-218:42,ExpBox True),(219:38-219:42,ExpBox True),(220:38-220:42,ExpBox True),(221:38-221:42,ExpBox True),(222:38-222:41,ExpBox True),(217:5-222:41,ExpBox False),(216:1-222:41,TopLevelBox ["intersects"]),(207:33-207:35,ExpBox False),(207:37-207:37,ExpBox False),(207:10-207:37,ExpBox False),(208:41-208:47,ExpBox True),(209:41-209:47,ExpBox True),(210:41-210:47,ExpBox True),(211:41-211:47,ExpBox True),(213:33-213:33,ExpBox False),(213:35-213:36,ExpBox False),(213:25-213:36,ExpBox False),(214:33-214:35,ExpBox False),(214:37-214:37,ExpBox False),(214:19-214:37,ExpBox False),(214:40-214:40,ExpBox False),(214:43-214:46,ExpBox False),(214:18-214:47,ExpBox False),(213:9-214:47,ExpBox True),(207:5-214:47,ExpBox False),(206:1-214:47,TopLevelBox ["castRay"]),(202:24-202:26,ExpBox False),(202:31-202:32,ExpBox False),(202:45-202:47,ExpBox False),(202:39-202:48,ExpBox False),(202:36-202:48,ExpBox False),(202:30-202:49,ExpBox False),(202:23-202:50,ExpBox False),(202:61-202:65,ExpBox False),(202:23-202:65,ExpBox False),(202:1-202:65,TopLevelBox ["attenuate"]),(179:5-179:7,ExpBox False),(179:15-179:19,ExpBox False),(179:5-179:19,ExpBox False),(179:23-179:23,ExpBox False),(179:5-179:23,ExpBox False),(179:5-179:23,BinBox GuardBinBox True),(179:5-179:23,BinBox GuardBinBox False),(179:27-179:33,ExpBox True),(180:17-180:19,ExpBox False),(180:30-180:35,ExpBox False),(180:46-180:48,ExpBox False),(180:29-180:49,ExpBox False),(180:17-180:49,ExpBox False),(180:51-180:53,ExpBox False),(180:16-180:54,ExpBox False),(180:56-180:58,ExpBox False),(180:5-180:58,ExpBox False),(180:5-180:58,BinBox GuardBinBox True),(180:5-180:58,BinBox GuardBinBox False),(180:62-180:68,ExpBox True),(181:5-181:13,ExpBox False),(181:5-181:13,BinBox GuardBinBox True),(181:5-181:13,BinBox GuardBinBox False),(181:37-181:39,ExpBox False),(181:41-181:45,ExpBox False),(181:36-181:46,ExpBox False),(181:31-181:46,ExpBox True),(186:19-186:20,ExpBox False),(186:30-186:32,ExpBox False),(186:19-186:32,ExpBox False),(186:13-186:32,LocalBox ["unobscure","vec"]),(187:29-187:31,ExpBox False),(187:33-187:37,ExpBox False),(187:19-187:37,ExpBox False),(187:13-187:37,LocalBox ["unobscure","is"]),(183:5-183:7,ExpBox False),(183:15-183:19,ExpBox False),(183:5-183:19,ExpBox False),(183:23-183:23,ExpBox False),(183:5-183:23,ExpBox False),(183:5-183:23,BinBox GuardBinBox True),(183:5-183:23,BinBox GuardBinBox False),(183:31-183:37,ExpBox True),(184:22-184:24,ExpBox False),(184:35-184:40,ExpBox False),(184:62-184:64,ExpBox False),(184:51-184:65,ExpBox False),(184:34-184:66,ExpBox False),(184:22-184:66,ExpBox False),(184:69-184:71,ExpBox False),(184:21-184:72,ExpBox False),(184:74-184:76,ExpBox False),(184:5-184:76,ExpBox False),(184:5-184:76,BinBox GuardBinBox True),(184:5-184:76,BinBox GuardBinBox False),(184:80-184:86,ExpBox True),(185:5-185:13,ExpBox False),(185:5-185:13,BinBox GuardBinBox True),(185:5-185:13,BinBox GuardBinBox False),(185:37-185:39,ExpBox False),(185:41-185:42,ExpBox False),(185:36-185:43,ExpBox False),(185:31-185:43,ExpBox True),(198:32-198:34,ExpBox False),(198:44-198:46,ExpBox False),(198:31-198:47,ExpBox False),(198:21-198:47,ExpBox False),(198:13-198:47,LocalBox ["unobscure","qsp"]),(197:32-197:33,ExpBox False),(197:43-197:45,ExpBox False),(197:31-197:46,ExpBox False),(197:21-197:46,ExpBox False),(197:13-197:46,LocalBox ["unobscure","asp"]),(194:21-194:23,ExpBox False),(194:33-194:34,ExpBox False),(194:21-194:34,ExpBox False),(194:13-194:34,LocalBox ["unobscure","vec'"]),(193:21-193:23,ExpBox False),(193:33-193:35,ExpBox False),(193:21-193:35,ExpBox False),(193:13-193:35,LocalBox ["unobscure","vec"]),(195:37-195:39,ExpBox False),(195:27-195:39,ExpBox False),(195:58-195:61,ExpBox False),(195:47-195:62,ExpBox False),(195:26-195:63,ExpBox False),(195:21-195:63,ExpBox False),(195:13-195:63,LocalBox ["unobscure","angle"]),(199:31-199:33,ExpBox False),(199:38-199:40,ExpBox False),(199:48-199:50,ExpBox False),(199:37-199:51,ExpBox False),(199:56-199:58,ExpBox False),(199:36-199:59,ExpBox False),(199:70-199:74,ExpBox False),(199:35-199:75,ExpBox False),(199:21-199:75,ExpBox False),(199:13-199:75,LocalBox ["unobscure","is"]),(189:5-189:7,ExpBox False),(189:15-189:19,ExpBox False),(189:5-189:19,ExpBox False),(189:23-189:23,ExpBox False),(189:5-189:23,ExpBox False),(189:5-189:23,BinBox GuardBinBox True),(189:5-189:23,BinBox GuardBinBox False),(189:75-189:81,ExpBox True),(190:22-190:24,ExpBox False),(190:35-190:40,ExpBox False),(190:62-190:64,ExpBox False),(190:51-190:65,ExpBox False),(190:34-190:66,ExpBox False),(190:22-190:66,ExpBox False),(190:69-190:71,ExpBox False),(190:21-190:72,ExpBox False),(190:74-190:76,ExpBox False),(190:5-190:76,ExpBox False),(190:5-190:76,BinBox GuardBinBox True),(190:5-190:76,BinBox GuardBinBox False),(190:80-190:86,ExpBox True),(191:5-191:9,ExpBox False),(191:13-191:18,ExpBox False),(191:5-191:18,ExpBox False),(191:5-191:18,BinBox GuardBinBox True),(191:5-191:18,BinBox GuardBinBox False),(191:75-191:81,ExpBox True),(192:5-192:13,ExpBox False),(192:5-192:13,BinBox GuardBinBox True),(192:5-192:13,BinBox GuardBinBox False),(192:81-192:83,ExpBox False),(192:86-192:87,ExpBox False),(192:80-192:88,ExpBox False),(192:75-192:88,ExpBox True),(177:1-199:75,TopLevelBox ["unobscure"]),(174:61-174:63,ExpBox False),(174:65-174:67,ExpBox False),(174:69-174:73,ExpBox False),(174:50-174:74,ExpBox False),(174:76-174:81,ExpBox False),(174:45-174:82,ExpBox False),(174:35-174:82,ExpBox False),(174:1-174:82,TopLevelBox ["unobscured"]),(169:46-169:46,ExpBox False),(169:48-169:48,ExpBox False),(169:38-169:49,ExpBox False),(169:51-169:51,ExpBox False),(169:32-169:51,ExpBox True),(170:56-170:56,ExpBox False),(170:58-170:58,ExpBox False),(170:48-170:59,ExpBox False),(170:61-170:61,ExpBox False),(170:37-170:61,ExpBox True),(171:60-171:60,ExpBox False),(171:62-171:62,ExpBox False),(171:52-171:63,ExpBox False),(171:73-171:73,ExpBox False),(171:75-171:75,ExpBox False),(171:65-171:76,ExpBox False),(171:78-171:78,ExpBox False),(171:80-171:80,ExpBox False),(171:82-171:82,ExpBox False),(171:42-171:82,ExpBox True),(169:1-171:82,TopLevelBox ["transformLight"]),(167:20-167:20,ExpBox False),(167:22-167:22,ExpBox False),(167:24-167:24,ExpBox False),(167:13-167:25,ExpBox False),(167:34-167:34,ExpBox False),(167:36-167:36,ExpBox False),(167:38-167:38,ExpBox False),(167:27-167:39,ExpBox False),(167:41-167:43,ExpBox False),(167:45-167:50,ExpBox False),(167:52-167:54,ExpBox False),(167:3-167:54,ExpBox False),(166:1-167:54,TopLevelBox ["spotlight"]),(165:21-165:21,ExpBox False),(165:23-165:23,ExpBox False),(165:25-165:25,ExpBox False),(165:14-165:26,ExpBox False),(165:28-165:32,ExpBox False),(165:3-165:32,ExpBox False),(164:1-165:32,TopLevelBox ["pointlight"]),(163:30-163:30,ExpBox False),(163:28-163:31,ExpBox False),(163:35-163:35,ExpBox False),(163:33-163:36,ExpBox False),(163:40-163:40,ExpBox False),(163:38-163:41,ExpBox False),(163:20-163:42,ExpBox False),(163:9-163:43,ExpBox False),(163:45-163:49,ExpBox False),(163:3-163:49,ExpBox False),(162:1-163:49,TopLevelBox ["light"]),(152:31-152:31,ExpBox False),(152:24-152:31,ExpBox False),(152:35-152:37,ExpBox False),(152:23-152:38,ExpBox False),(152:17-152:38,ExpBox False),(152:1-152:38,TopLevelBox ["scalePixel'"]),(148:14-148:28,ExpBox False),(148:38-148:40,ExpBox False),(148:33-148:40,ExpBox False),(148:45-148:47,ExpBox False),(148:57-148:58,ExpBox False),(148:52-148:58,ExpBox False),(148:63-148:71,ExpBox False),(148:52-148:71,ExpBox False),(148:45-148:71,ExpBox False),(148:33-148:71,ExpBox False),(148:14-148:71,ExpBox False),(148:5-148:71,LocalBox ["showBitmap'","header"]),(146:20-146:22,ExpBox False),(145:38-145:44,ExpBox False),(145:46-145:47,ExpBox False),(145:34-145:47,ExpBox False),(144:37-144:37,ExpBox False),(144:25-144:37,ExpBox False),(144:51-144:51,ExpBox False),(144:39-144:51,ExpBox False),(144:65-144:65,ExpBox False),(144:53-144:65,ExpBox False),(144:24-144:66,ExpBox False),(144:21-145:48,ExpBox False),(144:14-145:48,ExpBox False),(144:12-146:24,ExpBox False),(144:5-146:24,ExpBox True),(149:27-149:61,ExpBox False),(149:21-149:61,ExpBox True),(142:1-149:61,TopLevelBox ["showBitmap'"]),(139:35-139:35,ExpBox False),(139:28-139:35,ExpBox False),(139:39-139:41,ExpBox False),(139:27-139:42,ExpBox False),(139:20-139:43,ExpBox False),(139:16-139:43,ExpBox False),(139:1-139:43,TopLevelBox ["scalePixel"]),(135:14-135:28,ExpBox False),(135:38-135:40,ExpBox False),(135:33-135:40,ExpBox False),(135:45-135:47,ExpBox False),(135:57-135:58,ExpBox False),(135:52-135:58,ExpBox False),(135:63-135:71,ExpBox False),(135:52-135:71,ExpBox False),(135:45-135:71,ExpBox False),(135:33-135:71,ExpBox False),(135:14-135:71,ExpBox False),(135:5-135:71,LocalBox ["showBitmap","header"]),(132:5-132:10,ExpBox False),(133:31-133:33,ExpBox False),(133:51-133:57,ExpBox False),(133:59-133:60,ExpBox False),(133:47-133:60,ExpBox False),(132:35-132:35,ExpBox False),(132:24-132:35,ExpBox False),(132:48-132:48,ExpBox False),(132:37-132:48,ExpBox False),(132:61-132:61,ExpBox False),(132:50-132:61,ExpBox False),(132:23-132:62,ExpBox False),(132:22-133:61,ExpBox False),(132:15-133:61,ExpBox False),(132:5-133:61,ExpBox True),(136:26-136:60,ExpBox False),(136:20-136:60,ExpBox True),(130:1-136:60,TopLevelBox ["showBitmap"]),(127:14-127:28,ExpBox False),(127:38-127:40,ExpBox False),(127:33-127:40,ExpBox False),(127:45-127:47,ExpBox False),(127:57-127:58,ExpBox False),(127:52-127:58,ExpBox False),(127:63-127:71,ExpBox False),(127:52-127:71,ExpBox False),(127:45-127:71,ExpBox False),(127:33-127:71,ExpBox False),(127:14-127:71,ExpBox False),(127:5-127:71,LocalBox ["showBitmapA","header"]),(126:36-126:38,ExpBox False),(126:28-126:38,ExpBox False),(125:34-125:34,ExpBox False),(125:23-125:34,ExpBox False),(125:48-125:48,ExpBox False),(125:37-125:48,ExpBox False),(125:62-125:62,ExpBox False),(125:51-125:62,ExpBox False),(125:22-125:63,ExpBox False),(125:5-126:38,LocalBox ["showBitmapA","scaleColor"]),(123:5-123:10,ExpBox False),(123:25-123:34,ExpBox False),(123:43-123:45,ExpBox False),(123:36-123:46,ExpBox False),(123:15-123:46,ExpBox False),(123:5-123:46,ExpBox False),(122:1-127:71,TopLevelBox ["showBitmapA"]),(118:23-118:24,ExpBox False),(118:26-118:28,ExpBox False),(118:16-118:28,ExpBox False),(118:5-118:28,LocalBox ["illum","recCoeff"]),(105:18-105:18,ExpBox False),(105:29-105:29,ExpBox False),(105:37-105:41,ExpBox False),(105:43-105:43,ExpBox False),(105:33-105:43,ExpBox False),(105:28-105:44,ExpBox False),(105:46-105:50,ExpBox False),(105:20-105:51,ExpBox False),(105:12-105:51,ExpBox False),(105:5-105:51,LocalBox ["illum","newV"]),(119:29-119:31,ExpBox False),(119:34-119:36,ExpBox False),(119:38-119:41,ExpBox False),(119:33-119:42,ExpBox False),(119:16-119:42,ExpBox False),(119:5-119:42,LocalBox ["illum","recRay"]),(117:19-117:26,ExpBox False),(117:36-117:40,ExpBox False),(117:19-117:40,ExpBox False),(117:19-117:40,BinBox CondBinBox True),(117:19-117:40,BinBox CondBinBox False),(117:47-117:51,ExpBox True),(117:65-117:72,ExpBox False),(117:74-117:79,ExpBox False),(117:58-117:79,ExpBox True),(117:16-117:79,ExpBox False),(117:5-117:79,LocalBox ["illum","recTerm"]),(104:19-104:21,ExpBox False),(104:11-104:21,ExpBox False),(104:5-104:21,LocalBox ["illum","amb"]),(107:22-107:23,ExpBox False),(107:33-107:35,ExpBox False),(107:37-107:39,ExpBox False),(107:25-107:40,ExpBox False),(107:15-107:40,ExpBox False),(107:5-107:40,LocalBox ["illum","ambTerm"]),(103:15-103:17,ExpBox False),(103:9-103:17,ExpBox False),(103:5-103:17,LocalBox ["illum","d"]),(102:32-102:34,ExpBox False),(102:44-102:46,ExpBox False),(102:36-102:47,ExpBox False),(102:57-102:59,ExpBox False),(102:49-102:60,ExpBox False),(102:62-102:66,ExpBox False),(102:21-102:66,ExpBox False),(102:5-102:66,LocalBox ["illum","visibleLights"]),(108:22-108:23,ExpBox False),(109:36-109:48,ExpBox False),(110:35-110:57,ExpBox False),(110:25-110:57,ExpBox False),(110:20-110:57,LocalBox ["illum","difTerm","lj"]),(108:45-108:49,ExpBox False),(108:51-108:52,ExpBox False),(108:40-108:53,ExpBox False),(108:63-108:71,ExpBox False),(108:73-108:75,ExpBox False),(108:55-108:76,ExpBox False),(108:33-108:76,ExpBox False),(108:32-110:58,ExpBox False),(108:25-110:59,ExpBox False),(108:15-110:59,ExpBox False),(108:5-110:59,LocalBox ["illum","difTerm"]),(112:22-112:23,ExpBox False),(113:36-113:48,ExpBox False),(115:53-115:55,ExpBox False),(115:43-115:55,ExpBox False),(115:20-115:55,LocalBox ["illum","spcTerm","lj"]),(116:36-116:37,ExpBox False),(116:57-116:57,ExpBox False),(116:47-116:57,ExpBox False),(116:35-116:58,ExpBox False),(116:25-116:58,ExpBox False),(116:20-116:58,LocalBox ["illum","spcTerm","hj"]),(112:46-112:50,ExpBox False),(112:52-112:53,ExpBox False),(112:41-112:54,ExpBox False),(112:59-112:59,ExpBox False),(112:40-112:61,ExpBox False),(112:71-112:79,ExpBox False),(112:81-112:83,ExpBox False),(112:63-112:84,ExpBox False),(112:33-112:84,ExpBox False),(112:32-116:59,ExpBox False),(112:25-116:60,ExpBox False),(112:15-116:60,ExpBox False),(112:5-116:60,LocalBox ["illum","spcTerm"]),(100:5-100:11,ExpBox False),(100:21-100:27,ExpBox False),(100:5-100:27,ExpBox False),(100:37-100:43,ExpBox False),(100:5-100:43,ExpBox False),(100:53-100:59,ExpBox False),(100:5-100:59,ExpBox False),(99:1-119:42,TopLevelBox ["illum"]),(93:11-93:13,ExpBox False),(93:5-93:13,ExpBox False),(93:18-93:18,ExpBox False),(93:5-93:18,ExpBox False),(93:5-93:18,BinBox GuardBinBox True),(93:5-93:18,BinBox GuardBinBox False),(93:22-93:26,ExpBox True),(94:5-94:13,ExpBox False),(94:5-94:13,BinBox GuardBinBox True),(94:5-94:13,BinBox GuardBinBox False),(94:35-94:35,ExpBox False),(94:37-94:37,ExpBox False),(94:34-94:38,ExpBox False),(94:48-94:50,ExpBox False),(94:40-94:51,ExpBox False),(94:26-94:51,ExpBox False),(95:34-95:38,ExpBox True),(96:43-96:45,ExpBox False),(96:60-96:62,ExpBox False),(96:53-96:63,ExpBox False),(96:65-96:65,ExpBox False),(96:53-96:65,ExpBox False),(96:42-96:67,ExpBox False),(96:69-96:72,ExpBox False),(96:74-96:74,ExpBox False),(96:36-96:74,ExpBox True),(94:21-96:74,ExpBox True),(92:1-96:74,TopLevelBox ["illumination"]),(88:36-88:38,ExpBox False),(88:28-88:38,ExpBox False),(86:28-86:28,ExpBox False),(86:23-86:29,ExpBox False),(86:33-86:36,ExpBox False),(86:23-86:36,ExpBox False),(86:46-86:46,ExpBox False),(86:41-86:47,ExpBox False),(86:52-86:54,ExpBox False),(86:41-86:54,ExpBox False),(86:64-86:64,ExpBox False),(86:59-86:65,ExpBox False),(86:69-86:71,ExpBox False),(86:59-86:71,ExpBox False),(86:41-86:71,ExpBox False),(86:23-86:71,ExpBox False),(86:9-88:38,LocalBox ["contrast","diffMax"]),(85:15-85:17,ExpBox False),(85:22-85:22,ExpBox False),(85:25-85:25,ExpBox False),(85:21-85:26,ExpBox False),(85:15-85:26,ExpBox False),(85:9-85:26,LocalBox ["contrast","cur"]),(82:27-82:33,ExpBox False),(83:45-83:45,ExpBox False),(83:44-83:45,ExpBox False),(83:48-83:48,ExpBox False),(83:43-83:49,ExpBox False),(83:60-83:60,ExpBox False),(83:59-83:60,ExpBox False),(83:63-83:63,ExpBox False),(83:58-83:64,ExpBox False),(82:43-82:45,ExpBox False),(82:48-82:50,ExpBox False),(82:55-82:55,ExpBox False),(82:59-82:60,ExpBox False),(82:55-82:60,ExpBox False),(82:63-82:63,ExpBox False),(82:67-82:68,ExpBox False),(82:63-82:68,ExpBox False),(82:54-82:69,ExpBox False),(82:47-82:70,ExpBox False),(82:37-82:70,ExpBox False),(82:35-84:35,ExpBox False),(82:23-84:35,ExpBox False),(82:1-88:38,TopLevelBox ["contrast"]),(79:33-79:33,ExpBox False),(79:37-79:37,ExpBox False),(79:32-79:38,ExpBox False),(79:41-79:41,ExpBox False),(79:45-79:45,ExpBox False),(79:40-79:46,ExpBox False),(79:49-79:49,ExpBox False),(79:53-79:53,ExpBox False),(79:48-79:54,ExpBox False),(79:26-79:54,ExpBox False),(79:9-79:54,LocalBox ["avg","divN"]),(78:37-78:38,ExpBox False),(78:29-78:39,ExpBox False),(78:15-78:40,ExpBox False),(78:58-78:59,ExpBox False),(78:51-78:60,ExpBox False),(78:42-78:61,ExpBox False),(78:10-78:61,ExpBox False),(78:1-79:54,TopLevelBox ["avg"]),(68:27-68:28,ExpBox False),(68:14-68:28,ExpBox False),(68:45-68:47,ExpBox False),(68:32-68:47,ExpBox False),(68:14-68:47,ExpBox False),(68:5-68:47,LocalBox ["render","aspect"]),(66:14-66:14,ExpBox False),(66:23-66:25,ExpBox False),(66:27-66:27,ExpBox False),(66:22-66:28,ExpBox False),(66:18-66:28,ExpBox False),(66:14-66:28,ExpBox False),(66:5-66:28,LocalBox ["render","width"]),(67:14-67:18,ExpBox False),(67:35-67:37,ExpBox False),(67:22-67:37,ExpBox False),(67:14-67:37,ExpBox False),(67:5-67:37,LocalBox ["render","delta"]),(69:16-69:20,ExpBox False),(69:24-69:24,ExpBox False),(69:16-69:24,ExpBox False),(69:14-69:24,ExpBox False),(69:5-69:24,LocalBox ["render","left"]),(70:16-70:19,ExpBox False),(70:23-70:28,ExpBox False),(70:16-70:28,ExpBox False),(70:14-70:28,ExpBox False),(70:5-70:28,LocalBox ["render","top"]),(71:25-71:28,ExpBox False),(71:32-71:32,ExpBox False),(71:34-71:38,ExpBox False),(71:32-71:38,ExpBox False),(71:24-71:39,ExpBox False),(71:42-71:44,ExpBox False),(71:48-71:48,ExpBox False),(71:50-71:54,ExpBox False),(71:48-71:54,ExpBox False),(71:41-71:55,ExpBox False),(71:57-71:57,ExpBox False),(71:17-71:57,ExpBox False),(71:5-71:57,LocalBox ["render","pixel"]),(65:21-65:21,ExpBox False),(65:23-65:23,ExpBox False),(65:27-65:27,ExpBox False),(65:25-65:28,ExpBox False),(65:14-65:28,ExpBox False),(65:5-65:28,LocalBox ["render","start"]),(51:41-51:42,ExpBox False),(51:29-51:30,ExpBox False),(51:32-51:32,ExpBox False),(51:14-51:32,ExpBox False),(51:12-51:44,ExpBox False),(51:5-51:44,LocalBox ["render","ls'"]),(50:23-50:24,ExpBox False),(50:26-50:26,ExpBox False),(50:22-50:27,ExpBox False),(50:29-50:31,ExpBox False),(50:12-50:31,ExpBox False),(50:5-50:31,LocalBox ["render","obj'"]),(64:27-64:29,ExpBox False),(64:39-64:41,ExpBox False),(64:52-64:55,ExpBox False),(64:64-64:66,ExpBox False),(64:14-64:67,ExpBox False),(64:5-64:67,LocalBox ["render","cxt"]),(52:26-52:26,ExpBox False),(52:28-52:28,ExpBox False),(52:25-52:29,ExpBox False),(52:33-52:34,ExpBox False),(52:36-52:38,ExpBox False),(52:32-52:39,ExpBox False),(52:24-52:40,ExpBox False),(54:36-54:37,ExpBox False),(54:41-54:43,ExpBox False),(54:40-54:46,ExpBox False),(54:31-54:46,ExpBox False),(55:36-55:38,ExpBox False),(55:41-55:43,ExpBox False),(55:40-55:46,ExpBox False),(55:31-55:46,ExpBox False),(53:39-53:41,ExpBox False),(53:44-53:48,ExpBox False),(53:56-53:56,ExpBox False),(53:58-53:58,ExpBox False),(53:50-53:58,ExpBox False),(53:43-53:59,ExpBox False),(53:26-53:59,ExpBox False),(53:24-55:48,ExpBox False),(52:14-55:48,ExpBox False),(52:5-55:48,LocalBox ["render","pixelA"]),(62:26-62:27,ExpBox False),(62:30-62:32,ExpBox False),(62:29-62:35,ExpBox False),(62:21-62:35,ExpBox False),(61:64-61:66,ExpBox False),(61:69-61:71,ExpBox False),(61:68-61:74,ExpBox False),(61:59-61:74,ExpBox False),(61:31-61:33,ExpBox False),(61:36-61:40,ExpBox False),(61:48-61:48,ExpBox False),(61:50-61:50,ExpBox False),(61:42-61:50,ExpBox False),(61:35-61:51,ExpBox False),(61:18-61:51,ExpBox False),(61:16-61:76,ExpBox False),(61:14-63:14,ExpBox False),(61:5-63:14,LocalBox ["render","pixels"]),(73:30-73:32,ExpBox False),(73:36-73:38,ExpBox False),(75:24-75:28,ExpBox False),(75:23-75:28,ExpBox False),(75:31-75:33,ExpBox False),(75:22-75:34,ExpBox False),(75:38-75:42,ExpBox False),(75:45-75:47,ExpBox False),(75:37-75:48,ExpBox False),(75:52-75:54,ExpBox False),(75:58-75:62,ExpBox False),(75:57-75:62,ExpBox False),(75:51-75:63,ExpBox False),(75:67-75:69,ExpBox False),(75:72-75:76,ExpBox False),(75:66-75:77,ExpBox False),(75:21-75:78,ExpBox False),(74:22-74:24,ExpBox False),(74:27-74:31,ExpBox False),(74:54-74:54,ExpBox False),(74:41-74:54,ExpBox False),(74:58-74:60,ExpBox False),(74:41-74:60,ExpBox False),(74:64-74:65,ExpBox False),(74:40-74:66,ExpBox False),(74:82-74:82,ExpBox False),(74:69-74:82,ExpBox False),(74:86-74:88,ExpBox False),(74:69-74:88,ExpBox False),(74:92-74:93,ExpBox False),(74:68-74:94,ExpBox False),(74:34-74:94,ExpBox False),(74:26-74:95,ExpBox False),(74:9-74:95,ExpBox False),(74:7-76:7,ExpBox False),(73:36-76:7,ExpBox False),(73:30-76:7,ExpBox False),(73:5-76:7,LocalBox ["render","superSample"]),(56:14-56:19,ExpBox False),(58:22-58:22,ExpBox False),(58:27-58:28,ExpBox False),(58:32-58:32,ExpBox False),(58:27-58:32,ExpBox False),(58:21-58:33,ExpBox False),(58:42-58:42,ExpBox False),(58:47-58:49,ExpBox False),(58:53-58:53,ExpBox False),(58:47-58:53,ExpBox False),(58:41-58:54,ExpBox False),(59:26-59:26,ExpBox False),(59:29-59:29,ExpBox False),(59:25-59:30,ExpBox False),(59:20-59:30,LocalBox ["render","antiA","ix"]),(60:25-60:26,ExpBox False),(60:28-60:33,ExpBox False),(60:16-60:33,ExpBox False),(60:16-60:33,BinBox QualBinBox True),(60:16-60:33,BinBox QualBinBox False),(57:17-57:18,ExpBox False),(57:33-57:34,ExpBox False),(57:37-57:42,ExpBox False),(57:46-57:47,ExpBox False),(57:36-57:48,ExpBox False),(57:21-57:48,ExpBox False),(57:16-57:49,ExpBox False),(57:14-60:35,ExpBox False),(56:14-60:35,ExpBox False),(56:5-60:35,LocalBox ["render","antiA"]),(44:24-44:25,ExpBox False),(44:17-44:25,ExpBox False),(44:5-44:25,LocalBox ["render","debugging"]),(32:10-32:18,ExpBox False),(33:26-33:40,ExpBox False),(33:17-33:40,ExpBox False),(34:26-34:28,ExpBox False),(34:21-34:28,ExpBox False),(34:14-34:28,LocalBox ["render","vals"]),(35:36-35:38,ExpBox False),(35:40-35:41,ExpBox False),(35:43-35:48,ExpBox False),(35:24-35:48,ExpBox False),(35:14-35:48,LocalBox ["render","rt_vals"]),(36:20-36:23,ExpBox False),(36:13-36:23,ExpBox False),(36:35-36:41,ExpBox False),(36:28-36:41,ExpBox False),(36:13-36:41,ExpBox False),(36:13-36:41,BinBox CondBinBox True),(36:13-36:41,BinBox CondBinBox False),(37:24-37:35,ExpBox False),(37:44-37:47,ExpBox False),(37:37-37:47,ExpBox False),(37:56-37:62,ExpBox False),(37:49-37:62,ExpBox False),(37:23-37:63,ExpBox False),(37:17-37:63,ExpBox True),(39:59-39:59,ExpBox False),(39:63-39:63,ExpBox False),(39:58-39:64,ExpBox False),(39:54-39:64,ExpBox False),(39:73-39:73,ExpBox False),(39:77-39:77,ExpBox False),(39:72-39:78,ExpBox False),(39:68-39:78,ExpBox False),(39:54-39:78,ExpBox False),(39:44-39:79,ExpBox False),(39:81-39:84,ExpBox False),(39:86-39:92,ExpBox False),(39:35-39:93,ExpBox False),(39:32-39:93,ExpBox False),(39:26-39:93,LocalBox ["render","cmp"]),(40:22-40:26,ExpBox False),(40:33-40:35,ExpBox False),(40:48-40:51,ExpBox False),(40:41-40:51,ExpBox False),(40:55-40:56,ExpBox False),(40:40-40:57,ExpBox False),(40:33-40:57,ExpBox False),(40:33-40:57,BinBox CondBinBox True),(40:33-40:57,BinBox CondBinBox False),(40:64-40:77,ExpBox True),(40:85-40:96,ExpBox False),(40:106-40:108,ExpBox False),(40:101-40:108,ExpBox False),(40:84-40:109,ExpBox True),(40:30-40:109,ExpBox False),(40:22-40:109,ExpBox False),(38:17-41:20,ExpBox True),(36:10-41:20,ExpBox False),(32:5-41:21,ExpBox False),(31:1-76:7,TopLevelBox ["render"]),(159:13-159:16,TopLevelBox ["showsPrec"]),(159:13-159:16,TopLevelBox ["showList"]),(27:18-27:21,TopLevelBox ["showsPrec"]),(27:18-27:21,TopLevelBox ["showList"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Intersections.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Intersections.mix new file mode 100644 index 0000000000000000000000000000000000000000..a42b9bdfecafa222dd65b463be6c9e1dd5bb0e83 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Intersections.mix @@ -0,0 +1 @@ +Mix "./Intersections.hs" 2011-09-06 12:02:04 UTC 1674175314 8 [(404:26-404:28,ExpBox False),(404:24-404:29,ExpBox False),(404:31-404:33,ExpBox False),(404:15-404:33,ExpBox False),(404:1-404:33,TopLevelBox ["infInterval"]),(402:14-402:15,ExpBox False),(402:19-402:24,ExpBox False),(402:13-402:25,ExpBox False),(402:29-402:33,ExpBox False),(402:13-402:33,ExpBox False),(402:9-402:33,LocalBox ["intersectRayWithSlab","b"]),(401:14-401:15,ExpBox False),(401:19-401:24,ExpBox False),(401:13-401:25,ExpBox False),(401:29-401:33,ExpBox False),(401:13-401:33,ExpBox False),(401:9-401:33,LocalBox ["intersectRayWithSlab","a"]),(398:5-398:9,ExpBox False),(398:14-398:14,ExpBox False),(398:5-398:14,ExpBox False),(398:5-398:14,BinBox GuardBinBox True),(398:5-398:14,BinBox GuardBinBox False),(398:21-398:26,ExpBox False),(398:30-398:31,ExpBox False),(398:21-398:31,ExpBox False),(398:36-398:41,ExpBox False),(398:45-398:46,ExpBox False),(398:36-398:46,ExpBox False),(398:21-398:46,ExpBox False),(398:21-398:46,BinBox CondBinBox True),(398:21-398:46,BinBox CondBinBox False),(398:53-398:62,ExpBox True),(398:69-398:79,ExpBox True),(398:18-398:79,ExpBox True),(399:5-399:9,ExpBox False),(399:14-399:14,ExpBox False),(399:5-399:14,ExpBox False),(399:5-399:14,BinBox GuardBinBox True),(399:5-399:14,BinBox GuardBinBox False),(399:27-399:27,ExpBox False),(399:29-399:29,ExpBox False),(399:18-399:29,ExpBox True),(400:5-400:13,ExpBox False),(400:5-400:13,BinBox GuardBinBox True),(400:5-400:13,BinBox GuardBinBox False),(400:27-400:27,ExpBox False),(400:29-400:29,ExpBox False),(400:18-400:29,ExpBox True),(397:1-402:33,TopLevelBox ["intersectRayWithSlab"]),(389:34-389:43,ExpBox True),(390:34-390:43,ExpBox True),(392:5-392:5,ExpBox False),(392:9-392:9,ExpBox False),(392:5-392:9,ExpBox False),(392:14-392:14,ExpBox False),(392:18-392:18,ExpBox False),(392:14-392:18,ExpBox False),(392:5-392:18,ExpBox False),(392:5-392:18,BinBox GuardBinBox True),(392:5-392:18,BinBox GuardBinBox False),(392:22-392:31,ExpBox True),(393:5-393:13,ExpBox False),(393:5-393:13,BinBox GuardBinBox True),(393:5-393:13,BinBox GuardBinBox False),(393:27-393:27,ExpBox False),(393:35-393:35,ExpBox False),(393:26-393:36,ExpBox False),(393:39-393:39,ExpBox False),(393:47-393:47,ExpBox False),(393:38-393:48,ExpBox False),(393:17-393:48,ExpBox True),(389:1-393:48,TopLevelBox ["intersectInterval"]),(376:29-376:32,ExpBox True),(377:29-377:33,ExpBox True),(376:1-377:33,TopLevelBox ["isInterval"]),(384:51-384:51,ExpBox False),(384:43-384:52,ExpBox False),(384:66-384:66,ExpBox False),(384:54-384:67,ExpBox False),(384:70-384:71,ExpBox False),(384:74-384:75,ExpBox False),(384:69-384:76,ExpBox False),(384:22-384:76,ExpBox False),(384:9-384:76,LocalBox ["intersectWithBox","z_interval"]),(383:51-383:51,ExpBox False),(383:43-383:52,ExpBox False),(383:66-383:66,ExpBox False),(383:54-383:67,ExpBox False),(383:70-383:71,ExpBox False),(383:74-383:75,ExpBox False),(383:69-383:76,ExpBox False),(383:22-383:76,ExpBox False),(383:9-383:76,LocalBox ["intersectWithBox","y_interval"]),(382:51-382:51,ExpBox False),(382:43-382:52,ExpBox False),(382:66-382:66,ExpBox False),(382:54-382:67,ExpBox False),(382:70-382:71,ExpBox False),(382:74-382:75,ExpBox False),(382:69-382:76,ExpBox False),(382:22-382:76,ExpBox False),(382:9-382:76,LocalBox ["intersectWithBox","x_interval"]),(385:38-385:47,ExpBox False),(386:39-386:48,ExpBox False),(386:50-386:59,ExpBox False),(386:20-386:60,ExpBox False),(385:20-386:60,ExpBox False),(385:9-386:60,LocalBox ["intersectWithBox","interval"]),(381:16-381:23,ExpBox False),(381:5-381:23,ExpBox False),(380:1-386:60,TopLevelBox ["intersectWithBox"]),(359:14-359:14,ExpBox False),(359:11-359:14,ExpBox False),(359:18-359:18,ExpBox False),(359:22-359:22,ExpBox False),(359:18-359:22,ExpBox False),(359:26-359:26,ExpBox False),(359:18-359:26,ExpBox False),(359:11-359:26,ExpBox False),(359:7-359:26,LocalBox ["quadratic","d"]),(360:15-360:15,ExpBox False),(360:24-360:24,ExpBox False),(360:15-360:24,ExpBox False),(360:15-360:24,BinBox CondBinBox True),(360:15-360:24,BinBox CondBinBox False),(360:31-360:31,ExpBox True),(360:38-360:38,ExpBox True),(360:12-360:38,ExpBox False),(360:7-360:38,LocalBox ["quadratic","d'"]),(361:9-361:10,ExpBox False),(361:14-361:14,ExpBox False),(361:9-361:14,ExpBox False),(361:9-361:14,BinBox CondBinBox True),(361:9-361:14,BinBox CondBinBox False),(362:11-362:17,ExpBox True),(364:12-364:12,ExpBox False),(364:16-364:16,ExpBox False),(364:12-364:16,ExpBox False),(364:12-364:16,BinBox CondBinBox True),(364:12-364:16,BinBox CondBinBox False),(364:32-364:32,ExpBox False),(364:30-364:33,ExpBox False),(364:42-364:43,ExpBox False),(364:37-364:43,ExpBox False),(364:29-364:44,ExpBox False),(364:49-364:49,ExpBox False),(364:53-364:53,ExpBox False),(364:48-364:54,ExpBox False),(364:29-364:54,ExpBox False),(365:32-365:32,ExpBox False),(365:30-365:33,ExpBox False),(365:42-365:43,ExpBox False),(365:37-365:43,ExpBox False),(365:29-365:44,ExpBox False),(365:49-365:49,ExpBox False),(365:53-365:53,ExpBox False),(365:48-365:54,ExpBox False),(365:29-365:54,ExpBox False),(364:28-365:55,ExpBox False),(364:23-365:55,ExpBox True),(366:32-366:32,ExpBox False),(366:30-366:33,ExpBox False),(366:42-366:43,ExpBox False),(366:37-366:43,ExpBox False),(366:29-366:44,ExpBox False),(366:49-366:49,ExpBox False),(366:53-366:53,ExpBox False),(366:48-366:54,ExpBox False),(366:29-366:54,ExpBox False),(367:32-367:32,ExpBox False),(367:30-367:33,ExpBox False),(367:42-367:43,ExpBox False),(367:37-367:43,ExpBox False),(367:29-367:44,ExpBox False),(367:49-367:49,ExpBox False),(367:53-367:53,ExpBox False),(367:48-367:54,ExpBox False),(367:29-367:54,ExpBox False),(366:28-367:55,ExpBox False),(366:23-367:55,ExpBox True),(364:9-367:55,ExpBox True),(359:3-367:55,ExpBox False),(357:1-367:55,TopLevelBox ["quadratic"]),(348:23-348:23,ExpBox True),(349:27-349:27,ExpBox False),(349:23-349:27,ExpBox True),(348:9-349:27,LocalBox ["intersectConeSide","xor"]),(345:24-345:24,ExpBox False),(345:13-345:24,ExpBox False),(345:9-345:24,LocalBox ["intersectConeSide","c"]),(344:24-344:24,ExpBox False),(344:13-344:24,ExpBox False),(344:9-344:24,LocalBox ["intersectConeSide","b"]),(343:24-343:24,ExpBox False),(343:13-343:24,ExpBox False),(343:9-343:24,LocalBox ["intersectConeSide","a"]),(342:20-342:20,ExpBox False),(342:13-342:20,ExpBox False),(342:9-342:20,LocalBox ["intersectConeSide","z"]),(341:20-341:20,ExpBox False),(341:13-341:20,ExpBox False),(341:9-341:20,LocalBox ["intersectConeSide","y"]),(340:20-340:20,ExpBox False),(340:13-340:20,ExpBox False),(340:9-340:20,LocalBox ["intersectConeSide","x"]),(335:24-335:24,ExpBox False),(335:28-335:28,ExpBox False),(335:32-335:32,ExpBox False),(335:28-335:32,ExpBox False),(335:24-335:32,ExpBox False),(335:19-335:32,LocalBox ["intersectConeSide","g","z0"]),(334:24-334:24,ExpBox False),(334:28-334:28,ExpBox False),(334:32-334:32,ExpBox False),(334:28-334:32,ExpBox False),(334:24-334:32,ExpBox False),(334:19-334:32,LocalBox ["intersectConeSide","g","y0"]),(333:24-333:24,ExpBox False),(333:28-333:28,ExpBox False),(333:32-333:32,ExpBox False),(333:28-333:32,ExpBox False),(333:24-333:32,ExpBox False),(333:19-333:32,LocalBox ["intersectConeSide","g","x0"]),(336:31-336:32,ExpBox False),(336:34-336:35,ExpBox False),(336:37-336:38,ExpBox False),(336:24-336:38,ExpBox False),(336:19-336:38,LocalBox ["intersectConeSide","g","p0"]),(337:24-337:32,ExpBox False),(337:43-337:44,ExpBox False),(337:48-337:49,ExpBox False),(337:46-337:50,ExpBox False),(337:52-337:53,ExpBox False),(337:36-337:53,ExpBox False),(337:24-337:53,ExpBox False),(337:19-337:53,LocalBox ["intersectConeSide","g","v0"]),(338:39-338:40,ExpBox False),(338:30-338:40,ExpBox False),(332:34-332:34,ExpBox False),(332:36-332:36,ExpBox False),(332:38-332:38,ExpBox False),(332:28-332:38,ExpBox False),(332:19-332:38,LocalBox ["intersectConeSide","g","origin"]),(331:16-331:16,ExpBox False),(331:26-331:31,ExpBox False),(331:33-331:34,ExpBox False),(331:36-331:37,ExpBox False),(331:20-331:37,ExpBox False),(331:41-331:48,ExpBox False),(331:51-331:52,ExpBox False),(331:55-331:61,ExpBox False),(331:40-331:62,ExpBox False),(331:19-331:63,ExpBox False),(331:15-331:64,ExpBox False),(331:9-338:40,LocalBox ["intersectConeSide","g"]),(315:17-315:17,ExpBox False),(315:14-315:17,ExpBox False),(315:24-315:24,ExpBox False),(315:21-315:24,ExpBox False),(315:14-315:24,ExpBox False),(315:31-315:31,ExpBox False),(315:28-315:31,ExpBox False),(315:14-315:31,ExpBox False),(315:9-315:31,LocalBox ["intersectConeSide","c3"]),(314:14-314:14,ExpBox False),(314:19-314:19,ExpBox False),(314:23-314:23,ExpBox False),(314:19-314:23,ExpBox False),(314:27-314:27,ExpBox False),(314:31-314:31,ExpBox False),(314:27-314:31,ExpBox False),(314:19-314:31,ExpBox False),(314:35-314:35,ExpBox False),(314:39-314:39,ExpBox False),(314:35-314:39,ExpBox False),(314:18-314:40,ExpBox False),(314:14-314:40,ExpBox False),(314:9-314:40,LocalBox ["intersectConeSide","c2"]),(313:17-313:17,ExpBox False),(313:14-313:17,ExpBox False),(313:24-313:24,ExpBox False),(313:21-313:24,ExpBox False),(313:14-313:24,ExpBox False),(313:31-313:31,ExpBox False),(313:28-313:31,ExpBox False),(313:14-313:31,ExpBox False),(313:9-313:31,LocalBox ["intersectConeSide","c1"]),(316:24-316:25,ExpBox False),(316:27-316:28,ExpBox False),(316:30-316:31,ExpBox False),(316:14-316:31,ExpBox False),(317:20-317:29,ExpBox True),(325:22-325:22,ExpBox False),(325:26-325:27,ExpBox False),(325:31-325:31,ExpBox False),(325:26-325:31,ExpBox False),(325:22-325:31,ExpBox False),(325:17-325:31,LocalBox ["intersectConeSide","y2"]),(324:22-324:22,ExpBox False),(324:26-324:27,ExpBox False),(324:31-324:31,ExpBox False),(324:26-324:31,ExpBox False),(324:22-324:31,ExpBox False),(324:17-324:31,LocalBox ["intersectConeSide","y1"]),(326:20-326:21,ExpBox False),(326:30-326:30,ExpBox False),(326:20-326:30,ExpBox False),(326:20-326:30,BinBox CondBinBox True),(326:20-326:30,BinBox CondBinBox False),(326:67-326:68,ExpBox False),(326:64-326:69,ExpBox False),(326:74-326:75,ExpBox False),(326:71-326:76,ExpBox False),(326:54-326:76,ExpBox True),(327:25-327:26,ExpBox False),(327:35-327:35,ExpBox False),(327:25-327:35,ExpBox False),(327:25-327:35,BinBox CondBinBox True),(327:25-327:35,BinBox CondBinBox False),(327:67-327:68,ExpBox False),(327:64-327:69,ExpBox False),(327:74-327:75,ExpBox False),(327:71-327:76,ExpBox False),(327:54-327:76,ExpBox True),(328:26-328:27,ExpBox False),(328:31-328:31,ExpBox False),(328:25-328:32,ExpBox False),(328:41-328:42,ExpBox False),(328:46-328:46,ExpBox False),(328:40-328:47,ExpBox False),(328:25-328:47,ExpBox False),(328:25-328:47,BinBox CondBinBox True),(328:25-328:47,BinBox CondBinBox False),(328:67-328:68,ExpBox False),(328:64-328:69,ExpBox False),(328:74-328:75,ExpBox False),(328:71-328:76,ExpBox False),(328:54-328:76,ExpBox True),(329:67-329:68,ExpBox False),(329:64-329:69,ExpBox False),(329:74-329:75,ExpBox False),(329:71-329:76,ExpBox False),(329:54-329:76,ExpBox True),(328:22-329:76,ExpBox True),(327:22-329:76,ExpBox True),(324:13-329:76,ExpBox True),(313:5-329:76,ExpBox False),(307:1-349:27,TopLevelBox ["intersectConeSide"]),(292:24-292:24,ExpBox False),(292:13-292:24,ExpBox False),(292:9-292:24,LocalBox ["intersectCylSide","c"]),(291:24-291:24,ExpBox False),(291:13-291:24,ExpBox False),(291:9-291:24,LocalBox ["intersectCylSide","b"]),(290:24-290:24,ExpBox False),(290:13-290:24,ExpBox False),(290:9-290:24,LocalBox ["intersectCylSide","a"]),(289:20-289:20,ExpBox False),(289:13-289:20,ExpBox False),(289:9-289:20,LocalBox ["intersectCylSide","z"]),(288:20-288:20,ExpBox False),(288:13-288:20,ExpBox False),(288:9-288:20,LocalBox ["intersectCylSide","y"]),(287:20-287:20,ExpBox False),(287:13-287:20,ExpBox False),(287:9-287:20,LocalBox ["intersectCylSide","x"]),(282:24-282:24,ExpBox False),(282:28-282:28,ExpBox False),(282:32-282:32,ExpBox False),(282:28-282:32,ExpBox False),(282:24-282:32,ExpBox False),(282:19-282:32,LocalBox ["intersectCylSide","g","z0"]),(281:24-281:24,ExpBox False),(281:28-281:28,ExpBox False),(281:32-281:32,ExpBox False),(281:28-281:32,ExpBox False),(281:24-281:32,ExpBox False),(281:19-281:32,LocalBox ["intersectCylSide","g","y0"]),(280:24-280:24,ExpBox False),(280:28-280:28,ExpBox False),(280:32-280:32,ExpBox False),(280:28-280:32,ExpBox False),(280:24-280:32,ExpBox False),(280:19-280:32,LocalBox ["intersectCylSide","g","x0"]),(283:31-283:32,ExpBox False),(283:34-283:35,ExpBox False),(283:37-283:38,ExpBox False),(283:24-283:38,ExpBox False),(283:19-283:38,LocalBox ["intersectCylSide","g","p0"]),(284:31-284:32,ExpBox False),(284:34-284:34,ExpBox False),(284:36-284:37,ExpBox False),(284:24-284:37,ExpBox False),(284:19-284:37,LocalBox ["intersectCylSide","g","v0"]),(285:39-285:40,ExpBox False),(285:30-285:40,ExpBox False),(279:34-279:34,ExpBox False),(279:36-279:36,ExpBox False),(279:38-279:38,ExpBox False),(279:28-279:38,ExpBox False),(279:19-279:38,LocalBox ["intersectCylSide","g","origin"]),(278:16-278:16,ExpBox False),(278:32-278:37,ExpBox False),(278:39-278:40,ExpBox False),(278:42-278:43,ExpBox False),(278:20-278:43,ExpBox False),(278:47-278:58,ExpBox False),(278:61-278:62,ExpBox False),(278:65-278:71,ExpBox False),(278:46-278:72,ExpBox False),(278:19-278:73,ExpBox False),(278:15-278:74,ExpBox False),(278:9-285:40,LocalBox ["intersectCylSide","g"]),(277:19-277:19,ExpBox False),(277:16-277:19,ExpBox False),(277:26-277:26,ExpBox False),(277:23-277:26,ExpBox False),(277:16-277:26,ExpBox False),(277:9-277:26,LocalBox ["intersectCylSide","sqxy"]),(263:12-263:12,ExpBox False),(263:9-263:12,ExpBox False),(263:19-263:19,ExpBox False),(263:16-263:19,ExpBox False),(263:8-263:20,ExpBox False),(263:29-263:29,ExpBox False),(263:8-263:29,ExpBox False),(263:8-263:29,BinBox CondBinBox True),(263:8-263:29,BinBox CondBinBox False),(266:13-266:16,ExpBox False),(266:25-266:27,ExpBox False),(266:13-266:27,ExpBox False),(266:32-266:35,ExpBox False),(266:39-266:41,ExpBox False),(266:32-266:41,ExpBox False),(266:12-266:42,ExpBox False),(266:12-266:42,BinBox CondBinBox True),(266:12-266:42,BinBox CondBinBox False),(266:49-266:57,ExpBox True),(266:64-266:73,ExpBox True),(266:9-266:73,ExpBox True),(271:21-271:21,ExpBox False),(271:18-271:21,ExpBox False),(271:28-271:28,ExpBox False),(271:25-271:28,ExpBox False),(271:18-271:28,ExpBox False),(271:32-271:32,ExpBox False),(271:18-271:32,ExpBox False),(271:13-271:32,LocalBox ["intersectCylSide","c3"]),(270:18-270:18,ExpBox False),(270:23-270:23,ExpBox False),(270:27-270:27,ExpBox False),(270:23-270:27,ExpBox False),(270:31-270:31,ExpBox False),(270:35-270:35,ExpBox False),(270:31-270:35,ExpBox False),(270:22-270:36,ExpBox False),(270:18-270:36,ExpBox False),(270:13-270:36,LocalBox ["intersectCylSide","c2"]),(269:21-269:21,ExpBox False),(269:18-269:21,ExpBox False),(269:28-269:28,ExpBox False),(269:25-269:28,ExpBox False),(269:18-269:28,ExpBox False),(269:13-269:28,LocalBox ["intersectCylSide","c1"]),(273:24-273:25,ExpBox False),(273:27-273:28,ExpBox False),(273:30-273:31,ExpBox False),(273:14-273:31,ExpBox False),(274:20-274:29,ExpBox True),(275:39-275:40,ExpBox False),(275:36-275:41,ExpBox False),(275:46-275:47,ExpBox False),(275:43-275:48,ExpBox False),(275:26-275:48,ExpBox True),(269:9-275:48,ExpBox True),(263:5-275:48,ExpBox False),(259:1-292:24,TopLevelBox ["intersectCylSide"]),(232:38-232:44,ExpBox True),(233:38-233:44,ExpBox True),(234:38-234:44,ExpBox True),(242:13-242:13,ExpBox False),(242:22-242:22,ExpBox False),(242:13-242:22,ExpBox False),(242:13-242:22,BinBox GuardBinBox True),(242:13-242:22,BinBox GuardBinBox False),(242:32-242:33,ExpBox False),(242:37-242:37,ExpBox False),(242:40-242:40,ExpBox False),(242:44-242:50,ExpBox False),(242:40-242:50,ExpBox False),(242:36-242:51,ExpBox False),(242:31-242:52,ExpBox False),(242:26-242:52,ExpBox True),(243:13-243:13,ExpBox False),(243:22-243:22,ExpBox False),(243:13-243:22,ExpBox False),(243:13-243:22,BinBox GuardBinBox True),(243:13-243:22,BinBox GuardBinBox False),(243:31-243:34,ExpBox False),(243:26-243:34,ExpBox True),(244:13-244:21,ExpBox False),(244:13-244:21,BinBox GuardBinBox True),(244:13-244:21,BinBox GuardBinBox False),(244:26-244:32,ExpBox True),(240:9-244:32,LocalBox ["intersectSlabIval","checkInterval"]),(239:17-239:18,ExpBox False),(239:22-239:23,ExpBox False),(239:17-239:23,ExpBox False),(239:17-239:23,BinBox CondBinBox True),(239:17-239:23,BinBox CondBinBox False),(239:30-239:32,ExpBox True),(239:39-239:41,ExpBox True),(239:14-239:41,ExpBox False),(239:9-239:41,LocalBox ["intersectSlabIval","mv"]),(238:17-238:18,ExpBox False),(238:22-238:23,ExpBox False),(238:17-238:23,ExpBox False),(238:17-238:23,BinBox CondBinBox True),(238:17-238:23,BinBox CondBinBox False),(238:30-238:32,ExpBox True),(238:39-238:41,ExpBox True),(238:14-238:41,ExpBox False),(238:9-238:41,LocalBox ["intersectSlabIval","nu"]),(237:20-237:21,ExpBox False),(237:24-237:25,ExpBox False),(237:19-237:26,ExpBox False),(237:5-237:26,ExpBox True),(232:1-244:32,TopLevelBox ["intersectSlabIval"]),(227:5-227:5,ExpBox False),(227:14-227:14,ExpBox False),(227:5-227:14,ExpBox False),(227:5-227:14,BinBox GuardBinBox True),(227:5-227:14,BinBox GuardBinBox False),(227:22-227:22,ExpBox False),(227:27-227:27,ExpBox False),(227:21-227:28,ExpBox False),(227:34-227:34,ExpBox False),(227:39-227:39,ExpBox False),(227:33-227:40,ExpBox False),(227:21-227:40,ExpBox False),(227:21-227:40,BinBox CondBinBox True),(227:21-227:40,BinBox CondBinBox False),(228:30-228:30,ExpBox False),(228:34-228:36,ExpBox False),(228:33-228:36,ExpBox False),(228:29-228:37,ExpBox False),(228:41-228:41,ExpBox False),(228:44-228:46,ExpBox False),(228:40-228:47,ExpBox False),(228:28-228:48,ExpBox False),(228:23-228:48,ExpBox True),(228:55-228:61,ExpBox True),(227:18-228:61,ExpBox True),(229:5-229:5,ExpBox False),(229:9-229:9,ExpBox False),(229:5-229:9,ExpBox False),(229:5-229:9,BinBox GuardBinBox True),(229:5-229:9,BinBox GuardBinBox False),(229:25-229:25,ExpBox False),(229:31-229:31,ExpBox False),(229:29-229:32,ExpBox False),(229:34-229:34,ExpBox False),(229:29-229:34,ExpBox False),(229:24-229:35,ExpBox False),(229:39-229:39,ExpBox False),(229:43-229:43,ExpBox False),(229:45-229:45,ExpBox False),(229:42-229:46,ExpBox False),(229:48-229:48,ExpBox False),(229:42-229:48,ExpBox False),(229:38-229:49,ExpBox False),(229:23-229:50,ExpBox False),(229:18-229:50,ExpBox True),(230:5-230:13,ExpBox False),(230:5-230:13,BinBox GuardBinBox True),(230:5-230:13,BinBox GuardBinBox False),(230:25-230:25,ExpBox False),(230:29-230:29,ExpBox False),(230:31-230:31,ExpBox False),(230:28-230:32,ExpBox False),(230:34-230:34,ExpBox False),(230:28-230:34,ExpBox False),(230:24-230:35,ExpBox False),(230:39-230:39,ExpBox False),(230:45-230:45,ExpBox False),(230:43-230:46,ExpBox False),(230:48-230:48,ExpBox False),(230:43-230:48,ExpBox False),(230:38-230:49,ExpBox False),(230:23-230:50,ExpBox False),(230:18-230:50,ExpBox True),(226:1-230:50,TopLevelBox ["intersectCubeSlab"]),(224:24-224:24,ExpBox False),(224:13-224:24,ExpBox False),(224:9-224:24,LocalBox ["intersectCube","c"]),(223:24-223:24,ExpBox False),(223:13-223:24,ExpBox False),(223:9-223:24,LocalBox ["intersectCube","b"]),(222:24-222:24,ExpBox False),(222:13-222:24,ExpBox False),(222:9-222:24,LocalBox ["intersectCube","a"]),(221:20-221:20,ExpBox False),(221:13-221:20,ExpBox False),(221:9-221:20,LocalBox ["intersectCube","z"]),(220:20-220:20,ExpBox False),(220:13-220:20,ExpBox False),(220:9-220:20,LocalBox ["intersectCube","y"]),(219:20-219:20,ExpBox False),(219:13-219:20,ExpBox False),(219:9-219:20,LocalBox ["intersectCube","x"]),(218:26-218:26,ExpBox False),(218:28-218:28,ExpBox False),(218:30-218:30,ExpBox False),(218:19-218:30,ExpBox False),(218:9-218:30,LocalBox ["intersectCube","vectorZ"]),(217:26-217:26,ExpBox False),(217:28-217:28,ExpBox False),(217:30-217:30,ExpBox False),(217:19-217:30,ExpBox False),(217:9-217:30,LocalBox ["intersectCube","vectorY"]),(216:26-216:26,ExpBox False),(216:28-216:28,ExpBox False),(216:30-216:30,ExpBox False),(216:19-216:30,ExpBox False),(216:9-216:30,LocalBox ["intersectCube","vectorX"]),(215:18-215:27,ExpBox False),(215:30-215:36,ExpBox False),(215:39-215:45,ExpBox False),(215:17-215:46,ExpBox False),(215:9-215:46,LocalBox ["intersectCube","face5"]),(214:18-214:24,ExpBox False),(214:30-214:36,ExpBox False),(214:39-214:45,ExpBox False),(214:17-214:46,ExpBox False),(214:9-214:46,LocalBox ["intersectCube","face4"]),(213:18-213:26,ExpBox False),(213:30-213:36,ExpBox False),(213:39-213:45,ExpBox False),(213:17-213:46,ExpBox False),(213:9-213:46,LocalBox ["intersectCube","face3"]),(212:18-212:25,ExpBox False),(212:30-212:36,ExpBox False),(212:39-212:45,ExpBox False),(212:17-212:46,ExpBox False),(212:9-212:46,LocalBox ["intersectCube","face2"]),(211:18-211:25,ExpBox False),(211:30-211:36,ExpBox False),(211:39-211:45,ExpBox False),(211:17-211:46,ExpBox False),(211:9-211:46,LocalBox ["intersectCube","face1"]),(210:18-210:26,ExpBox False),(210:30-210:36,ExpBox False),(210:39-210:45,ExpBox False),(210:17-210:46,ExpBox False),(210:9-210:46,LocalBox ["intersectCube","face0"]),(209:36-209:38,ExpBox False),(209:40-209:40,ExpBox False),(209:22-209:40,ExpBox False),(209:17-209:40,LocalBox ["intersectCube","g","p0"]),(208:14-208:14,ExpBox False),(208:25-208:26,ExpBox False),(208:28-208:29,ExpBox False),(208:31-208:32,ExpBox False),(208:18-208:32,ExpBox False),(208:36-208:36,ExpBox False),(208:39-208:40,ExpBox False),(208:43-208:49,ExpBox False),(208:35-208:50,ExpBox False),(208:17-208:51,ExpBox False),(208:13-208:52,ExpBox False),(207:9-209:40,LocalBox ["intersectCube","g"]),(202:47-202:51,ExpBox False),(202:53-202:57,ExpBox False),(202:59-202:59,ExpBox False),(202:61-202:61,ExpBox False),(202:28-202:62,ExpBox False),(203:47-203:51,ExpBox False),(203:53-203:57,ExpBox False),(203:59-203:59,ExpBox False),(203:61-203:61,ExpBox False),(203:28-203:62,ExpBox False),(204:47-204:51,ExpBox False),(204:53-204:57,ExpBox False),(204:59-204:59,ExpBox False),(204:61-204:61,ExpBox False),(204:28-204:62,ExpBox False),(203:9-204:63,ExpBox False),(202:10-204:63,ExpBox False),(205:16-205:25,ExpBox True),(206:35-206:36,ExpBox False),(206:32-206:37,ExpBox False),(206:42-206:43,ExpBox False),(206:39-206:44,ExpBox False),(206:22-206:44,ExpBox True),(202:5-206:44,ExpBox False),(196:1-224:24,TopLevelBox ["intersectCube"]),(180:26-180:26,ExpBox False),(180:15-180:26,ExpBox False),(180:11-180:26,LocalBox ["intersectSphere","c"]),(179:26-179:26,ExpBox False),(179:15-179:26,ExpBox False),(179:11-179:26,LocalBox ["intersectSphere","b"]),(178:26-178:26,ExpBox False),(178:15-178:26,ExpBox False),(178:11-178:26,LocalBox ["intersectSphere","a"]),(177:22-177:22,ExpBox False),(177:15-177:22,ExpBox False),(177:11-177:22,LocalBox ["intersectSphere","z"]),(176:22-176:22,ExpBox False),(176:15-176:22,ExpBox False),(176:11-176:22,LocalBox ["intersectSphere","y"]),(175:22-175:22,ExpBox False),(175:15-175:22,ExpBox False),(175:11-175:22,LocalBox ["intersectSphere","x"]),(185:26-185:26,ExpBox False),(185:30-185:30,ExpBox False),(185:34-185:34,ExpBox False),(185:30-185:34,ExpBox False),(185:26-185:34,ExpBox False),(185:21-185:34,LocalBox ["intersectSphere","g","z0"]),(184:26-184:26,ExpBox False),(184:30-184:30,ExpBox False),(184:34-184:34,ExpBox False),(184:30-184:34,ExpBox False),(184:26-184:34,ExpBox False),(184:21-184:34,LocalBox ["intersectSphere","g","y0"]),(183:26-183:26,ExpBox False),(183:30-183:30,ExpBox False),(183:34-183:34,ExpBox False),(183:30-183:34,ExpBox False),(183:26-183:34,ExpBox False),(183:21-183:34,LocalBox ["intersectSphere","g","x0"]),(186:33-186:34,ExpBox False),(186:36-186:37,ExpBox False),(186:39-186:40,ExpBox False),(186:26-186:40,ExpBox False),(186:21-186:40,LocalBox ["intersectSphere","g","p0"]),(187:33-187:34,ExpBox False),(187:36-187:37,ExpBox False),(187:39-187:40,ExpBox False),(187:26-187:40,ExpBox False),(187:21-187:40,LocalBox ["intersectSphere","g","v0"]),(188:41-188:42,ExpBox False),(188:32-188:42,ExpBox False),(182:36-182:36,ExpBox False),(182:38-182:38,ExpBox False),(182:40-182:40,ExpBox False),(182:30-182:40,ExpBox False),(182:21-182:40,LocalBox ["intersectSphere","g","origin"]),(181:18-181:18,ExpBox False),(181:32-181:37,ExpBox False),(181:39-181:40,ExpBox False),(181:42-181:43,ExpBox False),(181:22-181:43,ExpBox False),(181:47-181:56,ExpBox False),(181:59-181:60,ExpBox False),(181:63-181:69,ExpBox False),(181:46-181:70,ExpBox False),(181:21-181:71,ExpBox False),(181:17-181:72,ExpBox False),(181:11-188:42,LocalBox ["intersectSphere","g"]),(170:17-170:17,ExpBox False),(170:14-170:17,ExpBox False),(170:24-170:24,ExpBox False),(170:21-170:24,ExpBox False),(170:14-170:24,ExpBox False),(170:31-170:31,ExpBox False),(170:28-170:31,ExpBox False),(170:14-170:31,ExpBox False),(170:35-170:35,ExpBox False),(170:14-170:35,ExpBox False),(170:9-170:35,LocalBox ["intersectSphere","c3"]),(169:14-169:14,ExpBox False),(169:19-169:19,ExpBox False),(169:23-169:23,ExpBox False),(169:19-169:23,ExpBox False),(169:27-169:27,ExpBox False),(169:31-169:31,ExpBox False),(169:27-169:31,ExpBox False),(169:19-169:31,ExpBox False),(169:35-169:35,ExpBox False),(169:39-169:39,ExpBox False),(169:35-169:39,ExpBox False),(169:18-169:40,ExpBox False),(169:14-169:40,ExpBox False),(169:9-169:40,LocalBox ["intersectSphere","c2"]),(168:17-168:17,ExpBox False),(168:14-168:17,ExpBox False),(168:24-168:24,ExpBox False),(168:21-168:24,ExpBox False),(168:14-168:24,ExpBox False),(168:31-168:31,ExpBox False),(168:28-168:31,ExpBox False),(168:14-168:31,ExpBox False),(168:9-168:31,LocalBox ["intersectSphere","c1"]),(172:24-172:25,ExpBox False),(172:27-172:28,ExpBox False),(172:30-172:31,ExpBox False),(172:14-172:31,ExpBox False),(173:20-173:29,ExpBox True),(174:39-174:40,ExpBox False),(174:36-174:41,ExpBox False),(174:46-174:47,ExpBox False),(174:43-174:48,ExpBox False),(174:26-174:48,ExpBox True),(168:5-174:48,ExpBox False),(162:1-188:42,TopLevelBox ["intersectSphere"]),(154:24-154:24,ExpBox False),(154:13-154:24,ExpBox False),(154:9-154:24,LocalBox ["intersectXZPlane","c"]),(153:24-153:24,ExpBox False),(153:13-153:24,ExpBox False),(153:9-153:24,LocalBox ["intersectXZPlane","b"]),(152:24-152:24,ExpBox False),(152:13-152:24,ExpBox False),(152:9-152:24,LocalBox ["intersectXZPlane","a"]),(151:20-151:20,ExpBox False),(151:13-151:20,ExpBox False),(151:9-151:20,LocalBox ["intersectXZPlane","z"]),(150:20-150:20,ExpBox False),(150:13-150:20,ExpBox False),(150:9-150:20,LocalBox ["intersectXZPlane","y"]),(149:20-149:20,ExpBox False),(149:13-149:20,ExpBox False),(149:9-149:20,LocalBox ["intersectXZPlane","x"]),(147:21-147:21,ExpBox False),(147:23-147:23,ExpBox False),(147:25-147:25,ExpBox False),(147:14-147:25,ExpBox False),(147:9-147:25,LocalBox ["intersectXZPlane","v1"]),(146:21-146:21,ExpBox False),(146:23-146:23,ExpBox False),(146:25-146:25,ExpBox False),(146:14-146:25,ExpBox False),(146:9-146:25,LocalBox ["intersectXZPlane","v0"]),(142:15-142:21,ExpBox False),(142:23-142:23,ExpBox False),(142:14-142:24,ExpBox False),(142:28-142:28,ExpBox False),(142:14-142:28,ExpBox False),(142:9-142:28,LocalBox ["intersectXZPlane","t0"]),(143:14-143:14,ExpBox False),(143:18-143:18,ExpBox False),(143:22-143:23,ExpBox False),(143:18-143:23,ExpBox False),(143:14-143:23,ExpBox False),(143:9-143:23,LocalBox ["intersectXZPlane","x0"]),(144:14-144:14,ExpBox False),(144:18-144:18,ExpBox False),(144:22-144:23,ExpBox False),(144:18-144:23,ExpBox False),(144:14-144:23,ExpBox False),(144:9-144:23,LocalBox ["intersectXZPlane","z0"]),(145:20-145:21,ExpBox False),(145:23-145:23,ExpBox False),(145:25-145:26,ExpBox False),(145:14-145:26,ExpBox False),(145:9-145:26,LocalBox ["intersectXZPlane","p0"]),(127:5-127:5,ExpBox False),(127:14-127:14,ExpBox False),(127:5-127:14,ExpBox False),(127:5-127:14,BinBox GuardBinBox True),(127:5-127:14,BinBox GuardBinBox False),(129:8-129:8,ExpBox False),(129:17-129:23,ExpBox False),(129:8-129:23,ExpBox False),(129:28-129:28,ExpBox False),(129:32-129:38,ExpBox False),(129:28-129:38,ExpBox False),(129:8-129:38,ExpBox False),(129:8-129:38,BinBox CondBinBox True),(129:8-129:38,BinBox CondBinBox False),(129:45-129:53,ExpBox True),(129:60-129:69,ExpBox True),(129:5-129:69,ExpBox True),(136:5-136:5,ExpBox False),(136:9-136:9,ExpBox False),(136:5-136:9,ExpBox False),(136:5-136:9,BinBox GuardBinBox True),(136:5-136:9,BinBox GuardBinBox False),(137:6-137:10,ExpBox False),(137:23-137:24,ExpBox False),(137:35-137:36,ExpBox False),(137:38-137:39,ExpBox False),(137:41-137:42,ExpBox False),(137:28-137:42,ExpBox False),(137:46-137:46,ExpBox False),(137:49-137:50,ExpBox False),(137:53-137:59,ExpBox False),(137:45-137:60,ExpBox False),(137:27-137:61,ExpBox False),(137:22-137:62,ExpBox False),(137:14-137:62,ExpBox False),(137:13-137:63,ExpBox False),(137:66-137:69,ExpBox False),(137:5-137:70,ExpBox True),(139:5-139:13,ExpBox False),(139:5-139:13,BinBox GuardBinBox True),(139:5-139:13,BinBox GuardBinBox False),(140:6-140:9,ExpBox False),(140:22-140:23,ExpBox False),(140:34-140:35,ExpBox False),(140:37-140:38,ExpBox False),(140:40-140:41,ExpBox False),(140:27-140:41,ExpBox False),(140:45-140:45,ExpBox False),(140:48-140:49,ExpBox False),(140:52-140:58,ExpBox False),(140:44-140:59,ExpBox False),(140:26-140:60,ExpBox False),(140:21-140:61,ExpBox False),(140:14-140:61,ExpBox False),(140:13-140:62,ExpBox False),(140:66-140:70,ExpBox False),(140:5-140:71,ExpBox True),(126:1-154:24,TopLevelBox ["intersectXZPlane"]),(123:47-123:55,ExpBox False),(123:57-123:59,ExpBox False),(123:61-123:63,ExpBox False),(123:65-123:71,ExpBox False),(123:30-123:71,ExpBox False),(123:1-123:71,TopLevelBox ["intersectPlane"]),(97:22-97:22,ExpBox False),(97:24-97:25,ExpBox False),(97:15-97:25,ExpBox False),(97:9-97:25,LocalBox ["transformSurface","v1'"]),(96:22-96:22,ExpBox False),(96:24-96:25,ExpBox False),(96:15-96:25,ExpBox False),(96:9-96:25,LocalBox ["transformSurface","v0'"]),(95:22-95:22,ExpBox False),(95:24-95:25,ExpBox False),(95:15-95:25,ExpBox False),(95:9-95:25,LocalBox ["transformSurface","p0'"]),(94:12-94:14,ExpBox False),(94:16-94:18,ExpBox False),(94:20-94:22,ExpBox False),(94:5-94:22,ExpBox True),(103:22-103:22,ExpBox False),(103:24-103:25,ExpBox False),(103:15-103:25,ExpBox False),(103:9-103:25,LocalBox ["transformSurface","v1'"]),(102:22-102:22,ExpBox False),(102:24-102:25,ExpBox False),(102:15-102:25,ExpBox False),(102:9-102:25,LocalBox ["transformSurface","v0'"]),(101:22-101:22,ExpBox False),(101:24-101:25,ExpBox False),(101:15-101:25,ExpBox False),(101:9-101:25,LocalBox ["transformSurface","p0'"]),(100:15-100:17,ExpBox False),(100:19-100:21,ExpBox False),(100:23-100:25,ExpBox False),(100:5-100:25,ExpBox True),(110:22-110:22,ExpBox False),(110:24-110:25,ExpBox False),(110:15-110:25,ExpBox False),(110:9-110:25,LocalBox ["transformSurface","v1'"]),(109:22-109:22,ExpBox False),(109:24-109:25,ExpBox False),(109:15-109:25,ExpBox False),(109:9-109:25,LocalBox ["transformSurface","v0'"]),(108:22-108:22,ExpBox False),(108:24-108:25,ExpBox False),(108:15-108:25,ExpBox False),(108:9-108:25,LocalBox ["transformSurface","p0'"]),(107:17-107:19,ExpBox False),(107:21-107:23,ExpBox False),(107:25-107:27,ExpBox False),(107:5-107:27,ExpBox True),(116:22-116:22,ExpBox False),(116:24-116:25,ExpBox False),(116:15-116:25,ExpBox False),(116:9-116:25,LocalBox ["transformSurface","v1'"]),(115:22-115:22,ExpBox False),(115:24-115:25,ExpBox False),(115:15-115:25,ExpBox False),(115:9-115:25,LocalBox ["transformSurface","v0'"]),(114:22-114:22,ExpBox False),(114:24-114:25,ExpBox False),(114:15-114:25,ExpBox False),(114:9-114:25,LocalBox ["transformSurface","p0'"]),(113:11-113:13,ExpBox False),(113:15-113:17,ExpBox False),(113:19-113:21,ExpBox False),(113:5-113:21,ExpBox True),(93:1-116:25,TopLevelBox ["transformSurface"]),(85:12-85:13,ExpBox False),(85:15-85:16,ExpBox False),(85:18-85:19,ExpBox False),(85:5-85:19,ExpBox True),(87:15-87:16,ExpBox False),(87:18-87:19,ExpBox False),(87:21-87:22,ExpBox False),(87:5-87:22,ExpBox True),(89:17-89:18,ExpBox False),(89:20-89:21,ExpBox False),(89:23-89:24,ExpBox False),(89:5-89:24,ExpBox True),(91:11-91:12,ExpBox False),(91:14-91:15,ExpBox False),(91:17-91:18,ExpBox False),(91:5-91:18,ExpBox True),(84:1-91:18,TopLevelBox ["negateSurface"]),(82:34-82:34,ExpBox False),(82:37-82:37,ExpBox False),(82:55-82:55,ExpBox False),(82:41-82:55,ExpBox False),(82:58-82:58,ExpBox False),(82:40-82:59,ExpBox False),(82:33-82:60,ExpBox False),(82:9-82:60,LocalBox ["negateSurfaces","negSurf"]),(81:23-81:29,ExpBox False),(81:18-81:29,ExpBox False),(81:1-82:60,TopLevelBox ["negateSurfaces"]),(256:23-256:41,ExpBox False),(256:45-256:58,ExpBox False),(257:40-257:53,ExpBox False),(257:55-257:57,ExpBox False),(257:59-257:61,ExpBox False),(257:63-257:69,ExpBox False),(257:23-257:69,ExpBox False),(256:45-257:69,ExpBox False),(256:23-257:69,ExpBox False),(256:9-257:69,LocalBox ["intersectCylinder","isectBottom"]),(255:40-255:50,ExpBox False),(255:52-255:54,ExpBox False),(255:56-255:58,ExpBox False),(255:60-255:66,ExpBox False),(255:23-255:66,ExpBox False),(255:9-255:66,LocalBox ["intersectCylinder","isectTop"]),(254:40-254:42,ExpBox False),(254:44-254:50,ExpBox False),(254:23-254:50,ExpBox False),(254:9-254:50,LocalBox ["intersectCylinder","isectSide"]),(253:5-253:13,ExpBox False),(253:36-253:43,ExpBox False),(253:5-253:43,ExpBox False),(253:66-253:76,ExpBox False),(253:5-253:76,ExpBox False),(252:1-257:69,TopLevelBox ["intersectCylinder"]),(304:23-304:41,ExpBox False),(304:45-304:58,ExpBox False),(305:40-305:47,ExpBox False),(305:49-305:51,ExpBox False),(305:53-305:55,ExpBox False),(305:57-305:63,ExpBox False),(305:23-305:63,ExpBox False),(304:45-305:63,ExpBox False),(304:23-305:63,ExpBox False),(304:9-305:63,LocalBox ["intersectCone","isectBottom"]),(303:40-303:47,ExpBox False),(303:49-303:51,ExpBox False),(303:53-303:55,ExpBox False),(303:57-303:63,ExpBox False),(303:23-303:63,ExpBox False),(303:9-303:63,LocalBox ["intersectCone","isectTop"]),(302:41-302:43,ExpBox False),(302:45-302:51,ExpBox False),(302:23-302:51,ExpBox False),(302:9-302:51,LocalBox ["intersectCone","isectSide"]),(301:5-301:13,ExpBox False),(301:36-301:43,ExpBox False),(301:5-301:43,ExpBox False),(301:66-301:76,ExpBox False),(301:5-301:76,ExpBox False),(300:1-305:63,TopLevelBox ["intersectCone"]),(44:28-44:30,ExpBox False),(44:32-44:32,ExpBox False),(44:14-44:32,ExpBox False),(44:9-44:32,LocalBox ["intersections","js"]),(43:28-43:30,ExpBox False),(43:32-43:32,ExpBox False),(43:14-43:32,ExpBox False),(43:9-43:32,LocalBox ["intersections","is"]),(42:20-42:21,ExpBox False),(42:23-42:24,ExpBox False),(42:5-42:24,ExpBox True),(49:28-49:30,ExpBox False),(49:32-49:32,ExpBox False),(49:14-49:32,ExpBox False),(49:9-49:32,LocalBox ["intersections","js"]),(48:28-48:30,ExpBox False),(48:32-48:32,ExpBox False),(48:14-48:32,ExpBox False),(48:9-48:32,LocalBox ["intersections","is"]),(47:24-47:25,ExpBox False),(47:27-47:28,ExpBox False),(47:5-47:28,ExpBox True),(54:28-54:30,ExpBox False),(54:32-54:32,ExpBox False),(54:14-54:32,ExpBox False),(54:9-54:32,LocalBox ["intersections","js"]),(53:28-53:30,ExpBox False),(53:32-53:32,ExpBox False),(53:14-53:32,ExpBox False),(53:9-53:32,LocalBox ["intersections","is"]),(52:25-52:26,ExpBox False),(52:44-52:45,ExpBox False),(52:28-52:46,ExpBox False),(52:5-52:46,ExpBox True),(59:36-59:36,ExpBox False),(59:39-59:39,ExpBox False),(59:60-59:60,ExpBox False),(59:62-59:62,ExpBox False),(59:43-59:62,ExpBox False),(59:65-59:66,ExpBox False),(59:42-59:67,ExpBox False),(59:35-59:68,ExpBox False),(59:9-59:68,LocalBox ["intersections","xform"]),(58:29-58:30,ExpBox False),(58:41-58:43,ExpBox False),(58:28-58:44,ExpBox False),(58:46-58:46,ExpBox False),(58:14-58:46,ExpBox False),(58:9-58:46,LocalBox ["intersections","is"]),(57:17-57:17,ExpBox False),(57:10-57:18,ExpBox False),(57:20-57:21,ExpBox False),(57:5-57:21,ExpBox True),(62:22-62:24,ExpBox False),(62:26-62:28,ExpBox False),(62:5-62:28,ExpBox False),(62:5-62:28,BinBox GuardBinBox True),(62:5-62:28,BinBox GuardBinBox False),(62:46-62:48,ExpBox False),(62:50-62:50,ExpBox False),(62:32-62:50,ExpBox True),(63:5-63:13,ExpBox False),(63:5-63:13,BinBox GuardBinBox True),(63:5-63:13,BinBox GuardBinBox False),(63:17-63:26,ExpBox True),(66:20-66:22,ExpBox False),(66:24-66:24,ExpBox False),(66:5-66:24,ExpBox True),(69:21-69:23,ExpBox False),(69:25-69:25,ExpBox False),(69:5-69:25,ExpBox True),(72:19-72:21,ExpBox False),(72:23-72:23,ExpBox False),(72:5-72:23,ExpBox True),(75:23-75:25,ExpBox False),(75:27-75:27,ExpBox False),(75:5-75:27,ExpBox True),(78:19-78:21,ExpBox False),(78:23-78:23,ExpBox False),(78:5-78:23,ExpBox True),(41:1-78:23,TopLevelBox ["intersections"]),(27:36-27:40,ExpBox False),(27:45-27:45,ExpBox False),(27:48-27:51,ExpBox False),(27:54-27:62,ExpBox False),(27:44-27:63,ExpBox False),(27:43-27:64,ExpBox False),(27:67-27:70,ExpBox False),(27:35-27:71,ExpBox True),(28:43-28:47,ExpBox True),(30:5-30:5,ExpBox False),(30:14-30:14,ExpBox False),(30:5-30:14,ExpBox False),(30:19-30:19,ExpBox False),(30:23-30:23,ExpBox False),(30:19-30:23,ExpBox False),(30:5-30:23,ExpBox False),(30:5-30:23,BinBox GuardBinBox True),(30:5-30:23,BinBox GuardBinBox False),(31:21-31:25,ExpBox False),(31:28-31:30,ExpBox False),(31:33-31:38,ExpBox False),(31:20-31:39,ExpBox False),(31:5-31:39,ExpBox True),(32:5-32:13,ExpBox False),(32:5-32:13,BinBox GuardBinBox True),(32:5-32:13,BinBox GuardBinBox False),(33:6-33:10,ExpBox False),(33:14-33:14,ExpBox False),(33:17-33:20,ExpBox False),(33:23-33:31,ExpBox False),(33:13-33:32,ExpBox False),(33:36-33:37,ExpBox False),(33:13-33:37,ExpBox False),(33:40-33:45,ExpBox False),(33:5-33:46,ExpBox True),(35:5-35:5,ExpBox False),(35:14-35:14,ExpBox False),(35:5-35:14,ExpBox False),(35:19-35:19,ExpBox False),(35:23-35:23,ExpBox False),(35:19-35:23,ExpBox False),(35:5-35:23,ExpBox False),(35:5-35:23,BinBox GuardBinBox True),(35:5-35:23,BinBox GuardBinBox False),(37:21-37:24,ExpBox False),(37:27-37:29,ExpBox False),(37:32-37:37,ExpBox False),(37:20-37:38,ExpBox False),(37:5-37:38,ExpBox True),(38:5-38:13,ExpBox False),(38:5-38:13,BinBox GuardBinBox True),(38:5-38:13,BinBox GuardBinBox False),(39:5-39:9,ExpBox True),(27:1-39:9,TopLevelBox ["clampIntervals"]),(25:28-25:30,ExpBox False),(25:32-25:32,ExpBox False),(25:14-25:32,ExpBox False),(25:9-25:32,LocalBox ["intersectRayWithObject","is"]),(24:20-24:21,ExpBox False),(24:5-24:21,ExpBox False),(23:1-25:32,TopLevelBox ["intersectRayWithObject"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Interval.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Interval.mix new file mode 100644 index 0000000000000000000000000000000000000000..5f1d32a64e9089489fd8b3dfa2be94502d838f63 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Interval.mix @@ -0,0 +1 @@ +Mix "./Interval.hs" 2011-06-30 14:14:25 UTC 238116040 8 [(94:10-94:11,ExpBox False),(94:6-94:11,ExpBox False),(94:57-94:58,ExpBox False),(94:17-94:17,ExpBox False),(94:24-94:30,ExpBox False),(94:20-94:30,ExpBox False),(94:33-94:33,ExpBox False),(94:16-94:34,ExpBox False),(94:14-94:60,ExpBox False),(94:67-94:68,ExpBox False),(94:63-94:68,ExpBox False),(94:5-94:69,ExpBox False),(93:1-94:69,TopLevelBox ["complementIntervals"]),(62:13-62:17,ExpBox True),(63:27-63:27,ExpBox False),(63:32-63:32,ExpBox False),(63:27-63:32,ExpBox False),(63:42-63:42,ExpBox False),(63:44-63:45,ExpBox False),(63:37-63:45,ExpBox False),(63:27-63:45,ExpBox True),(62:1-63:45,TopLevelBox ["bad'"]),(58:20-58:21,ExpBox False),(58:26-58:27,ExpBox False),(58:20-58:27,ExpBox True),(60:27-60:28,ExpBox False),(60:22-60:28,ExpBox False),(59:25-59:26,ExpBox False),(59:28-59:29,ExpBox False),(59:20-59:29,ExpBox False),(59:34-59:35,ExpBox False),(59:40-59:41,ExpBox False),(59:34-59:41,ExpBox False),(59:20-59:41,ExpBox True),(58:1-60:28,TopLevelBox ["bad"]),(54:5-54:5,ExpBox False),(54:14-54:14,ExpBox False),(54:5-54:14,ExpBox False),(54:5-54:14,BinBox GuardBinBox True),(54:5-54:14,BinBox GuardBinBox False),(54:18-54:19,ExpBox True),(55:5-55:5,ExpBox False),(55:14-55:14,ExpBox False),(55:5-55:14,ExpBox False),(55:5-55:14,BinBox GuardBinBox True),(55:5-55:14,BinBox GuardBinBox False),(55:18-55:19,ExpBox True),(56:5-56:13,ExpBox False),(56:5-56:13,BinBox GuardBinBox True),(56:5-56:13,BinBox GuardBinBox False),(56:18-56:19,ExpBox True),(53:1-56:19,TopLevelBox ["cmpI"]),(44:19-44:19,ExpBox False),(44:22-44:26,ExpBox False),(44:29-44:29,ExpBox False),(44:18-44:30,ExpBox False),(44:1-44:30,TopLevelBox ["mkExit"]),(43:19-43:19,ExpBox False),(43:22-43:25,ExpBox False),(43:29-43:29,ExpBox False),(43:18-43:30,ExpBox False),(43:1-43:30,TopLevelBox ["mkEntry"]),(46:20-46:24,ExpBox False),(46:36-46:37,ExpBox False),(46:28-46:37,ExpBox False),(46:47-46:48,ExpBox False),(46:40-46:48,ExpBox False),(46:27-46:49,ExpBox False),(46:52-46:56,ExpBox False),(46:19-46:57,ExpBox False),(46:1-46:57,TopLevelBox ["entryexit"]),(48:35-48:36,ExpBox False),(48:40-48:41,ExpBox False),(48:35-48:41,ExpBox False),(48:35-48:41,BinBox GuardBinBox True),(48:35-48:41,BinBox GuardBinBox False),(48:57-48:58,ExpBox False),(48:60-48:61,ExpBox False),(48:47-48:61,ExpBox True),(49:35-49:43,ExpBox False),(49:35-49:43,BinBox GuardBinBox True),(49:35-49:43,BinBox GuardBinBox False),(49:57-49:58,ExpBox False),(49:60-49:61,ExpBox False),(49:47-49:61,ExpBox True),(48:1-49:61,TopLevelBox ["arrange"]),(47:20-47:23,ExpBox False),(47:34-47:35,ExpBox False),(47:27-47:35,ExpBox False),(47:46-47:47,ExpBox False),(47:38-47:47,ExpBox False),(47:26-47:48,ExpBox False),(47:51-47:54,ExpBox False),(47:19-47:55,ExpBox False),(47:1-47:55,TopLevelBox ["exitentry"]),(41:29-41:33,ExpBox False),(41:25-41:33,ExpBox False),(41:1-41:33,TopLevelBox ["isExit"]),(40:25-40:29,ExpBox False),(40:1-40:29,TopLevelBox ["isEntry"]),(68:30-68:38,ExpBox False),(68:30-68:38,BinBox GuardBinBox True),(68:30-68:38,BinBox GuardBinBox False),(68:42-68:43,ExpBox True),(69:30-69:38,ExpBox False),(69:30-69:38,BinBox GuardBinBox True),(69:30-69:38,BinBox GuardBinBox False),(69:42-69:43,ExpBox True),(70:30-70:38,ExpBox False),(70:30-70:38,BinBox GuardBinBox True),(70:30-70:38,BinBox GuardBinBox False),(70:42-70:43,ExpBox True),(71:30-71:38,ExpBox False),(71:30-71:38,BinBox GuardBinBox True),(71:30-71:38,BinBox GuardBinBox False),(71:42-71:43,ExpBox True),(73:23-73:23,ExpBox False),(73:25-73:25,ExpBox False),(73:18-73:25,ExpBox False),(74:30-74:30,ExpBox False),(74:22-74:30,ExpBox False),(74:43-74:43,ExpBox False),(74:35-74:43,ExpBox False),(74:22-74:43,ExpBox False),(74:22-74:43,BinBox CondBinBox True),(74:22-74:43,BinBox CondBinBox False),(74:50-74:50,ExpBox False),(74:67-74:69,ExpBox False),(74:71-74:73,ExpBox False),(74:54-74:73,ExpBox False),(74:50-74:73,ExpBox True),(75:63-75:65,ExpBox False),(75:67-75:69,ExpBox False),(75:50-75:69,ExpBox True),(74:19-75:69,ExpBox True),(76:30-76:30,ExpBox False),(76:22-76:30,ExpBox False),(76:22-76:30,BinBox CondBinBox True),(76:22-76:30,BinBox CondBinBox False),(76:37-76:37,ExpBox False),(76:54-76:56,ExpBox False),(76:58-76:59,ExpBox False),(76:41-76:59,ExpBox False),(76:37-76:59,ExpBox True),(77:54-77:56,ExpBox False),(77:58-77:59,ExpBox False),(77:41-77:59,ExpBox True),(76:19-77:59,ExpBox True),(78:30-78:30,ExpBox False),(78:22-78:30,ExpBox False),(78:22-78:30,BinBox CondBinBox True),(78:22-78:30,BinBox CondBinBox False),(78:37-78:37,ExpBox False),(78:54-78:55,ExpBox False),(78:57-78:59,ExpBox False),(78:41-78:59,ExpBox False),(78:37-78:59,ExpBox True),(79:54-79:55,ExpBox False),(79:57-79:59,ExpBox False),(79:41-79:59,ExpBox True),(78:19-79:59,ExpBox True),(73:13-79:59,ExpBox True),(68:9-79:59,LocalBox ["unionIntervals","uniIntervals"]),(67:6-67:16,ExpBox False),(67:21-67:31,ExpBox False),(67:6-67:31,ExpBox False),(67:47-67:48,ExpBox False),(67:50-67:51,ExpBox False),(67:34-67:51,ExpBox False),(67:54-67:62,ExpBox False),(67:67-67:75,ExpBox False),(67:54-67:75,ExpBox False),(67:5-67:76,ExpBox False),(66:1-79:59,TopLevelBox ["unionIntervals"]),(85:35-85:36,ExpBox False),(85:15-85:36,ExpBox False),(85:9-85:36,LocalBox ["intersectIntervals","js'"]),(84:35-84:36,ExpBox False),(84:15-84:36,ExpBox False),(84:9-84:36,LocalBox ["intersectIntervals","is'"]),(83:41-83:43,ExpBox False),(83:45-83:47,ExpBox False),(83:25-83:48,ExpBox False),(83:5-83:48,ExpBox False),(82:1-85:36,TopLevelBox ["intersectIntervals"]),(90:35-90:36,ExpBox False),(90:15-90:36,ExpBox False),(90:9-90:36,LocalBox ["differenceIntervals","is'"]),(89:41-89:43,ExpBox False),(89:45-89:46,ExpBox False),(89:25-89:47,ExpBox False),(89:5-89:47,ExpBox False),(88:1-90:36,TopLevelBox ["differenceIntervals"]),(38:24-38:25,ExpBox False),(38:32-38:32,ExpBox False),(38:34-38:35,ExpBox False),(38:28-38:35,ExpBox False),(38:38-38:39,ExpBox False),(38:23-38:40,ExpBox False),(38:1-38:40,TopLevelBox ["mapI"]),(36:14-36:17,ExpBox False),(36:20-36:21,ExpBox False),(36:24-36:27,ExpBox False),(36:13-36:28,ExpBox False),(36:1-36:28,TopLevelBox ["openIList"]),(35:15-35:19,ExpBox False),(35:22-35:23,ExpBox False),(35:26-35:30,ExpBox False),(35:14-35:31,ExpBox False),(35:1-35:31,TopLevelBox ["emptyIList"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Main.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Main.mix new file mode 100644 index 0000000000000000000000000000000000000000..f1d37648a3ffc37c50e2658c26dad8eca62e6aef --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Main.mix @@ -0,0 +1 @@ +Mix "Main.hs" 2011-09-06 12:02:04 UTC 1310345646 8 [(13:29-13:40,ExpBox False),(13:20-13:40,ExpBox False),(14:32-14:34,ExpBox False),(14:22-14:35,ExpBox False),(14:13-14:35,ExpBox False),(13:8-15:11,ExpBox False),(13:1-15:11,TopLevelBox ["main"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Misc.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Misc.mix new file mode 100644 index 0000000000000000000000000000000000000000..166bd90684544f7a25435d538f58f77afb567260 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Misc.mix @@ -0,0 +1 @@ +Mix "./Misc.hs" 2011-06-30 14:14:25 UTC 1840720397 8 [(10:20-10:20,ExpBox False),(10:24-10:28,ExpBox False),(10:37-10:37,ExpBox False),(10:32-10:37,ExpBox False),(10:42-10:45,ExpBox False),(10:32-10:45,ExpBox False),(10:24-10:45,ExpBox False),(10:19-10:46,ExpBox False),(10:48-10:48,ExpBox False),(10:13-10:48,ExpBox False),(10:1-10:48,TopLevelBox ["debug"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Parse.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Parse.mix new file mode 100644 index 0000000000000000000000000000000000000000..e5def3ccb726f3a7133411f0097a59eb5ef1d82a --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Parse.mix @@ -0,0 +1 @@ +Mix "./Parse.hs" 2011-09-06 12:02:04 UTC 501961473 8 [(105:24-105:26,ExpBox False),(105:17-105:26,ExpBox False),(106:34-106:41,ExpBox False),(106:26-106:42,ExpBox False),(106:17-106:42,ExpBox False),(107:24-107:25,ExpBox False),(107:17-107:25,ExpBox False),(105:13-108:15,ExpBox False),(104:9-108:15,LocalBox ["whiteSpace","oneLineComment"]),(103:40-103:50,ExpBox False),(103:33-103:51,ExpBox False),(103:23-103:51,ExpBox False),(103:9-103:51,LocalBox ["whiteSpace","simpleSpace"]),(102:25-102:35,ExpBox False),(102:41-102:54,ExpBox False),(102:25-102:54,ExpBox False),(102:60-102:61,ExpBox False),(102:24-102:62,ExpBox False),(102:15-102:62,ExpBox False),(102:1-108:15,TopLevelBox ["whiteSpace"]),(100:21-100:21,ExpBox False),(100:24-100:33,ExpBox False),(100:43-100:43,ExpBox False),(100:36-100:43,ExpBox False),(100:12-100:46,ExpBox False),(100:1-100:46,TopLevelBox ["lexeme"]),(98:30-98:33,ExpBox False),(98:22-98:34,ExpBox False),(98:15-98:34,ExpBox False),(98:1-98:34,TopLevelBox ["symbol"]),(96:30-96:32,ExpBox False),(96:22-96:33,ExpBox False),(96:43-96:45,ExpBox False),(96:35-96:46,ExpBox False),(96:48-96:48,ExpBox False),(96:14-96:48,ExpBox False),(96:1-96:48,TopLevelBox ["brackets"]),(95:30-95:32,ExpBox False),(95:22-95:33,ExpBox False),(95:43-95:45,ExpBox False),(95:35-95:46,ExpBox False),(95:48-95:48,ExpBox False),(95:14-95:48,ExpBox False),(95:1-95:48,TopLevelBox ["braces"]),(89:18-89:19,ExpBox False),(89:29-89:31,ExpBox False),(89:21-89:32,ExpBox False),(89:11-89:32,ExpBox False),(89:1-89:32,TopLevelBox ["optSign"]),(86:17-86:21,ExpBox False),(86:11-86:21,ExpBox False),(86:1-86:21,TopLevelBox ["decimal"]),(79:13-79:15,ExpBox False),(80:19-80:22,ExpBox False),(80:13-80:22,ExpBox False),(81:13-81:19,ExpBox False),(82:13-82:19,ExpBox False),(83:16-83:16,ExpBox False),(83:18-83:18,ExpBox False),(83:23-83:23,ExpBox False),(83:18-83:23,ExpBox False),(83:15-83:24,ExpBox False),(83:8-83:24,ExpBox False),(80:3-84:6,ExpBox False),(79:13-84:6,ExpBox False),(79:1-84:6,TopLevelBox ["exponent'"]),(64:10-64:15,ExpBox False),(65:13-65:19,ExpBox False),(66:13-66:19,ExpBox False),(67:24-67:26,ExpBox False),(67:17-67:26,ExpBox False),(68:22-68:28,ExpBox False),(69:29-69:30,ExpBox False),(69:32-69:40,ExpBox False),(69:22-69:40,ExpBox False),(70:38-70:38,ExpBox False),(70:43-70:43,ExpBox False),(70:48-70:50,ExpBox False),(70:55-70:55,ExpBox False),(70:60-70:60,ExpBox False),(70:55-70:60,ExpBox False),(70:48-70:60,ExpBox False),(70:43-70:60,ExpBox False),(70:37-70:61,ExpBox False),(70:31-70:62,ExpBox False),(70:24-70:63,ExpBox False),(70:17-70:63,ExpBox False),(67:12-71:15,ExpBox False),(72:22-72:30,ExpBox False),(73:38-73:38,ExpBox False),(73:43-73:43,ExpBox False),(73:48-73:51,ExpBox False),(73:56-73:56,ExpBox False),(73:48-73:56,ExpBox False),(73:43-73:56,ExpBox False),(73:37-73:57,ExpBox False),(73:31-73:58,ExpBox False),(73:24-73:59,ExpBox False),(73:17-73:59,ExpBox False),(72:12-74:15,ExpBox False),(75:37-75:37,ExpBox False),(75:42-75:42,ExpBox False),(75:36-75:43,ExpBox False),(75:30-75:44,ExpBox False),(75:24-75:45,ExpBox False),(75:17-75:45,ExpBox False),(75:12-75:47,ExpBox False),(72:12-75:47,ExpBox False),(67:12-75:47,ExpBox False),(65:3-76:6,ExpBox False),(64:10-76:6,ExpBox False),(64:1-76:6,TopLevelBox ["number"]),(55:15-55:33,ExpBox False),(56:15-56:79,ExpBox False),(57:15-57:59,ExpBox False),(58:15-58:50,ExpBox False),(59:15-59:68,ExpBox False),(58:15-59:68,ExpBox False),(57:15-59:68,ExpBox False),(56:15-59:68,ExpBox False),(55:15-59:68,ExpBox False),(55:1-59:68,TopLevelBox ["test_number"]),(51:13-51:18,ExpBox False),(51:36-51:38,ExpBox False),(51:30-51:39,ExpBox False),(51:47-51:49,ExpBox False),(51:41-51:50,ExpBox False),(51:82-51:82,ExpBox False),(51:74-51:82,ExpBox False),(51:87-51:87,ExpBox False),(51:92-51:94,ExpBox False),(51:87-51:94,ExpBox False),(51:74-51:94,ExpBox False),(51:67-51:95,ExpBox False),(51:58-51:96,ExpBox False),(51:52-51:97,ExpBox False),(51:22-51:97,ExpBox False),(51:13-51:97,ExpBox False),(51:1-51:97,TopLevelBox ["gmlString"]),(44:9-44:14,ExpBox False),(45:13-45:18,ExpBox False),(46:46-46:46,ExpBox False),(46:35-46:46,ExpBox False),(46:51-46:51,ExpBox False),(46:56-46:58,ExpBox False),(46:51-46:58,ExpBox False),(46:63-46:63,ExpBox False),(46:68-46:70,ExpBox False),(46:63-46:70,ExpBox False),(46:51-46:70,ExpBox False),(46:35-46:70,ExpBox False),(46:28-46:71,ExpBox False),(46:19-46:72,ExpBox False),(46:14-46:72,ExpBox False),(47:16-47:16,ExpBox False),(47:18-47:19,ExpBox False),(47:15-47:20,ExpBox False),(47:8-47:20,ExpBox False),(45:3-48:6,ExpBox False),(44:9-48:6,ExpBox False),(44:1-48:6,TopLevelBox ["ident"]),(37:14-37:18,ExpBox False),(38:21-38:22,ExpBox False),(38:24-38:30,ExpBox False),(38:13-38:31,ExpBox False),(39:22-39:27,ExpBox False),(39:22-39:27,BinBox CondBinBox True),(39:22-39:27,BinBox CondBinBox False),(39:48-39:49,ExpBox False),(39:41-39:50,ExpBox False),(39:34-39:50,ExpBox True),(39:69-39:70,ExpBox False),(39:64-39:71,ExpBox False),(39:57-39:71,ExpBox True),(39:19-39:71,ExpBox True),(40:22-40:27,ExpBox False),(40:22-40:27,BinBox CondBinBox True),(40:22-40:27,BinBox CondBinBox False),(40:41-40:76,ExpBox False),(40:81-40:82,ExpBox False),(40:40-40:83,ExpBox False),(40:34-40:83,ExpBox True),(40:97-40:97,ExpBox False),(40:90-40:97,ExpBox True),(40:19-40:97,ExpBox True),(38:8-40:97,ExpBox False),(37:3-41:6,ExpBox False),(36:1-41:6,TopLevelBox ["pident"]),(27:28-27:36,ExpBox False),(27:19-27:36,ExpBox False),(27:63-27:64,ExpBox False),(27:56-27:65,ExpBox False),(27:49-27:65,ExpBox False),(27:8-27:67,ExpBox False),(28:28-28:36,ExpBox False),(28:19-28:36,ExpBox False),(28:64-28:65,ExpBox False),(28:56-28:66,ExpBox False),(28:49-28:66,ExpBox False),(28:8-28:68,ExpBox False),(29:19-29:27,ExpBox False),(29:65-29:65,ExpBox False),(29:56-29:66,ExpBox False),(29:49-29:66,ExpBox False),(29:8-29:68,ExpBox False),(29:74-29:81,ExpBox False),(29:7-29:82,ExpBox False),(30:25-30:29,ExpBox False),(30:18-30:29,ExpBox False),(30:56-30:56,ExpBox False),(30:49-30:56,ExpBox False),(30:8-30:58,ExpBox False),(30:74-30:85,ExpBox False),(30:7-30:86,ExpBox False),(31:18-31:20,ExpBox False),(31:13-31:20,ExpBox False),(32:25-32:28,ExpBox False),(32:18-32:28,ExpBox False),(32:56-32:56,ExpBox False),(32:49-32:56,ExpBox False),(31:8-32:58,ExpBox False),(32:64-32:83,ExpBox False),(31:7-32:84,ExpBox False),(33:18-33:23,ExpBox False),(33:56-33:56,ExpBox False),(33:49-33:56,ExpBox False),(33:8-33:58,ExpBox False),(33:64-33:71,ExpBox False),(33:7-33:72,ExpBox False),(31:7-33:72,ExpBox False),(30:7-33:72,ExpBox False),(29:7-33:72,ExpBox False),(28:8-33:72,ExpBox False),(27:8-33:72,ExpBox False),(26:1-33:72,TopLevelBox ["token"]),(23:18-23:22,ExpBox False),(23:13-23:22,ExpBox False),(23:28-23:43,ExpBox False),(23:13-23:43,ExpBox False),(23:1-23:43,TopLevelBox ["tokenList"]),(16:8-16:17,ExpBox False),(17:14-17:22,ExpBox False),(18:8-18:10,ExpBox False),(19:15-19:16,ExpBox False),(19:8-19:16,ExpBox False),(16:3-20:6,ExpBox False),(15:1-20:6,TopLevelBox ["program"]),(114:27-114:33,ExpBox False),(114:35-114:43,ExpBox False),(114:45-114:46,ExpBox False),(114:20-114:47,ExpBox False),(115:39-115:41,ExpBox False),(115:33-115:42,ExpBox False),(115:27-115:42,ExpBox True),(116:27-116:27,ExpBox True),(114:15-116:27,ExpBox False),(114:1-116:27,TopLevelBox ["rayParse"]),(120:27-120:33,ExpBox False),(120:35-120:38,ExpBox False),(120:13-120:38,ExpBox False),(121:13-121:13,ExpBox False),(122:32-122:34,ExpBox False),(122:26-122:35,ExpBox False),(122:20-122:35,ExpBox True),(123:27-123:27,ExpBox False),(123:20-123:27,ExpBox True),(121:8-123:27,ExpBox False),(120:3-124:6,ExpBox False),(119:1-124:6,TopLevelBox ["rayParseF"]),(127:22-127:28,ExpBox False),(127:30-127:31,ExpBox False),(127:33-127:34,ExpBox False),(127:15-127:35,ExpBox False),(128:28-128:30,ExpBox False),(128:22-128:30,ExpBox True),(129:28-129:28,ExpBox False),(129:22-129:28,ExpBox True),(127:10-129:28,ExpBox False),(127:1-129:28,TopLevelBox ["run"]),(133:27-133:33,ExpBox False),(133:35-133:46,ExpBox False),(133:13-133:46,ExpBox False),(134:13-134:13,ExpBox False),(135:26-135:28,ExpBox False),(135:20-135:28,ExpBox True),(136:26-136:26,ExpBox False),(136:20-136:26,ExpBox True),(134:8-136:26,ExpBox False),(133:3-137:6,ExpBox False),(132:1-137:6,TopLevelBox ["runF"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Primitives.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Primitives.mix new file mode 100644 index 0000000000000000000000000000000000000000..83967bb174aa89cc627474d907eeba4c3cc3f817 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Primitives.mix @@ -0,0 +1 @@ +Mix "./Primitives.hs" 2011-06-30 14:14:25 UTC 3702571582 8 [(24:16-24:16,ExpBox False),(24:11-24:16,ExpBox False),(24:20-24:22,ExpBox False),(24:11-24:22,ExpBox False),(24:26-24:27,ExpBox False),(24:11-24:27,ExpBox False),(24:1-24:27,TopLevelBox ["asinD"]),(21:16-21:16,ExpBox False),(21:11-21:16,ExpBox False),(21:20-21:22,ExpBox False),(21:11-21:22,ExpBox False),(21:26-21:27,ExpBox False),(21:11-21:27,ExpBox False),(21:1-21:27,TopLevelBox ["acosD"]),(18:8-18:10,ExpBox False),(18:1-18:10,TopLevelBox ["addf"]),(15:8-15:10,ExpBox False),(15:1-15:10,TopLevelBox ["addi"]),(12:13-12:13,ExpBox False),(12:17-12:18,ExpBox False),(12:13-12:18,ExpBox False),(12:22-12:24,ExpBox False),(12:13-12:24,ExpBox False),(12:1-12:24,TopLevelBox ["deg2rad"]),(9:13-9:13,ExpBox False),(9:17-9:19,ExpBox False),(9:13-9:19,ExpBox False),(9:23-9:24,ExpBox False),(9:13-9:24,ExpBox False),(9:1-9:24,TopLevelBox ["rad2deg"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/.hpc/Surface.mix b/testsuite/tests/hpc/raytrace/tixs/.hpc/Surface.mix new file mode 100644 index 0000000000000000000000000000000000000000..f392502829099e8d69240b65da68440c2ded08df --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/.hpc/Surface.mix @@ -0,0 +1 @@ +Mix "./Surface.hs" 2011-06-30 14:14:25 UTC 1778761563 8 [(115:21-115:21,ExpBox False),(115:25-115:25,ExpBox False),(115:21-115:25,ExpBox False),(115:21-115:25,BinBox CondBinBox True),(115:21-115:25,BinBox CondBinBox False),(115:32-115:32,ExpBox True),(115:39-115:39,ExpBox False),(115:43-115:43,ExpBox False),(115:47-115:48,ExpBox False),(115:43-115:48,ExpBox False),(115:39-115:48,ExpBox True),(115:18-115:48,ExpBox False),(115:1-115:48,TopLevelBox ["adjustRadian"]),(110:20-110:21,ExpBox False),(110:13-110:21,ExpBox False),(110:9-110:21,LocalBox ["planarUV","z"]),(109:20-109:21,ExpBox False),(109:13-109:21,ExpBox False),(109:9-109:21,LocalBox ["planarUV","y"]),(108:20-108:21,ExpBox False),(108:13-108:21,ExpBox False),(108:9-108:21,LocalBox ["planarUV","x"]),(94:10-94:13,ExpBox False),(95:24-95:24,ExpBox False),(95:27-95:27,ExpBox False),(95:30-95:30,ExpBox False),(95:23-95:31,ExpBox True),(97:24-97:24,ExpBox False),(97:27-97:27,ExpBox False),(97:30-97:30,ExpBox False),(97:23-97:31,ExpBox True),(98:24-98:24,ExpBox False),(98:27-98:27,ExpBox False),(98:30-98:30,ExpBox False),(98:23-98:31,ExpBox True),(99:24-99:24,ExpBox False),(99:27-99:27,ExpBox False),(99:30-99:30,ExpBox False),(99:23-99:31,ExpBox True),(100:24-100:24,ExpBox False),(100:27-100:27,ExpBox False),(100:30-100:30,ExpBox False),(100:23-100:31,ExpBox True),(101:24-101:24,ExpBox False),(101:27-101:27,ExpBox False),(101:30-101:30,ExpBox False),(101:23-101:31,ExpBox True),(102:24-102:24,ExpBox False),(102:27-102:27,ExpBox False),(102:30-102:30,ExpBox False),(102:23-102:31,ExpBox True),(104:24-104:24,ExpBox False),(104:28-104:28,ExpBox False),(104:32-104:32,ExpBox False),(104:27-104:33,ExpBox False),(104:37-104:37,ExpBox False),(104:27-104:37,ExpBox False),(104:41-104:41,ExpBox False),(104:45-104:45,ExpBox False),(104:40-104:46,ExpBox False),(104:50-104:50,ExpBox False),(104:40-104:50,ExpBox False),(104:23-104:51,ExpBox True),(105:24-105:24,ExpBox False),(105:28-105:28,ExpBox False),(105:32-105:32,ExpBox False),(105:27-105:33,ExpBox False),(105:37-105:37,ExpBox False),(105:27-105:37,ExpBox False),(105:41-105:41,ExpBox False),(105:45-105:45,ExpBox False),(105:40-105:46,ExpBox False),(105:50-105:50,ExpBox False),(105:40-105:50,ExpBox False),(105:23-105:51,ExpBox True),(107:24-107:24,ExpBox False),(107:28-107:28,ExpBox False),(107:32-107:32,ExpBox False),(107:27-107:33,ExpBox False),(107:37-107:37,ExpBox False),(107:27-107:37,ExpBox False),(107:41-107:41,ExpBox False),(107:45-107:45,ExpBox False),(107:40-107:46,ExpBox False),(107:50-107:50,ExpBox False),(107:40-107:50,ExpBox False),(107:23-107:51,ExpBox True),(94:5-107:51,ExpBox False),(93:1-110:21,TopLevelBox ["planarUV"]),(45:36-45:36,ExpBox False),(45:26-45:36,ExpBox True),(46:26-46:26,ExpBox True),(45:1-46:26,TopLevelBox ["evalSurface"]),(56:31-56:31,ExpBox False),(56:33-56:34,ExpBox False),(56:22-56:34,ExpBox False),(55:16-55:24,ExpBox False),(55:34-55:35,ExpBox False),(55:37-55:38,ExpBox False),(55:28-55:38,ExpBox False),(55:16-55:38,ExpBox False),(55:9-55:38,LocalBox ["surface","norm"]),(54:6-54:9,ExpBox False),(54:24-54:25,ExpBox False),(54:27-54:28,ExpBox False),(54:30-54:30,ExpBox False),(54:32-54:32,ExpBox False),(54:12-54:32,ExpBox False),(54:5-54:33,ExpBox True),(69:16-69:24,ExpBox False),(69:34-69:35,ExpBox False),(69:37-69:38,ExpBox False),(69:28-69:38,ExpBox False),(69:16-69:38,ExpBox False),(69:9-69:38,LocalBox ["surface","norm"]),(62:20-62:21,ExpBox False),(62:13-62:21,ExpBox False),(62:9-62:21,LocalBox ["surface","z"]),(61:20-61:21,ExpBox False),(61:13-61:21,ExpBox False),(61:9-61:21,LocalBox ["surface","y"]),(63:19-63:19,ExpBox False),(63:26-63:26,ExpBox False),(63:23-63:26,ExpBox False),(63:18-63:27,ExpBox False),(63:13-63:27,ExpBox False),(63:9-63:27,LocalBox ["surface","k"]),(68:28-68:28,ExpBox False),(68:32-68:32,ExpBox False),(68:27-68:33,ExpBox False),(68:37-68:37,ExpBox False),(68:26-68:38,ExpBox False),(68:19-68:38,ExpBox False),(68:9-68:38,LocalBox ["surface","v"]),(60:20-60:21,ExpBox False),(60:13-60:21,ExpBox False),(60:9-60:21,LocalBox ["surface","x"]),(64:38-64:38,ExpBox False),(64:42-64:42,ExpBox False),(64:37-64:43,ExpBox False),(64:46-64:46,ExpBox False),(64:50-64:50,ExpBox False),(64:45-64:51,ExpBox False),(64:30-64:52,ExpBox False),(64:17-64:52,ExpBox False),(64:9-64:52,LocalBox ["surface","theta"]),(67:13-67:15,ExpBox False),(67:27-67:31,ExpBox False),(67:36-67:36,ExpBox False),(67:40-67:41,ExpBox False),(67:35-67:42,ExpBox False),(67:26-67:43,ExpBox False),(67:19-67:43,ExpBox False),(67:13-67:43,ExpBox False),(67:9-67:43,LocalBox ["surface","u"]),(59:6-59:9,ExpBox False),(59:24-59:25,ExpBox False),(59:27-59:27,ExpBox False),(59:29-59:29,ExpBox False),(59:31-59:31,ExpBox False),(59:12-59:31,ExpBox False),(59:5-59:32,ExpBox True),(80:16-80:24,ExpBox False),(80:34-80:35,ExpBox False),(80:37-80:38,ExpBox False),(80:28-80:38,ExpBox False),(80:16-80:38,ExpBox False),(80:9-80:38,LocalBox ["surface","norm"]),(77:20-77:21,ExpBox False),(77:13-77:21,ExpBox False),(77:9-77:21,LocalBox ["surface","z"]),(76:20-76:21,ExpBox False),(76:13-76:21,ExpBox False),(76:9-76:21,LocalBox ["surface","y"]),(79:13-79:13,ExpBox False),(79:9-79:13,LocalBox ["surface","v"]),(75:20-75:21,ExpBox False),(75:13-75:21,ExpBox False),(75:9-75:21,LocalBox ["surface","x"]),(78:13-78:18,ExpBox False),(78:42-78:42,ExpBox False),(78:44-78:44,ExpBox False),(78:35-78:45,ExpBox False),(78:22-78:45,ExpBox False),(78:50-78:50,ExpBox False),(78:54-78:55,ExpBox False),(78:49-78:56,ExpBox False),(78:22-78:56,ExpBox False),(78:13-78:56,ExpBox False),(78:9-78:56,LocalBox ["surface","u"]),(74:6-74:9,ExpBox False),(74:24-74:25,ExpBox False),(74:27-74:27,ExpBox False),(74:29-74:29,ExpBox False),(74:31-74:31,ExpBox False),(74:12-74:31,ExpBox False),(74:5-74:32,ExpBox True),(91:16-91:24,ExpBox False),(91:34-91:35,ExpBox False),(91:37-91:38,ExpBox False),(91:28-91:38,ExpBox False),(91:16-91:38,ExpBox False),(91:9-91:38,LocalBox ["surface","norm"]),(88:20-88:21,ExpBox False),(88:13-88:21,ExpBox False),(88:9-88:21,LocalBox ["surface","z"]),(87:20-87:21,ExpBox False),(87:13-87:21,ExpBox False),(87:9-87:21,LocalBox ["surface","y"]),(90:13-90:13,ExpBox False),(90:9-90:13,LocalBox ["surface","v"]),(86:20-86:21,ExpBox False),(86:13-86:21,ExpBox False),(86:9-86:21,LocalBox ["surface","x"]),(89:13-89:18,ExpBox False),(89:43-89:43,ExpBox False),(89:47-89:47,ExpBox False),(89:42-89:48,ExpBox False),(89:51-89:51,ExpBox False),(89:55-89:55,ExpBox False),(89:50-89:56,ExpBox False),(89:35-89:57,ExpBox False),(89:22-89:57,ExpBox False),(89:62-89:62,ExpBox False),(89:66-89:67,ExpBox False),(89:61-89:68,ExpBox False),(89:22-89:68,ExpBox False),(89:13-89:68,ExpBox False),(89:9-89:68,LocalBox ["surface","u"]),(85:6-85:9,ExpBox False),(85:24-85:25,ExpBox False),(85:27-85:27,ExpBox False),(85:29-85:29,ExpBox False),(85:31-85:31,ExpBox False),(85:12-85:31,ExpBox False),(85:5-85:32,ExpBox True),(53:1-91:38,TopLevelBox ["surface"]),(37:28-37:28,ExpBox False),(37:31-37:31,ExpBox False),(37:34-37:34,ExpBox False),(37:37-37:37,ExpBox False),(37:27-37:38,ExpBox False),(37:1-37:38,TopLevelBox ["chgColor"]),(34:10-34:14,ExpBox False),(34:17-34:19,ExpBox False),(34:22-34:24,ExpBox False),(34:27-34:29,ExpBox False),(34:9-34:30,ExpBox False),(34:1-34:30,TopLevelBox ["shiny"]),(33:10-33:14,ExpBox False),(33:17-33:19,ExpBox False),(33:22-33:24,ExpBox False),(33:27-33:29,ExpBox False),(33:9-33:30,ExpBox False),(33:1-33:30,TopLevelBox ["matte"]),(31:17-31:17,ExpBox False),(31:20-31:20,ExpBox False),(31:23-31:23,ExpBox False),(31:26-31:26,ExpBox False),(31:16-31:27,ExpBox False),(31:1-31:27,TopLevelBox ["prop"]),(27:10-27:15,ExpBox False),(27:1-27:15,TopLevelBox ["sconst"]),(25:8-25:11,ExpBox False),(25:1-25:11,TopLevelBox ["sfun"]),(40:21-40:38,ExpBox True),(42:21-42:38,ExpBox True),(40:3-42:38,TopLevelBox ["show"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/raytrace/tixs/Makefile b/testsuite/tests/hpc/raytrace/tixs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..009a9fceeaafbe7361fde6e358828dfdef81b59a --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/Makefile @@ -0,0 +1,10 @@ +TOP=../../../../../testsuite +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + +build-tix: + rm -Rf .hpc *.o Main + '$(TEST_HC)' -fhpc -i.. --make Main.hs + ./Main + mv Main.tix hpc_sample.tix + diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_markup_multi_001.stdout b/testsuite/tests/hpc/raytrace/tixs/hpc_markup_multi_001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..10ec4a0d26e3b5b5932b69cbfdd6519e6fa5a36c --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_markup_multi_001.stdout @@ -0,0 +1,5 @@ +Writing: Geometry.hs.html +Writing: hpc_index.html +Writing: hpc_index_fun.html +Writing: hpc_index_alt.html +Writing: hpc_index_exp.html diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_markup_multi_002.stdout b/testsuite/tests/hpc/raytrace/tixs/hpc_markup_multi_002.stdout new file mode 100644 index 0000000000000000000000000000000000000000..434e661fa7480713c2529b468fd9f22e05d08b27 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_markup_multi_002.stdout @@ -0,0 +1,16 @@ +Writing: Main.hs.html +Writing: Parse.hs.html +Writing: Eval.hs.html +Writing: Data.hs.html +Writing: CSG.hs.html +Writing: Surface.hs.html +Writing: Illumination.hs.html +Writing: Primitives.hs.html +Writing: Misc.hs.html +Writing: Construct.hs.html +Writing: Intersections.hs.html +Writing: Interval.hs.html +Writing: hpc_index.html +Writing: hpc_index_fun.html +Writing: hpc_index_alt.html +Writing: hpc_index_exp.html diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_markup_multi_003.stdout b/testsuite/tests/hpc/raytrace/tixs/hpc_markup_multi_003.stdout new file mode 100644 index 0000000000000000000000000000000000000000..5e5e11e3773061f851ba74fc7872a70727606b59 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_markup_multi_003.stdout @@ -0,0 +1,17 @@ +Writing: Main.hs.html +Writing: Parse.hs.html +Writing: Eval.hs.html +Writing: Data.hs.html +Writing: Geometry.hs.html +Writing: CSG.hs.html +Writing: Surface.hs.html +Writing: Illumination.hs.html +Writing: Primitives.hs.html +Writing: Misc.hs.html +Writing: Construct.hs.html +Writing: Intersections.hs.html +Writing: Interval.hs.html +Writing: hpc_index.html +Writing: hpc_index_fun.html +Writing: hpc_index_alt.html +Writing: hpc_index_exp.html diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_raytrace.stdout b/testsuite/tests/hpc/raytrace/tixs/hpc_raytrace.stdout new file mode 100644 index 0000000000000000000000000000000000000000..91d0243ca0d3849c8a33dfdfbad26a0a8bfff087 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_raytrace.stdout @@ -0,0 +1,2955 @@ +"GOOD MATCH" + + + 48% expressions used (2292/4715) + 21% boolean coverage (18/83) + 21% guards (12/55), 17 always True, 8 always False, 18 unevaluated + 22% 'if' conditions (6/27), 3 always True, 3 always False, 15 unevaluated + 0% qualifiers (0/1), 1 unevaluated + 38% alternatives used (124/322) + 40% local declarations used (89/218) + 49% top-level declarations used (146/295) + + +-----<module CSG>----- +100% expressions used (0/0) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (0/0) +-----<module Construct>----- + 60% expressions used (381/635) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) + 41% alternatives used (5/12) +100% local declarations used (5/5) + 41% top-level declarations used (17/41) +-----<module Data>----- + 39% expressions used (254/646) + 0% boolean coverage (0/4) + 0% guards (0/4), 1 always True, 3 unevaluated + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) + 3% alternatives used (2/51) + 0% local declarations used (0/2) + 22% top-level declarations used (10/45) +-----<module Eval>----- + 57% expressions used (361/628) + 20% boolean coverage (1/5) + 100% guards (0/0) + 20% 'if' conditions (1/5), 1 always False, 3 unevaluated + 100% qualifiers (0/0) + 59% alternatives used (40/67) + 36% local declarations used (4/11) + 62% top-level declarations used (22/35) +-----<module Geometry>----- + 70% expressions used (300/427) + 10% boolean coverage (1/10) + 10% guards (1/10), 3 always True, 1 always False, 5 unevaluated + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) + 40% alternatives used (4/10) + 66% local declarations used (2/3) + 58% top-level declarations used (42/72) +-----<module Illumination>----- + 44% expressions used (299/678) + 18% boolean coverage (3/16) + 16% guards (2/12), 2 always True, 1 always False, 7 unevaluated + 33% 'if' conditions (1/3), 1 always True, 1 always False + 0% qualifiers (0/1), 1 unevaluated + 38% alternatives used (16/42) + 57% local declarations used (27/47) + 45% top-level declarations used (11/24) +-----<module Intersections>----- + 38% expressions used (382/1001) + 33% boolean coverage (11/33) + 40% guards (8/20), 8 always True, 3 always False, 1 unevaluated + 23% 'if' conditions (3/13), 10 unevaluated + 100% qualifiers (0/0) + 42% alternatives used (35/83) + 36% local declarations used (44/120) + 63% top-level declarations used (14/22) +-----<module Interval>----- + 41% expressions used (69/165) + 8% boolean coverage (1/12) + 11% guards (1/9), 3 always True, 3 always False, 2 unevaluated + 0% 'if' conditions (0/3), 2 always True, 1 unevaluated + 100% qualifiers (0/0) + 39% alternatives used (9/23) + 25% local declarations used (1/4) + 47% top-level declarations used (8/17) +-----<module Main>----- +100% expressions used (6/6) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) +-----<module Misc>----- + 0% expressions used (0/10) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) + 0% top-level declarations used (0/1) +-----<module Parse>----- + 72% expressions used (192/264) + 50% boolean coverage (1/2) + 100% guards (0/0) + 50% 'if' conditions (1/2), 1 always False + 100% qualifiers (0/0) + 42% alternatives used (6/14) +100% local declarations used (2/2) + 80% top-level declarations used (16/20) +-----<module Primitives>----- + 20% expressions used (5/24) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) + 16% top-level declarations used (1/6) +-----<module Surface>----- + 18% expressions used (43/231) + 0% boolean coverage (0/1) + 100% guards (0/0) + 0% 'if' conditions (0/1), 1 unevaluated + 100% qualifiers (0/0) + 35% alternatives used (7/20) + 16% local declarations used (4/24) + 36% top-level declarations used (4/11) + + +Writing: Main.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>-- Modified to read sample input directly from a file. +<span class="lineno"> 7 </span> +<span class="lineno"> 8 </span>module Main where +<span class="lineno"> 9 </span> +<span class="lineno"> 10 </span>import System +<span class="lineno"> 11 </span> +<span class="lineno"> 12 </span>import Parse +<span class="lineno"> 13 </span>import Eval +<span class="lineno"> 14 </span> +<span class="lineno"> 15 </span><span class="decl"><span class="istickedoff">main = do { str <- readFile "galois.gml"</span> +<span class="lineno"> 16 </span><span class="spaces"> </span><span class="istickedoff">; mainEval (rayParse str)</span> +<span class="lineno"> 17 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> + +</pre> +</html> +Writing: Parse.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Parse where +<span class="lineno"> 7 </span> +<span class="lineno"> 8 </span>import Char +<span class="lineno"> 9 </span>import Text.ParserCombinators.Parsec hiding (token) +<span class="lineno"> 10 </span> +<span class="lineno"> 11 </span>import Data +<span class="lineno"> 12 </span> +<span class="lineno"> 13 </span> +<span class="lineno"> 14 </span>program :: Parser Code +<span class="lineno"> 15 </span><span class="decl"><span class="istickedoff">program =</span> +<span class="lineno"> 16 </span><span class="spaces"> </span><span class="istickedoff">do { whiteSpace</span> +<span class="lineno"> 17 </span><span class="spaces"> </span><span class="istickedoff">; ts <- tokenList</span> +<span class="lineno"> 18 </span><span class="spaces"> </span><span class="istickedoff">; eof</span> +<span class="lineno"> 19 </span><span class="spaces"> </span><span class="istickedoff">; return ts</span> +<span class="lineno"> 20 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> +<span class="lineno"> 21 </span> +<span class="lineno"> 22 </span>tokenList :: Parser Code +<span class="lineno"> 23 </span><span class="decl"><span class="istickedoff">tokenList = many token <?> <span class="nottickedoff">"list of tokens"</span></span></span> +<span class="lineno"> 24 </span> +<span class="lineno"> 25 </span>token :: Parser GMLToken +<span class="lineno"> 26 </span><span class="decl"><span class="istickedoff">token =</span> +<span class="lineno"> 27 </span><span class="spaces"> </span><span class="istickedoff">do { ts <- braces tokenList ; return (TBody ts) } </span> +<span class="lineno"> 28 </span><span class="spaces"> </span><span class="istickedoff"><|> do { ts <- brackets tokenList ; return (TArray ts) }</span> +<span class="lineno"> 29 </span><span class="spaces"> </span><span class="istickedoff"><|> (do { s <- gmlString ; return (TString <span class="nottickedoff">s</span>) } <?> <span class="nottickedoff">"string"</span>)</span> +<span class="lineno"> 30 </span><span class="spaces"> </span><span class="istickedoff"><|> (do { t <- pident False ; return t } <?> <span class="nottickedoff">"identifier"</span>)</span> +<span class="lineno"> 31 </span><span class="spaces"> </span><span class="istickedoff"><|> (do { char '/' -- No whitespace after slash</span> +<span class="lineno"> 32 </span><span class="spaces"> </span><span class="istickedoff">; t <- pident True ; return t } <?> <span class="nottickedoff">"binding identifier"</span>)</span> +<span class="lineno"> 33 </span><span class="spaces"> </span><span class="istickedoff"><|> (do { n <- number ; return n } <?> <span class="nottickedoff">"number"</span>)</span></span> +<span class="lineno"> 34 </span> +<span class="lineno"> 35 </span>pident :: Bool -> Parser GMLToken +<span class="lineno"> 36 </span><span class="decl"><span class="istickedoff">pident rebind =</span> +<span class="lineno"> 37 </span><span class="spaces"> </span><span class="istickedoff">do { id <- ident</span> +<span class="lineno"> 38 </span><span class="spaces"> </span><span class="istickedoff">; case (lookup id opTable) of</span> +<span class="lineno"> 39 </span><span class="spaces"> </span><span class="istickedoff">Nothing -> if rebind then return (TBind id) else return (TId id)</span> +<span class="lineno"> 40 </span><span class="spaces"> </span><span class="istickedoff">Just t -> if <span class="tickonlyfalse">rebind</span> then <span class="nottickedoff">error ("Attempted rebinding of identifier " ++ id)</span> else return t</span> +<span class="lineno"> 41 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> +<span class="lineno"> 42 </span> +<span class="lineno"> 43 </span>ident :: Parser String +<span class="lineno"> 44 </span><span class="decl"><span class="istickedoff">ident = lexeme $</span> +<span class="lineno"> 45 </span><span class="spaces"> </span><span class="istickedoff">do { l <- letter</span> +<span class="lineno"> 46 </span><span class="spaces"> </span><span class="istickedoff">; ls <- many (satisfy (\x -> isAlphaNum x || x == '-' || x == '_'))</span> +<span class="lineno"> 47 </span><span class="spaces"> </span><span class="istickedoff">; return (l:ls)</span> +<span class="lineno"> 48 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> +<span class="lineno"> 49 </span> +<span class="lineno"> 50 </span>gmlString :: Parser String +<span class="lineno"> 51 </span><span class="decl"><span class="istickedoff">gmlString = lexeme $ between (char '"') (char '"') (many (satisfy (\x -> isPrint x && x /= '"')))</span></span> +<span class="lineno"> 52 </span> +<span class="lineno"> 53 </span>-- Tests for numbers +<span class="lineno"> 54 </span>-- Hugs breaks on big exponents (> ~40) +<span class="lineno"> 55 </span><span class="decl"><span class="nottickedoff">test_number = "1234 -1234 1 -0 0" ++</span> +<span class="lineno"> 56 </span><span class="spaces"> </span><span class="nottickedoff">" 1234.5678 -1234.5678 1234.5678e12 1234.5678e-12 -1234.5678e-12" ++</span> +<span class="lineno"> 57 </span><span class="spaces"> </span><span class="nottickedoff">" -1234.5678e12 -1234.5678E-12 -1234.5678E12" ++</span> +<span class="lineno"> 58 </span><span class="spaces"> </span><span class="nottickedoff">" 1234e11 1234E33 -1234e33 1234e-33" ++</span> +<span class="lineno"> 59 </span><span class="spaces"> </span><span class="nottickedoff">" 123e 123.4e 123ee 123.4ee 123E 123.4E 123EE 123.4EE"</span></span> +<span class="lineno"> 60 </span> +<span class="lineno"> 61 </span> +<span class="lineno"> 62 </span>-- Always int or real +<span class="lineno"> 63 </span>number :: Parser GMLToken +<span class="lineno"> 64 </span><span class="decl"><span class="istickedoff">number = lexeme $</span> +<span class="lineno"> 65 </span><span class="spaces"> </span><span class="istickedoff">do { s <- optSign</span> +<span class="lineno"> 66 </span><span class="spaces"> </span><span class="istickedoff">; n <- decimal</span> +<span class="lineno"> 67 </span><span class="spaces"> </span><span class="istickedoff">; do { string "."</span> +<span class="lineno"> 68 </span><span class="spaces"> </span><span class="istickedoff">; m <- decimal</span> +<span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff">; e <- option "" exponent'</span> +<span class="lineno"> 70 </span><span class="spaces"> </span><span class="istickedoff">; return (TReal (read (s ++ n ++ "." ++ m ++ e))) -- FIXME: Handle error conditions</span> +<span class="lineno"> 71 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 72 </span><span class="spaces"> </span><span class="istickedoff"><|> do { e <- exponent'</span> +<span class="lineno"> 73 </span><span class="spaces"> </span><span class="istickedoff">; <span class="nottickedoff">return (TReal (read (s ++ n ++ ".0" ++ e)))</span></span> +<span class="lineno"> 74 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 75 </span><span class="spaces"> </span><span class="istickedoff"><|> do { return (TInt (read (s ++ n))) }</span> +<span class="lineno"> 76 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> +<span class="lineno"> 77 </span> +<span class="lineno"> 78 </span>exponent' :: Parser String +<span class="lineno"> 79 </span><span class="decl"><span class="istickedoff">exponent' = try $</span> +<span class="lineno"> 80 </span><span class="spaces"> </span><span class="istickedoff">do { e <- oneOf "eE"</span> +<span class="lineno"> 81 </span><span class="spaces"> </span><span class="istickedoff">; s <- <span class="nottickedoff">optSign</span></span> +<span class="lineno"> 82 </span><span class="spaces"> </span><span class="istickedoff">; n <- <span class="nottickedoff">decimal</span></span> +<span class="lineno"> 83 </span><span class="spaces"> </span><span class="istickedoff">; <span class="nottickedoff">return (e:s ++ n)</span></span> +<span class="lineno"> 84 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> +<span class="lineno"> 85 </span> +<span class="lineno"> 86 </span><span class="decl"><span class="istickedoff">decimal = many1 digit</span></span> +<span class="lineno"> 87 </span> +<span class="lineno"> 88 </span>optSign :: Parser String +<span class="lineno"> 89 </span><span class="decl"><span class="istickedoff">optSign = option "" (string "-")</span></span> +<span class="lineno"> 90 </span> +<span class="lineno"> 91 </span> +<span class="lineno"> 92 </span>------------------------------------------------------ +<span class="lineno"> 93 </span>-- Library for tokenizing. +<span class="lineno"> 94 </span> +<span class="lineno"> 95 </span><span class="decl"><span class="istickedoff">braces p = between (symbol "{") (symbol "}") p</span></span> +<span class="lineno"> 96 </span><span class="decl"><span class="istickedoff">brackets p = between (symbol "[") (symbol "]") p</span></span> +<span class="lineno"> 97 </span> +<span class="lineno"> 98 </span><span class="decl"><span class="istickedoff">symbol name = lexeme (string name)</span></span> +<span class="lineno"> 99 </span> +<span class="lineno"> 100 </span><span class="decl"><span class="istickedoff">lexeme p = do{ x <- p; whiteSpace; return x }</span></span> +<span class="lineno"> 101 </span> +<span class="lineno"> 102 </span><span class="decl"><span class="istickedoff">whiteSpace = skipMany (simpleSpace <|> oneLineComment <?> <span class="nottickedoff">""</span>)</span> +<span class="lineno"> 103 </span><span class="spaces"> </span><span class="istickedoff">where simpleSpace = skipMany1 (oneOf " \t\n\r\v") </span> +<span class="lineno"> 104 </span><span class="spaces"> </span><span class="istickedoff">oneLineComment =</span> +<span class="lineno"> 105 </span><span class="spaces"> </span><span class="istickedoff">do{ string "%"</span> +<span class="lineno"> 106 </span><span class="spaces"> </span><span class="istickedoff">; skipMany (noneOf "\n\r\v")</span> +<span class="lineno"> 107 </span><span class="spaces"> </span><span class="istickedoff">; return ()</span> +<span class="lineno"> 108 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> +<span class="lineno"> 109 </span> +<span class="lineno"> 110 </span> +<span class="lineno"> 111 </span>------------------------------------------------------------------------------ +<span class="lineno"> 112 </span> +<span class="lineno"> 113 </span>rayParse :: String -> Code +<span class="lineno"> 114 </span><span class="decl"><span class="istickedoff">rayParse is = case (parse program <span class="nottickedoff">"<stdin>"</span> is) of</span> +<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff">Left err -> <span class="nottickedoff">error (show err)</span></span> +<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff">Right x -> x</span></span> +<span class="lineno"> 117 </span> +<span class="lineno"> 118 </span>rayParseF :: String -> IO Code +<span class="lineno"> 119 </span><span class="decl"><span class="nottickedoff">rayParseF file =</span> +<span class="lineno"> 120 </span><span class="spaces"> </span><span class="nottickedoff">do { r <- parseFromFile program file</span> +<span class="lineno"> 121 </span><span class="spaces"> </span><span class="nottickedoff">; case r of</span> +<span class="lineno"> 122 </span><span class="spaces"> </span><span class="nottickedoff">Left err -> error (show err)</span> +<span class="lineno"> 123 </span><span class="spaces"> </span><span class="nottickedoff">Right x -> return x</span> +<span class="lineno"> 124 </span><span class="spaces"> </span><span class="nottickedoff">}</span></span> +<span class="lineno"> 125 </span> +<span class="lineno"> 126 </span>run :: String -> IO () +<span class="lineno"> 127 </span><span class="decl"><span class="nottickedoff">run is = case (parse program "" is) of</span> +<span class="lineno"> 128 </span><span class="spaces"> </span><span class="nottickedoff">Left err -> print err</span> +<span class="lineno"> 129 </span><span class="spaces"> </span><span class="nottickedoff">Right x -> print x</span></span> +<span class="lineno"> 130 </span> +<span class="lineno"> 131 </span>runF :: IO () +<span class="lineno"> 132 </span><span class="decl"><span class="nottickedoff">runF =</span> +<span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">do { r <- parseFromFile program "simple.gml"</span> +<span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">; case r of</span> +<span class="lineno"> 135 </span><span class="spaces"> </span><span class="nottickedoff">Left err -> print err</span> +<span class="lineno"> 136 </span><span class="spaces"> </span><span class="nottickedoff">Right x -> print x</span> +<span class="lineno"> 137 </span><span class="spaces"> </span><span class="nottickedoff">}</span></span> + +</pre> +</html> +Writing: Data.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Data where +<span class="lineno"> 7 </span> +<span class="lineno"> 8 </span>import Array +<span class="lineno"> 9 </span> +<span class="lineno"> 10 </span>import CSG +<span class="lineno"> 11 </span>import Geometry +<span class="lineno"> 12 </span>import Illumination +<span class="lineno"> 13 </span>import Primitives +<span class="lineno"> 14 </span>import Surface +<span class="lineno"> 15 </span> +<span class="lineno"> 16 </span>import Debug.Trace +<span class="lineno"> 17 </span> +<span class="lineno"> 18 </span>-- Now the parsed (expresssion) language +<span class="lineno"> 19 </span> +<span class="lineno"> 20 </span>type Name = String +<span class="lineno"> 21 </span> +<span class="lineno"> 22 </span>type Code = [GMLToken] +<span class="lineno"> 23 </span> +<span class="lineno"> 24 </span>data GMLToken +<span class="lineno"> 25 </span> -- All these can occur in parsed code +<span class="lineno"> 26 </span> = TOp GMLOp +<span class="lineno"> 27 </span> | TId Name +<span class="lineno"> 28 </span> | TBind Name +<span class="lineno"> 29 </span> | TBool Bool +<span class="lineno"> 30 </span> | TInt Int +<span class="lineno"> 31 </span> | TReal Double +<span class="lineno"> 32 </span> | TString String +<span class="lineno"> 33 </span> | TBody Code +<span class="lineno"> 34 </span> | TArray Code +<span class="lineno"> 35 </span> | TApply +<span class="lineno"> 36 </span> | TIf +<span class="lineno"> 37 </span> -- These can occur in optimized/transformed code +<span class="lineno"> 38 </span> -- NONE (yet!) +<span class="lineno"> 39 </span> +<span class="lineno"> 40 </span> +<span class="lineno"> 41 </span>instance Show GMLToken where +<span class="lineno"> 42 </span> <span class="decl"><span class="nottickedoff">showsPrec p (TOp op) = shows op</span> +<span class="lineno"> 43 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TId id) = showString id</span> +<span class="lineno"> 44 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TBind id) = showString ('/' : id)</span> +<span class="lineno"> 45 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TBool bool) = shows bool</span> +<span class="lineno"> 46 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TInt i) = shows i</span> +<span class="lineno"> 47 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TReal d) = shows d</span> +<span class="lineno"> 48 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TString s) = shows s</span> +<span class="lineno"> 49 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TBody code) = shows code</span> +<span class="lineno"> 50 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TArray code) = showString "[ " </span> +<span class="lineno"> 51 </span><span class="spaces"> </span><span class="nottickedoff">. foldr (\ a b -> a . showChar ' ' . b) id (map shows code) </span> +<span class="lineno"> 52 </span><span class="spaces"> </span><span class="nottickedoff">. showString "]"</span> +<span class="lineno"> 53 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TApply) = showString "apply" </span> +<span class="lineno"> 54 </span><span class="spaces"> </span><span class="nottickedoff">showsPrec p (TIf) = showString "if"</span></span> +<span class="lineno"> 55 </span> +<span class="lineno"> 56 </span> <span class="decl"><span class="nottickedoff">showList code = showString "{ " </span> +<span class="lineno"> 57 </span><span class="spaces"> </span><span class="nottickedoff">. foldr (\ a b -> a . showChar ' ' . b) id (map shows code) </span> +<span class="lineno"> 58 </span><span class="spaces"> </span><span class="nottickedoff">. showString "}"</span></span> +<span class="lineno"> 59 </span> +<span class="lineno"> 60 </span> +<span class="lineno"> 61 </span>-- Now the value language, used inside the interpreter +<span class="lineno"> 62 </span> +<span class="lineno"> 63 </span>type Stack = [GMLValue] +<span class="lineno"> 64 </span> +<span class="lineno"> 65 </span>data GMLValue +<span class="lineno"> 66 </span> = VBool !Bool +<span class="lineno"> 67 </span> | VInt !Int +<span class="lineno"> 68 </span> | VReal !Double +<span class="lineno"> 69 </span> | VString String +<span class="lineno"> 70 </span> | VClosure Env Code +<span class="lineno"> 71 </span> | VArray (Array Int GMLValue) -- FIXME: Haskell array +<span class="lineno"> 72 </span> -- uses the interpreter version of point +<span class="lineno"> 73 </span> | VPoint { xPoint :: !Double +<span class="lineno"> 74 </span> , yPoint :: !Double +<span class="lineno"> 75 </span> , zPoint :: !Double +<span class="lineno"> 76 </span> } +<span class="lineno"> 77 </span> -- these are abstract to the interpreter +<span class="lineno"> 78 </span> | VObject Object +<span class="lineno"> 79 </span> | VLight Light +<span class="lineno"> 80 </span> -- This is an abstract object, used by the abstract interpreter +<span class="lineno"> 81 </span> | VAbsObj AbsObj +<span class="lineno"> 82 </span> +<span class="lineno"> 83 </span> +<span class="lineno"> 84 </span>-- There are only *3* basic abstract values, +<span class="lineno"> 85 </span>-- and the combinators also. +<span class="lineno"> 86 </span> +<span class="lineno"> 87 </span>data AbsObj +<span class="lineno"> 88 </span> = AbsFACE +<span class="lineno"> 89 </span> | AbsU +<span class="lineno"> 90 </span> | AbsV +<span class="lineno"> 91 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span>) +<span class="lineno"> 92 </span> +<span class="lineno"> 93 </span>instance Show GMLValue where +<span class="lineno"> 94 </span> <span class="decl"><span class="nottickedoff">showsPrec p value = showString (showStkEle value)</span></span> +<span class="lineno"> 95 </span> +<span class="lineno"> 96 </span>showStkEle :: GMLValue -> String +<span class="lineno"> 97 </span><span class="decl"><span class="nottickedoff">showStkEle (VBool b) = show b ++ " :: Bool"</span> +<span class="lineno"> 98 </span><span class="spaces"></span><span class="nottickedoff">showStkEle (VInt i) = show i ++ " :: Int"</span> +<span class="lineno"> 99 </span><span class="spaces"></span><span class="nottickedoff">showStkEle (VReal r) = show r ++ " :: Real"</span> +<span class="lineno"> 100 </span><span class="spaces"></span><span class="nottickedoff">showStkEle (VString s) = show s ++ " :: String"</span> +<span class="lineno"> 101 </span><span class="spaces"></span><span class="nottickedoff">showStkEle (VClosure {}) = "<closure> :: Closure"</span> +<span class="lineno"> 102 </span><span class="spaces"></span><span class="nottickedoff">showStkEle (VArray arr) </span> +<span class="lineno"> 103 </span><span class="spaces"> </span><span class="nottickedoff">= "<array (" ++ show (succ (snd (bounds arr))) ++ " elements)> :: Array"</span> +<span class="lineno"> 104 </span><span class="spaces"></span><span class="nottickedoff">showStkEle (VPoint x y z) = "(" ++ show x </span> +<span class="lineno"> 105 </span><span class="spaces"> </span><span class="nottickedoff">++ "," ++ show y</span> +<span class="lineno"> 106 </span><span class="spaces"> </span><span class="nottickedoff">++ "," ++ show z</span> +<span class="lineno"> 107 </span><span class="spaces"> </span><span class="nottickedoff">++ ") :: Point"</span> +<span class="lineno"> 108 </span><span class="spaces"></span><span class="nottickedoff">showStkEle (VObject {}) = "<Object> :: Object"</span> +<span class="lineno"> 109 </span><span class="spaces"></span><span class="nottickedoff">showStkEle (VLight {}) = "<Light> :: Object"</span> +<span class="lineno"> 110 </span><span class="spaces"></span><span class="nottickedoff">showStkEle (VAbsObj vobs) = "{{ " ++ show vobs ++ "}} :: AbsObj"</span></span> +<span class="lineno"> 111 </span> +<span class="lineno"> 112 </span>-- An abstract environment +<span class="lineno"> 113 </span> +<span class="lineno"> 114 </span>newtype Env = Env [(Name, GMLValue)] deriving <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span> +<span class="lineno"> 115 </span> +<span class="lineno"> 116 </span>emptyEnv :: Env +<span class="lineno"> 117 </span><span class="decl"><span class="nottickedoff">emptyEnv = Env []</span></span> +<span class="lineno"> 118 </span> +<span class="lineno"> 119 </span>extendEnv :: Env -> Name -> GMLValue -> Env +<span class="lineno"> 120 </span><span class="decl"><span class="istickedoff">extendEnv (Env e) n v = Env ((n, v):e)</span></span> +<span class="lineno"> 121 </span> +<span class="lineno"> 122 </span>lookupEnv :: Env -> Name -> Maybe GMLValue +<span class="lineno"> 123 </span><span class="decl"><span class="istickedoff">lookupEnv (Env e) n = lookup n e</span></span> +<span class="lineno"> 124 </span> +<span class="lineno"> 125 </span>-- All primitive operators +<span class="lineno"> 126 </span>-- +<span class="lineno"> 127 </span>-- There is no Op_apply, Op_false, Op_true and Op_if +<span class="lineno"> 128 </span>-- (because they appear explcitly in the rules). +<span class="lineno"> 129 </span> +<span class="lineno"> 130 </span>data GMLOp +<span class="lineno"> 131 </span> = Op_acos +<span class="lineno"> 132 </span> | Op_addi +<span class="lineno"> 133 </span> | Op_addf +<span class="lineno"> 134 </span> | Op_asin +<span class="lineno"> 135 </span> | Op_clampf +<span class="lineno"> 136 </span> | Op_cone +<span class="lineno"> 137 </span> | Op_cos +<span class="lineno"> 138 </span> | Op_cube +<span class="lineno"> 139 </span> | Op_cylinder +<span class="lineno"> 140 </span> | Op_difference +<span class="lineno"> 141 </span> | Op_divi +<span class="lineno"> 142 </span> | Op_divf +<span class="lineno"> 143 </span> | Op_eqi +<span class="lineno"> 144 </span> | Op_eqf +<span class="lineno"> 145 </span> | Op_floor +<span class="lineno"> 146 </span> | Op_frac +<span class="lineno"> 147 </span> | Op_get +<span class="lineno"> 148 </span> | Op_getx +<span class="lineno"> 149 </span> | Op_gety +<span class="lineno"> 150 </span> | Op_getz +<span class="lineno"> 151 </span> | Op_intersect +<span class="lineno"> 152 </span> | Op_length +<span class="lineno"> 153 </span> | Op_lessi +<span class="lineno"> 154 </span> | Op_lessf +<span class="lineno"> 155 </span> | Op_light +<span class="lineno"> 156 </span> | Op_modi +<span class="lineno"> 157 </span> | Op_muli +<span class="lineno"> 158 </span> | Op_mulf +<span class="lineno"> 159 </span> | Op_negi +<span class="lineno"> 160 </span> | Op_negf +<span class="lineno"> 161 </span> | Op_plane +<span class="lineno"> 162 </span> | Op_point +<span class="lineno"> 163 </span> | Op_pointlight +<span class="lineno"> 164 </span> | Op_real +<span class="lineno"> 165 </span> | Op_render +<span class="lineno"> 166 </span> | Op_rotatex +<span class="lineno"> 167 </span> | Op_rotatey +<span class="lineno"> 168 </span> | Op_rotatez +<span class="lineno"> 169 </span> | Op_scale +<span class="lineno"> 170 </span> | Op_sin +<span class="lineno"> 171 </span> | Op_sphere +<span class="lineno"> 172 </span> | Op_spotlight +<span class="lineno"> 173 </span> | Op_sqrt +<span class="lineno"> 174 </span> | Op_subi +<span class="lineno"> 175 </span> | Op_subf +<span class="lineno"> 176 </span> | Op_trace -- non standard, for debugging GML programs +<span class="lineno"> 177 </span> | Op_translate +<span class="lineno"> 178 </span> | Op_union +<span class="lineno"> 179 </span> | Op_uscale +<span class="lineno"> 180 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Eq</span></span></span></span>,<span class="nottickedoff"><span class="decl"><span class="nottickedoff">Ord</span></span></span>,<span class="decl"><span class="nottickedoff"><span class="decl"><span class="istickedoff"><span class="decl"><span class="istickedoff">Ix</span></span></span></span></span></span>,<span class="decl"><span class="istickedoff"><span class="decl"><span class="istickedoff">Bounded</span></span></span></span>) +<span class="lineno"> 181 </span> +<span class="lineno"> 182 </span>instance Show GMLOp where +<span class="lineno"> 183 </span> <span class="decl"><span class="nottickedoff">showsPrec _ op = showString (opNameTable ! op)</span></span> +<span class="lineno"> 184 </span> +<span class="lineno"> 185 </span> +<span class="lineno"> 186 </span>------------------------------------------------------------------------------ +<span class="lineno"> 187 </span> +<span class="lineno"> 188 </span>-- And how we use the op codes (there names, there interface) +<span class="lineno"> 189 </span> +<span class="lineno"> 190 </span>-- These keywords include, "apply", "if", "true" and "false", +<span class="lineno"> 191 </span>-- they are not parsed as operators, but are +<span class="lineno"> 192 </span>-- captured by the parser as a special case. +<span class="lineno"> 193 </span> +<span class="lineno"> 194 </span>keyWords :: [String] +<span class="lineno"> 195 </span><span class="decl"><span class="nottickedoff">keyWords = [ kwd | (kwd,_,_) <- opcodes ]</span></span> +<span class="lineno"> 196 </span> +<span class="lineno"> 197 </span>-- Lookup has to look from the start (or else...) +<span class="lineno"> 198 </span>opTable :: [(Name,GMLToken)] +<span class="lineno"> 199 </span><span class="decl"><span class="istickedoff">opTable = [ (kwd,op) | (kwd,op,_) <- opcodes ]</span></span> +<span class="lineno"> 200 </span> +<span class="lineno"> 201 </span>opNameTable :: Array GMLOp Name +<span class="lineno"> 202 </span><span class="decl"><span class="nottickedoff">opNameTable = array (minBound,maxBound) </span> +<span class="lineno"> 203 </span><span class="spaces"> </span><span class="nottickedoff">[ (op,name) | (name,TOp op,_) <- opcodes ]</span></span> +<span class="lineno"> 204 </span> +<span class="lineno"> 205 </span><span class="decl"><span class="nottickedoff">undef = error "undefined function"</span></span> +<span class="lineno"> 206 </span><span class="decl"><span class="nottickedoff">image = error "undefined function: talk to image group"</span></span> +<span class="lineno"> 207 </span> +<span class="lineno"> 208 </span>-- typically, its best to have *one* opcode table, +<span class="lineno"> 209 </span>-- so that mis-alignments do not happen. +<span class="lineno"> 210 </span> +<span class="lineno"> 211 </span>opcodes :: [(String,GMLToken,PrimOp)] +<span class="lineno"> 212 </span><span class="decl"><span class="istickedoff">opcodes =</span> +<span class="lineno"> 213 </span><span class="spaces"> </span><span class="istickedoff">[ ("apply", TApply, <span class="nottickedoff">error "incorrect use of apply"</span>)</span> +<span class="lineno"> 214 </span><span class="spaces"> </span><span class="istickedoff">, ("if", TIf, <span class="nottickedoff">error "incorrect use of if"</span>)</span> +<span class="lineno"> 215 </span><span class="spaces"> </span><span class="istickedoff">, ("false", TBool <span class="nottickedoff">False</span>, <span class="nottickedoff">error "incorrect use of false"</span>)</span> +<span class="lineno"> 216 </span><span class="spaces"> </span><span class="istickedoff">, ("true", TBool <span class="nottickedoff">True</span>, <span class="nottickedoff">error "incorrect use of true"</span>)</span> +<span class="lineno"> 217 </span><span class="spaces"> </span><span class="istickedoff">] ++ map (\ (a,b,c) -> (a,TOp b,c))</span> +<span class="lineno"> 218 </span><span class="spaces"> </span><span class="istickedoff">-- These are just invocation, any coersions need to occur between here</span> +<span class="lineno"> 219 </span><span class="spaces"> </span><span class="istickedoff">-- and before arriving at the application code (like deg -> rad).</span> +<span class="lineno"> 220 </span><span class="spaces"> </span><span class="istickedoff">[ ("acos", Op_acos, <span class="nottickedoff">Real_Real (rad2deg . acos)</span>)</span> +<span class="lineno"> 221 </span><span class="spaces"> </span><span class="istickedoff">, ("addi", Op_addi, <span class="nottickedoff">Int_Int_Int (+)</span>)</span> +<span class="lineno"> 222 </span><span class="spaces"> </span><span class="istickedoff">, ("addf", Op_addf, Real_Real_Real (+))</span> +<span class="lineno"> 223 </span><span class="spaces"> </span><span class="istickedoff">, ("asin", Op_asin, <span class="nottickedoff">Real_Real (rad2deg . asin)</span>)</span> +<span class="lineno"> 224 </span><span class="spaces"> </span><span class="istickedoff">, ("clampf", Op_clampf, <span class="nottickedoff">Real_Real clampf</span>)</span> +<span class="lineno"> 225 </span><span class="spaces"> </span><span class="istickedoff">, ("cone", Op_cone, <span class="nottickedoff">Surface_Obj cone</span>)</span> +<span class="lineno"> 226 </span><span class="spaces"> </span><span class="istickedoff">, ("cos", Op_cos, <span class="nottickedoff">Real_Real (cos . deg2rad)</span>)</span> +<span class="lineno"> 227 </span><span class="spaces"> </span><span class="istickedoff">, ("cube", Op_cube, Surface_Obj cube)</span> +<span class="lineno"> 228 </span><span class="spaces"> </span><span class="istickedoff">, ("cylinder", Op_cylinder, <span class="nottickedoff">Surface_Obj cylinder</span>)</span> +<span class="lineno"> 229 </span><span class="spaces"> </span><span class="istickedoff">, ("difference", Op_difference, <span class="nottickedoff">Obj_Obj_Obj difference</span>)</span> +<span class="lineno"> 230 </span><span class="spaces"> </span><span class="istickedoff">, ("divi", Op_divi, <span class="nottickedoff">Int_Int_Int (ourQuot)</span>)</span> +<span class="lineno"> 231 </span><span class="spaces"> </span><span class="istickedoff">, ("divf", Op_divf, Real_Real_Real (/))</span> +<span class="lineno"> 232 </span><span class="spaces"> </span><span class="istickedoff">, ("eqi", Op_eqi, Int_Int_Bool (==))</span> +<span class="lineno"> 233 </span><span class="spaces"> </span><span class="istickedoff">, ("eqf", Op_eqf, <span class="nottickedoff">Real_Real_Bool (==)</span>)</span> +<span class="lineno"> 234 </span><span class="spaces"> </span><span class="istickedoff">, ("floor", Op_floor, Real_Int floor)</span> +<span class="lineno"> 235 </span><span class="spaces"> </span><span class="istickedoff">, ("frac", Op_frac, Real_Real (snd . properFraction))</span> +<span class="lineno"> 236 </span><span class="spaces"> </span><span class="istickedoff">, ("get", Op_get, Arr_Int_Value ixGet)</span> +<span class="lineno"> 237 </span><span class="spaces"> </span><span class="istickedoff">, ("getx", Op_getx, <span class="nottickedoff">Point_Real (\ x y z -> x)</span>)</span> +<span class="lineno"> 238 </span><span class="spaces"> </span><span class="istickedoff">, ("gety", Op_gety, <span class="nottickedoff">Point_Real (\ x y z -> y)</span>)</span> +<span class="lineno"> 239 </span><span class="spaces"> </span><span class="istickedoff">, ("getz", Op_getz, <span class="nottickedoff">Point_Real (\ x y z -> z)</span>)</span> +<span class="lineno"> 240 </span><span class="spaces"> </span><span class="istickedoff">, ("intersect", Op_intersect, <span class="nottickedoff">Obj_Obj_Obj intersect</span>)</span> +<span class="lineno"> 241 </span><span class="spaces"> </span><span class="istickedoff">, ("length", Op_length, <span class="nottickedoff">Arr_Int (succ . snd . bounds)</span>)</span> +<span class="lineno"> 242 </span><span class="spaces"> </span><span class="istickedoff">, ("lessi", Op_lessi, <span class="nottickedoff">Int_Int_Bool (<)</span>)</span> +<span class="lineno"> 243 </span><span class="spaces"> </span><span class="istickedoff">, ("lessf", Op_lessf, Real_Real_Bool (<))</span> +<span class="lineno"> 244 </span><span class="spaces"> </span><span class="istickedoff">, ("light", Op_light, Point_Color_Light light)</span> +<span class="lineno"> 245 </span><span class="spaces"> </span><span class="istickedoff">, ("modi", Op_modi, Int_Int_Int (ourRem))</span> +<span class="lineno"> 246 </span><span class="spaces"> </span><span class="istickedoff">, ("muli", Op_muli, <span class="nottickedoff">Int_Int_Int (*)</span>)</span> +<span class="lineno"> 247 </span><span class="spaces"> </span><span class="istickedoff">, ("mulf", Op_mulf, Real_Real_Real (*))</span> +<span class="lineno"> 248 </span><span class="spaces"> </span><span class="istickedoff">, ("negi", Op_negi, <span class="nottickedoff">Int_Int negate</span>)</span> +<span class="lineno"> 249 </span><span class="spaces"> </span><span class="istickedoff">, ("negf", Op_negf, <span class="nottickedoff">Real_Real negate</span>)</span> +<span class="lineno"> 250 </span><span class="spaces"> </span><span class="istickedoff">, ("plane", Op_plane, Surface_Obj plane)</span> +<span class="lineno"> 251 </span><span class="spaces"> </span><span class="istickedoff">, ("point", Op_point, Real_Real_Real_Point VPoint)</span> +<span class="lineno"> 252 </span><span class="spaces"> </span><span class="istickedoff">, ("pointlight", Op_pointlight, <span class="nottickedoff">Point_Color_Light pointlight</span>)</span> +<span class="lineno"> 253 </span><span class="spaces"> </span><span class="istickedoff">, ("real", Op_real, Int_Real fromIntegral)</span> +<span class="lineno"> 254 </span><span class="spaces"> </span><span class="istickedoff">, ("render", Op_render, Render $ render eye)</span> +<span class="lineno"> 255 </span><span class="spaces"> </span><span class="istickedoff">, ("rotatex", Op_rotatex, Obj_Real_Obj (\ o d -> rotateX (deg2rad d) o))</span> +<span class="lineno"> 256 </span><span class="spaces"> </span><span class="istickedoff">, ("rotatey", Op_rotatey, Obj_Real_Obj (\ o d -> rotateY (deg2rad d) o)) </span> +<span class="lineno"> 257 </span><span class="spaces"> </span><span class="istickedoff">, ("rotatez", Op_rotatez, <span class="nottickedoff">Obj_Real_Obj (\ o d -> rotateZ (deg2rad d) o)</span>)</span> +<span class="lineno"> 258 </span><span class="spaces"> </span><span class="istickedoff">, ("scale", Op_scale, <span class="nottickedoff">Obj_Real_Real_Real_Obj (\ o x y z -> scale (x,y,z) o)</span>)</span> +<span class="lineno"> 259 </span><span class="spaces"> </span><span class="istickedoff">, ("sin", Op_sin, <span class="nottickedoff">Real_Real (sin . deg2rad)</span>)</span> +<span class="lineno"> 260 </span><span class="spaces"> </span><span class="istickedoff">, ("sphere", Op_sphere, <span class="nottickedoff">Surface_Obj sphere'</span>) -- see comment at end of file</span> +<span class="lineno"> 261 </span><span class="spaces"> </span><span class="istickedoff">, ("spotlight", Op_spotlight, <span class="nottickedoff">Point_Point_Color_Real_Real_Light mySpotlight</span>)</span> +<span class="lineno"> 262 </span><span class="spaces"> </span><span class="istickedoff">, ("sqrt", Op_sqrt, <span class="nottickedoff">Real_Real ourSqrt</span>)</span> +<span class="lineno"> 263 </span><span class="spaces"> </span><span class="istickedoff">, ("subi", Op_subi, <span class="nottickedoff">Int_Int_Int (-)</span>)</span> +<span class="lineno"> 264 </span><span class="spaces"> </span><span class="istickedoff">, ("subf", Op_subf, <span class="nottickedoff">Real_Real_Real (-)</span>)</span> +<span class="lineno"> 265 </span><span class="spaces"> </span><span class="istickedoff">, ("trace", Op_trace, <span class="nottickedoff">Value_String_Value mytrace</span>)</span> +<span class="lineno"> 266 </span><span class="spaces"> </span><span class="istickedoff">, ("translate", Op_translate, Obj_Real_Real_Real_Obj (\ o x y z -> translate (x,y,z) o))</span> +<span class="lineno"> 267 </span><span class="spaces"> </span><span class="istickedoff">, ("union", Op_union, Obj_Obj_Obj union)</span> +<span class="lineno"> 268 </span><span class="spaces"> </span><span class="istickedoff">, ("uscale", Op_uscale, Obj_Real_Obj (\ o r -> uscale r o))</span> +<span class="lineno"> 269 </span><span class="spaces"> </span><span class="istickedoff">]</span></span> +<span class="lineno"> 270 </span> +<span class="lineno"> 271 </span>-- This enumerate all possible ways of calling the fixed primitives +<span class="lineno"> 272 </span> +<span class="lineno"> 273 </span>-- The datatype captures the type at the *interp* level, +<span class="lineno"> 274 </span>-- the type of the functional is mirrored on this (using Haskell types). +<span class="lineno"> 275 </span> +<span class="lineno"> 276 </span>data PrimOp +<span class="lineno"> 277 </span> +<span class="lineno"> 278 </span> -- 1 argument +<span class="lineno"> 279 </span> = Int_Int (Int -> Int) +<span class="lineno"> 280 </span> | Real_Real (Double -> Double) +<span class="lineno"> 281 </span> | Point_Real (Double -> Double -> Double -> Double) +<span class="lineno"> 282 </span> | Surface_Obj (SurfaceFn Color Double -> Object) +<span class="lineno"> 283 </span> | Real_Int (Double -> Int) +<span class="lineno"> 284 </span> | Int_Real (Int -> Double) +<span class="lineno"> 285 </span> | Arr_Int (Array Int GMLValue -> Int) +<span class="lineno"> 286 </span> +<span class="lineno"> 287 </span> -- 2 arguments +<span class="lineno"> 288 </span> | Int_Int_Int (Int -> Int -> Int) +<span class="lineno"> 289 </span> | Int_Int_Bool (Int -> Int -> Bool) +<span class="lineno"> 290 </span> | Real_Real_Real (Double -> Double -> Double) +<span class="lineno"> 291 </span> | Real_Real_Bool (Double -> Double -> Bool) +<span class="lineno"> 292 </span> | Arr_Int_Value (Array Int GMLValue -> Int -> GMLValue) +<span class="lineno"> 293 </span> +<span class="lineno"> 294 </span> -- Many arguments, typically image mangling +<span class="lineno"> 295 </span> +<span class="lineno"> 296 </span> | Obj_Obj_Obj (Object -> Object -> Object) +<span class="lineno"> 297 </span> | Point_Color_Light (Coords -> Color -> Light) +<span class="lineno"> 298 </span> | Real_Real_Real_Point (Double -> Double -> Double -> GMLValue) +<span class="lineno"> 299 </span> | Obj_Real_Obj (Object -> Double -> Object) +<span class="lineno"> 300 </span> | Obj_Real_Real_Real_Obj (Object -> Double -> Double -> Double -> Object) +<span class="lineno"> 301 </span> | Value_String_Value (GMLValue -> String -> GMLValue) +<span class="lineno"> 302 </span> +<span class="lineno"> 303 </span> | Point_Point_Color_Real_Real_Light +<span class="lineno"> 304 </span> (Coords -> Coords -> Color -> Radian -> Radian -> Light) +<span class="lineno"> 305 </span> -- And finally render +<span class="lineno"> 306 </span> | Render (Color -> [Light] -> Object -> Int -> Double -> Int -> Int -> String -> IO ()) +<span class="lineno"> 307 </span> +<span class="lineno"> 308 </span>data Type +<span class="lineno"> 309 </span> = TyBool +<span class="lineno"> 310 </span> | TyInt +<span class="lineno"> 311 </span> | TyReal +<span class="lineno"> 312 </span> | TyString +<span class="lineno"> 313 </span> | TyCode +<span class="lineno"> 314 </span> | TyArray +<span class="lineno"> 315 </span> | TyPoint +<span class="lineno"> 316 </span> | TyObject +<span class="lineno"> 317 </span> | TyLight +<span class="lineno"> 318 </span> | TyAlpha +<span class="lineno"> 319 </span> | TyAbsObj +<span class="lineno"> 320 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Eq</span></span></span></span>,<span class="nottickedoff"><span class="decl"><span class="nottickedoff">Ord</span></span></span>,<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Ix</span></span></span></span></span></span>,<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Bounded</span></span></span></span>) +<span class="lineno"> 321 </span> +<span class="lineno"> 322 </span><span class="decl"><span class="nottickedoff">typeTable = </span> +<span class="lineno"> 323 </span><span class="spaces"> </span><span class="nottickedoff">[ ( TyBool, "Bool")</span> +<span class="lineno"> 324 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyInt, "Int")</span> +<span class="lineno"> 325 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyReal, "Real")</span> +<span class="lineno"> 326 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyString, "String")</span> +<span class="lineno"> 327 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyCode, "Code")</span> +<span class="lineno"> 328 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyArray, "Array")</span> +<span class="lineno"> 329 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyPoint, "Point")</span> +<span class="lineno"> 330 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyObject, "Object")</span> +<span class="lineno"> 331 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyLight, "Light")</span> +<span class="lineno"> 332 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyAlpha, "<anything>")</span> +<span class="lineno"> 333 </span><span class="spaces"> </span><span class="nottickedoff">, ( TyAbsObj, "<abs>")</span> +<span class="lineno"> 334 </span><span class="spaces"> </span><span class="nottickedoff">]</span></span> +<span class="lineno"> 335 </span> +<span class="lineno"> 336 </span><span class="decl"><span class="nottickedoff">typeNames = array (minBound,maxBound) typeTable</span></span> +<span class="lineno"> 337 </span> +<span class="lineno"> 338 </span>instance Show Type where +<span class="lineno"> 339 </span> <span class="decl"><span class="nottickedoff">showsPrec _ op = showString (typeNames ! op)</span></span> +<span class="lineno"> 340 </span> +<span class="lineno"> 341 </span>getPrimOpType :: PrimOp -> [Type] +<span class="lineno"> 342 </span><span class="decl"><span class="nottickedoff">getPrimOpType (Int_Int _) = [TyInt]</span> +<span class="lineno"> 343 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Real_Real _) = [TyReal]</span> +<span class="lineno"> 344 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Point_Real _) = [TyPoint]</span> +<span class="lineno"> 345 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Surface_Obj _) = [TyCode]</span> +<span class="lineno"> 346 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Real_Int _) = [TyReal]</span> +<span class="lineno"> 347 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Int_Real _) = [TyInt]</span> +<span class="lineno"> 348 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Arr_Int _) = [TyArray]</span> +<span class="lineno"> 349 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Int_Int_Int _) = [TyInt,TyInt]</span> +<span class="lineno"> 350 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Int_Int_Bool _) = [TyInt,TyInt]</span> +<span class="lineno"> 351 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Real_Real_Real _) = [TyReal,TyReal]</span> +<span class="lineno"> 352 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Real_Real_Bool _) = [TyReal,TyReal]</span> +<span class="lineno"> 353 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Arr_Int_Value _) = [TyArray,TyInt]</span> +<span class="lineno"> 354 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Obj_Obj_Obj _) = [TyObject,TyObject]</span> +<span class="lineno"> 355 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Point_Color_Light _) = [TyPoint,TyPoint]</span> +<span class="lineno"> 356 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Real_Real_Real_Point _) = [TyReal,TyReal,TyReal]</span> +<span class="lineno"> 357 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Obj_Real_Obj _) = [TyObject,TyReal]</span> +<span class="lineno"> 358 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Obj_Real_Real_Real_Obj _) = [TyObject,TyReal,TyReal,TyReal]</span> +<span class="lineno"> 359 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Value_String_Value _) = [TyAlpha,TyString]</span> +<span class="lineno"> 360 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Point_Point_Color_Real_Real_Light _) </span> +<span class="lineno"> 361 </span><span class="spaces"> </span><span class="nottickedoff">= [TyPoint,TyPoint,TyPoint,TyReal,TyReal]</span> +<span class="lineno"> 362 </span><span class="spaces"></span><span class="nottickedoff">getPrimOpType (Render _) = [TyPoint,</span> +<span class="lineno"> 363 </span><span class="spaces"> </span><span class="nottickedoff">TyLight,</span> +<span class="lineno"> 364 </span><span class="spaces"> </span><span class="nottickedoff">TyObject,</span> +<span class="lineno"> 365 </span><span class="spaces"> </span><span class="nottickedoff">TyInt,</span> +<span class="lineno"> 366 </span><span class="spaces"> </span><span class="nottickedoff">TyReal,</span> +<span class="lineno"> 367 </span><span class="spaces"> </span><span class="nottickedoff">TyReal,</span> +<span class="lineno"> 368 </span><span class="spaces"> </span><span class="nottickedoff">TyReal,</span> +<span class="lineno"> 369 </span><span class="spaces"> </span><span class="nottickedoff">TyString]</span></span> +<span class="lineno"> 370 </span> +<span class="lineno"> 371 </span> +<span class="lineno"> 372 </span>-- Some primitives with better error message +<span class="lineno"> 373 </span> +<span class="lineno"> 374 </span><span class="decl"><span class="nottickedoff">mytrace v s = trace (s ++" : "++ show v ++ "\n") v</span></span> +<span class="lineno"> 375 </span> +<span class="lineno"> 376 </span> +<span class="lineno"> 377 </span>ixGet :: Array Int GMLValue -> Int -> GMLValue +<span class="lineno"> 378 </span><span class="decl"><span class="istickedoff">ixGet arr i</span> +<span class="lineno"> 379 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">inRange (bounds arr) i</span> = arr ! i</span> +<span class="lineno"> 380 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">error ("failed access with index value " </span></span> +<span class="lineno"> 381 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">++ show i </span></span> +<span class="lineno"> 382 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">++ " (should be between 0 and " </span></span> +<span class="lineno"> 383 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">++ show (snd (bounds arr)) ++ ")")</span></span></span> +<span class="lineno"> 384 </span> +<span class="lineno"> 385 </span>ourQuot :: Int -> Int -> Int +<span class="lineno"> 386 </span><span class="decl"><span class="nottickedoff">ourQuot _ 0 = error "attempt to use divi to divide by 0"</span> +<span class="lineno"> 387 </span><span class="spaces"></span><span class="nottickedoff">ourQuot a b = a `quot` b</span></span> +<span class="lineno"> 388 </span> +<span class="lineno"> 389 </span>ourRem :: Int -> Int -> Int +<span class="lineno"> 390 </span><span class="decl"><span class="istickedoff">ourRem _ 0 = <span class="nottickedoff">error "attempt to use remi to divide by 0"</span></span> +<span class="lineno"> 391 </span><span class="spaces"></span><span class="istickedoff">ourRem a b = a `rem` b</span></span> +<span class="lineno"> 392 </span> +<span class="lineno"> 393 </span>ourSqrt :: Double -> Double +<span class="lineno"> 394 </span><span class="decl"><span class="nottickedoff">ourSqrt n | n < 0 = error "attempt to use sqrt on a negative number"</span> +<span class="lineno"> 395 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = sqrt n</span></span> +<span class="lineno"> 396 </span> +<span class="lineno"> 397 </span> +<span class="lineno"> 398 </span><span class="decl"><span class="nottickedoff">mySpotlight p1 p2 col cutoff exp = spotlight p1 p2 col (deg2rad cutoff) exp</span></span> +<span class="lineno"> 399 </span> +<span class="lineno"> 400 </span>-- The problem specification gets the mapping for spheres backwards +<span class="lineno"> 401 </span>-- (it maps the image from right to left). +<span class="lineno"> 402 </span>-- We've fixed that in the raytracing library so that it goes from left +<span class="lineno"> 403 </span>-- to right, but to keep the GML front compatible with the problem +<span class="lineno"> 404 </span>-- statement, we reverse it here. +<span class="lineno"> 405 </span> +<span class="lineno"> 406 </span>sphere' :: SurfaceFn Color Double -> CSG (SurfaceFn Color Double) +<span class="lineno"> 407 </span><span class="decl"><span class="nottickedoff">sphere' (SFun f) = sphere (SFun (\i u v -> f i (1 - u) v))</span> +<span class="lineno"> 408 </span><span class="spaces"></span><span class="nottickedoff">sphere' s = sphere s</span></span> + +</pre> +</html> +Writing: Illumination.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>-- Modified to use stdout (for testing) +<span class="lineno"> 7 </span> +<span class="lineno"> 8 </span>module Illumination +<span class="lineno"> 9 </span> ( Object +<span class="lineno"> 10 </span> , Light (..) +<span class="lineno"> 11 </span> , light, pointlight, spotlight +<span class="lineno"> 12 </span> , render +<span class="lineno"> 13 </span> ) where +<span class="lineno"> 14 </span> +<span class="lineno"> 15 </span>import Array +<span class="lineno"> 16 </span>import Char(chr) +<span class="lineno"> 17 </span>import Maybe +<span class="lineno"> 18 </span> +<span class="lineno"> 19 </span>import Geometry +<span class="lineno"> 20 </span>import CSG +<span class="lineno"> 21 </span>import Surface +<span class="lineno"> 22 </span>import Misc +<span class="lineno"> 23 </span> +<span class="lineno"> 24 </span>type Object = CSG (SurfaceFn Color Double) +<span class="lineno"> 25 </span> +<span class="lineno"> 26 </span>data Cxt = Cxt {ambient::Color, lights::[Light], object::Object, depth::Int} +<span class="lineno"> 27 </span> deriving <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span> +<span class="lineno"> 28 </span> +<span class="lineno"> 29 </span>render :: (Matrix,Matrix) -> Color -> [Light] -> Object -> Int -> +<span class="lineno"> 30 </span> Radian -> Int -> Int -> String -> IO () +<span class="lineno"> 31 </span><span class="decl"><span class="istickedoff">render (m,m') amb ls obj dep fov wid ht file</span> +<span class="lineno"> 32 </span><span class="spaces"> </span><span class="istickedoff">= do { debugging</span> +<span class="lineno"> 33 </span><span class="spaces"> </span><span class="istickedoff">; txt <- readFile "galois.sample"</span> +<span class="lineno"> 34 </span><span class="spaces"> </span><span class="istickedoff">; let vals = read txt</span> +<span class="lineno"> 35 </span><span class="spaces"> </span><span class="istickedoff">; let rt_vals = showBitmap' <span class="nottickedoff">wid</span> <span class="nottickedoff">ht</span> pixels</span> +<span class="lineno"> 36 </span><span class="spaces"> </span><span class="istickedoff">; if <span class="tickonlyfalse">length vals /= length rt_vals</span></span> +<span class="lineno"> 37 </span><span class="spaces"> </span><span class="istickedoff">then <span class="nottickedoff">print ("BAD LENGTH",length vals,length rt_vals)</span></span> +<span class="lineno"> 38 </span><span class="spaces"> </span><span class="istickedoff">else do {</span> +<span class="lineno"> 39 </span><span class="spaces"> </span><span class="istickedoff">; let cmp = sum(zipWith (\ a b -> abs (a - b) * abs (a - b)) vals rt_vals)</span> +<span class="lineno"> 40 </span><span class="spaces"> </span><span class="istickedoff">; print $ if <span class="tickonlytrue">cmp <= (length vals * 16)</span> then ("GOOD MATCH") else <span class="nottickedoff">("BAD MATCH:" ++ show cmp)</span></span> +<span class="lineno"> 41 </span><span class="spaces"> </span><span class="istickedoff">}}</span> +<span class="lineno"> 42 </span><span class="spaces"> </span><span class="istickedoff"></span> +<span class="lineno"> 43 </span><span class="spaces"> </span><span class="istickedoff">where</span> +<span class="lineno"> 44 </span><span class="spaces"> </span><span class="istickedoff">debugging = return <span class="nottickedoff">()</span></span> +<span class="lineno"> 45 </span><span class="spaces"></span><span class="istickedoff">{-</span> +<span class="lineno"> 46 </span><span class="spaces"> </span><span class="istickedoff">do { putStrLn (show cxt)</span> +<span class="lineno"> 47 </span><span class="spaces"> </span><span class="istickedoff">; putStrLn (show (width, delta, aspect, left, top))</span> +<span class="lineno"> 48 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 49 </span><span class="spaces"></span><span class="istickedoff">-}</span> +<span class="lineno"> 50 </span><span class="spaces"> </span><span class="istickedoff">obj' = transform (m',m) obj</span> +<span class="lineno"> 51 </span><span class="spaces"> </span><span class="istickedoff">ls' = [ transformLight m' l | l <- ls ]</span> +<span class="lineno"> 52 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">pixelA = listArray ((1,1), (ht,wid))</span></span> +<span class="lineno"> 53 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">[ illumination cxt (start,pixel i j)</span></span> +<span class="lineno"> 54 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">| j <- take ht [0.5..]</span></span> +<span class="lineno"> 55 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">, i <- take wid [0.5..] ]</span></span> +<span class="lineno"> 56 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">antiA = pixelA //</span></span> +<span class="lineno"> 57 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">[ (ix, superSample ix (pixelA ! ix))</span></span> +<span class="lineno"> 58 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">| j <- [2 .. ht - 1], i <- [2 .. wid - 1]</span></span> +<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">, let ix = (j, i)</span></span> +<span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">, contrast ix pixelA ]</span></span> +<span class="lineno"> 61 </span><span class="spaces"> </span><span class="istickedoff">pixels = [ [ illumination cxt (start,pixel i j) | i<- take wid [0.5..] ]</span> +<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">| j <- take ht [0.5..]</span> +<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff">]</span> +<span class="lineno"> 64 </span><span class="spaces"> </span><span class="istickedoff">cxt = Cxt {ambient=amb, lights=ls', object=obj', depth=dep}</span> +<span class="lineno"> 65 </span><span class="spaces"> </span><span class="istickedoff">start = point 0 0 (-1)</span> +<span class="lineno"> 66 </span><span class="spaces"> </span><span class="istickedoff">width = 2 * tan (fov/2)</span> +<span class="lineno"> 67 </span><span class="spaces"> </span><span class="istickedoff">delta = width / fromIntegral wid</span> +<span class="lineno"> 68 </span><span class="spaces"> </span><span class="istickedoff">aspect = fromIntegral ht / fromIntegral wid</span> +<span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff">left = - width / 2</span> +<span class="lineno"> 70 </span><span class="spaces"> </span><span class="istickedoff">top = - left * aspect</span> +<span class="lineno"> 71 </span><span class="spaces"> </span><span class="istickedoff">pixel i j = vector (left + i*delta) (top - j*delta) 1</span> +<span class="lineno"> 72 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 73 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">superSample (y, x) col = avg $ col:</span></span> +<span class="lineno"> 74 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">[ illumination cxt (start, pixel (fromIntegral x - 0.5 + xd) (fromIntegral y - 0.5 + yd))</span></span> +<span class="lineno"> 75 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">| (xd, yd) <- [(-0.333, 0.0), (0.333, 0.0), (0.0, -0.333), (0.0, 0.333)]</span></span> +<span class="lineno"> 76 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">]</span></span></span> +<span class="lineno"> 77 </span> +<span class="lineno"> 78 </span><span class="decl"><span class="nottickedoff">avg cs = divN (fromIntegral (length cs)) (uncolor (sumCC cs))</span> +<span class="lineno"> 79 </span><span class="spaces"> </span><span class="nottickedoff">where divN n (r,g,b) = color (r / n) (g / n) (b / n)</span></span> +<span class="lineno"> 80 </span> +<span class="lineno"> 81 </span>contrast :: (Int, Int) -> Array (Int, Int) Color -> Bool +<span class="lineno"> 82 </span><span class="decl"><span class="nottickedoff">contrast (x, y) arr = any diffMax [ subCC cur (arr ! (x + xd, y + yd))</span> +<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">| xd <- [-1, 1], yd <- [-1, 1]</span> +<span class="lineno"> 84 </span><span class="spaces"> </span><span class="nottickedoff">]</span> +<span class="lineno"> 85 </span><span class="spaces"> </span><span class="nottickedoff">where cur = arr ! (x, y)</span> +<span class="lineno"> 86 </span><span class="spaces"> </span><span class="nottickedoff">diffMax col = (abs r) > 0.25 || (abs g) > 0.2 || (abs b) > 0.4</span> +<span class="lineno"> 87 </span><span class="spaces"> </span><span class="nottickedoff">where</span> +<span class="lineno"> 88 </span><span class="spaces"> </span><span class="nottickedoff">(r,g,b) = uncolor col</span></span> +<span class="lineno"> 89 </span> +<span class="lineno"> 90 </span> +<span class="lineno"> 91 </span>illumination :: Cxt -> Ray -> Color +<span class="lineno"> 92 </span><span class="decl"><span class="istickedoff">illumination cxt (r,v)</span> +<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">depth cxt <= 0</span> = <span class="nottickedoff">black</span></span> +<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = case castRay (r,v) (object cxt) of</span> +<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">Nothing -> black</span> +<span class="lineno"> 96 </span><span class="spaces"> </span><span class="istickedoff">Just info -> illum (cxt{depth=(depth cxt)-1}) info v</span></span> +<span class="lineno"> 97 </span> +<span class="lineno"> 98 </span>illum :: Cxt -> (Point,Vector,Properties Color Double) -> Vector -> Color +<span class="lineno"> 99 </span><span class="decl"><span class="istickedoff">illum cxt (pos,normV,(col,kd,ks,n)) v</span> +<span class="lineno"> 100 </span><span class="spaces"> </span><span class="istickedoff">= ambTerm `addCC` difTerm `addCC` spcTerm `addCC` recTerm</span> +<span class="lineno"> 101 </span><span class="spaces"> </span><span class="istickedoff">where</span> +<span class="lineno"> 102 </span><span class="spaces"> </span><span class="istickedoff">visibleLights = unobscured pos (object cxt) (lights cxt) normV</span> +<span class="lineno"> 103 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">d = depth cxt</span></span> +<span class="lineno"> 104 </span><span class="spaces"> </span><span class="istickedoff">amb = ambient cxt</span> +<span class="lineno"> 105 </span><span class="spaces"> </span><span class="istickedoff">newV = subVV v (multSV (2 * dot normV v) normV)</span> +<span class="lineno"> 106 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 107 </span><span class="spaces"> </span><span class="istickedoff">ambTerm = multSC kd (multCC amb col)</span> +<span class="lineno"> 108 </span><span class="spaces"> </span><span class="istickedoff">difTerm = multSC kd (sumCC [multSC (dot normV lj) (multCC intensity col)</span> +<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff">|(loc,intensity) <- visibleLights,</span> +<span class="lineno"> 110 </span><span class="spaces"> </span><span class="istickedoff">let lj = normalize ({- pos `subVV` -} loc)])</span> +<span class="lineno"> 111 </span><span class="spaces"> </span><span class="istickedoff">-- ZZ might want to avoid the phong, when you can...</span> +<span class="lineno"> 112 </span><span class="spaces"> </span><span class="istickedoff">spcTerm = multSC ks (sumCC [multSC ((dot normV hj) ** n ) (multCC intensity col)</span> +<span class="lineno"> 113 </span><span class="spaces"> </span><span class="istickedoff">|(loc,intensity) <- visibleLights,</span> +<span class="lineno"> 114 </span><span class="spaces"> </span><span class="istickedoff">-- ZZ note this is specific to the light at infinity</span> +<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff">let lj = {- pos `subVV` -} normalize loc,</span> +<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff">let hj = normalize (lj `subVV` normalize v)])</span> +<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff">recTerm = if recCoeff `nearC` black then black else multCC recCoeff recRay</span> +<span class="lineno"> 118 </span><span class="spaces"> </span><span class="istickedoff">recCoeff = multSC ks col</span> +<span class="lineno"> 119 </span><span class="spaces"> </span><span class="istickedoff">recRay = illumination cxt (pos,newV)</span></span> +<span class="lineno"> 120 </span> +<span class="lineno"> 121 </span>showBitmapA :: Int -> Int -> Array (Int, Int) Color -> String +<span class="lineno"> 122 </span><span class="decl"><span class="nottickedoff">showBitmapA wid ht arr</span> +<span class="lineno"> 123 </span><span class="spaces"> </span><span class="nottickedoff">= header ++ concatMap scaleColor (elems arr)</span> +<span class="lineno"> 124 </span><span class="spaces"> </span><span class="nottickedoff">where</span> +<span class="lineno"> 125 </span><span class="spaces"> </span><span class="nottickedoff">scaleColor col = [scalePixel r, scalePixel g, scalePixel b]</span> +<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">where (r,g,b) = uncolor col</span> +<span class="lineno"> 127 </span><span class="spaces"> </span><span class="nottickedoff">header = "P6\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n"</span></span> +<span class="lineno"> 128 </span> +<span class="lineno"> 129 </span>showBitmap :: Int -> Int ->[[Color]] -> String +<span class="lineno"> 130 </span><span class="decl"><span class="nottickedoff">showBitmap wid ht pss</span> +<span class="lineno"> 131 </span><span class="spaces"></span><span class="nottickedoff">-- type of assert | length pss == ht && all (\ ps -> length ps == wid) pss</span> +<span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">= header ++ concat [[scalePixel r,scalePixel g,scalePixel b] </span> +<span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">| ps <- pss, (r,g,b) <- map uncolor ps]</span> +<span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">where</span> +<span class="lineno"> 135 </span><span class="spaces"> </span><span class="nottickedoff">header = "P6\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n"</span> +<span class="lineno"> 136 </span><span class="spaces"></span><span class="nottickedoff">showBitmap _ _ _ = error "incorrect length of bitmap string"</span></span> +<span class="lineno"> 137 </span> +<span class="lineno"> 138 </span>scalePixel :: Double -> Char +<span class="lineno"> 139 </span><span class="decl"><span class="nottickedoff">scalePixel p = chr (floor (clampf p * 255))</span></span> +<span class="lineno"> 140 </span> +<span class="lineno"> 141 </span>showBitmap' :: Int -> Int ->[[Color]] -> [Int] +<span class="lineno"> 142 </span><span class="decl"><span class="istickedoff">showBitmap' wid ht pss</span> +<span class="lineno"> 143 </span><span class="spaces"></span><span class="istickedoff">-- type of assert | length pss == ht && all (\ ps -> length ps == wid) pss</span> +<span class="lineno"> 144 </span><span class="spaces"> </span><span class="istickedoff">= concat [ concat [ [scalePixel' r,scalePixel' g,scalePixel' b]</span> +<span class="lineno"> 145 </span><span class="spaces"> </span><span class="istickedoff">| (r,g,b) <- map uncolor ps]</span> +<span class="lineno"> 146 </span><span class="spaces"> </span><span class="istickedoff">| ps <- pss ]</span> +<span class="lineno"> 147 </span><span class="spaces"> </span><span class="istickedoff">where</span> +<span class="lineno"> 148 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">header = "P3\n#Galois\n" ++ show wid ++ " " ++ show ht ++ "\n255\n"</span></span> +<span class="lineno"> 149 </span><span class="spaces"></span><span class="istickedoff">showBitmap' _ _ _ = <span class="nottickedoff">error "incorrect length of bitmap string"</span></span></span> +<span class="lineno"> 150 </span> +<span class="lineno"> 151 </span>scalePixel' :: Double -> Int +<span class="lineno"> 152 </span><span class="decl"><span class="istickedoff">scalePixel' p = floor (clampf p * 255)</span></span> +<span class="lineno"> 153 </span> +<span class="lineno"> 154 </span>-- Lights +<span class="lineno"> 155 </span> +<span class="lineno"> 156 </span>data Light = Light Vector Color +<span class="lineno"> 157 </span> | PointLight Point Color +<span class="lineno"> 158 </span> | SpotLight Point Point Color Radian Double +<span class="lineno"> 159 </span> deriving <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span> +<span class="lineno"> 160 </span> +<span class="lineno"> 161 </span>light :: Coords -> Color -> Light +<span class="lineno"> 162 </span><span class="decl"><span class="istickedoff">light (x,y,z) color =</span> +<span class="lineno"> 163 </span><span class="spaces"> </span><span class="istickedoff">Light (normalize (vector (-x) (-y) (-z))) color</span></span> +<span class="lineno"> 164 </span><span class="decl"><span class="nottickedoff">pointlight (x,y,z) color =</span> +<span class="lineno"> 165 </span><span class="spaces"> </span><span class="nottickedoff">PointLight (point x y z) color</span></span> +<span class="lineno"> 166 </span><span class="decl"><span class="nottickedoff">spotlight (x,y,z) (p,q,r) col cutoff exp =</span> +<span class="lineno"> 167 </span><span class="spaces"> </span><span class="nottickedoff">SpotLight (point x y z) (point p q r) col cutoff exp</span></span> +<span class="lineno"> 168 </span> +<span class="lineno"> 169 </span><span class="decl"><span class="istickedoff">transformLight m (Light v c) = Light (multMV m v) c</span> +<span class="lineno"> 170 </span><span class="spaces"></span><span class="istickedoff">transformLight m (PointLight p c) = <span class="nottickedoff">PointLight (multMP m p) c</span></span> +<span class="lineno"> 171 </span><span class="spaces"></span><span class="istickedoff">transformLight m (SpotLight p q c r d) = <span class="nottickedoff">SpotLight (multMP m p) (multMP m q) c r d</span></span></span> +<span class="lineno"> 172 </span> +<span class="lineno"> 173 </span>unobscured :: Point -> Object -> [Light] -> Vector -> [(Vector,Color)] +<span class="lineno"> 174 </span><span class="decl"><span class="istickedoff">unobscured pos obj lights normV = catMaybes (map (unobscure pos obj normV) lights)</span></span> +<span class="lineno"> 175 </span> +<span class="lineno"> 176 </span>unobscure :: Point -> Object -> Vector -> Light -> Maybe (Vector,Color) +<span class="lineno"> 177 </span><span class="decl"><span class="istickedoff">unobscure pos obj normV (Light vec color)</span> +<span class="lineno"> 178 </span><span class="spaces"> </span><span class="istickedoff">-- ZZ probably want to make this faster</span> +<span class="lineno"> 179 </span><span class="spaces"> </span><span class="istickedoff">| vec `dot` normV < 0 = Nothing</span> +<span class="lineno"> 180 </span><span class="spaces"> </span><span class="istickedoff">| intersects (pos `addPV` (0.0001 `multSV` vec),vec) obj = Nothing</span> +<span class="lineno"> 181 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = Just (vec,color)</span> +<span class="lineno"> 182 </span><span class="spaces"></span><span class="istickedoff">unobscure pos obj normV (PointLight pp color)</span> +<span class="lineno"> 183 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">vec `dot` normV < 0</span> = <span class="nottickedoff">Nothing</span></span> +<span class="lineno"> 184 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">intersectWithin (pos `addPV` (0.0001 `multSV` (normalize vec)), vec) obj</span> = <span class="nottickedoff">Nothing</span></span> +<span class="lineno"> 185 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">Just (vec,is)</span></span> +<span class="lineno"> 186 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">vec = pp `subPP` pos</span></span> +<span class="lineno"> 187 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">is = attenuate vec color</span></span> +<span class="lineno"> 188 </span><span class="spaces"></span><span class="istickedoff">unobscure org obj normV (SpotLight pos at color cutoff exp)</span> +<span class="lineno"> 189 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">vec `dot` normV < 0</span> = <span class="nottickedoff">Nothing</span></span> +<span class="lineno"> 190 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">intersectWithin (org `addPV` (0.0001 `multSV` (normalize vec)), vec) obj</span> = <span class="nottickedoff">Nothing</span></span> +<span class="lineno"> 191 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">angle > cutoff</span> = <span class="nottickedoff">Nothing</span></span> +<span class="lineno"> 192 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">Just (vec, is)</span></span> +<span class="lineno"> 193 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">vec = pos `subPP` org</span></span> +<span class="lineno"> 194 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">vec' = pos `subPP` at</span></span> +<span class="lineno"> 195 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">angle = acos (normalize vec `dot` (normalize vec'))</span></span> +<span class="lineno"> 196 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 197 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">asp = normalize (at `subPP` pos)</span> </span> +<span class="lineno"> 198 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">qsp = normalize (org `subPP` pos)</span></span> +<span class="lineno"> 199 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">is = attenuate vec (((asp `dot` qsp) ** exp) `multSC` color)</span></span></span> +<span class="lineno"> 200 </span> +<span class="lineno"> 201 </span>attenuate :: Vector -> Color -> Color +<span class="lineno"> 202 </span><span class="decl"><span class="nottickedoff">attenuate vec color = (100 / (99 + sq (norm vec))) `multSC` color</span></span> +<span class="lineno"> 203 </span> +<span class="lineno"> 204 </span>-- +<span class="lineno"> 205 </span> +<span class="lineno"> 206 </span><span class="decl"><span class="istickedoff">castRay ray p</span> +<span class="lineno"> 207 </span><span class="spaces"> </span><span class="istickedoff">= case intersectRayWithObject ray p of</span> +<span class="lineno"> 208 </span><span class="spaces"> </span><span class="istickedoff">(True, _, _) -> <span class="nottickedoff">Nothing</span> -- eye is inside</span> +<span class="lineno"> 209 </span><span class="spaces"> </span><span class="istickedoff">(False, [], _) -> Nothing -- eye is inside</span> +<span class="lineno"> 210 </span><span class="spaces"> </span><span class="istickedoff">(False, (0, b, _) : _, _) -> <span class="nottickedoff">Nothing</span> -- eye is inside</span> +<span class="lineno"> 211 </span><span class="spaces"> </span><span class="istickedoff">(False, (i, False, _) : _, _) -> <span class="nottickedoff">Nothing</span> -- eye is inside</span> +<span class="lineno"> 212 </span><span class="spaces"> </span><span class="istickedoff">(False, (t, b, (s, p0)) : _, _) -></span> +<span class="lineno"> 213 </span><span class="spaces"> </span><span class="istickedoff">let (v, prop) = surface s p0 in</span> +<span class="lineno"> 214 </span><span class="spaces"> </span><span class="istickedoff">Just (offsetToPoint ray t, v, prop)</span></span> +<span class="lineno"> 215 </span> +<span class="lineno"> 216 </span><span class="decl"><span class="istickedoff">intersects ray p</span> +<span class="lineno"> 217 </span><span class="spaces"> </span><span class="istickedoff">= case intersectRayWithObject ray p of</span> +<span class="lineno"> 218 </span><span class="spaces"> </span><span class="istickedoff">(True, _, _) -> <span class="nottickedoff">False</span></span> +<span class="lineno"> 219 </span><span class="spaces"> </span><span class="istickedoff">(False, [], _) -> False</span> +<span class="lineno"> 220 </span><span class="spaces"> </span><span class="istickedoff">(False, (0, b, _) : _, _) -> <span class="nottickedoff">False</span></span> +<span class="lineno"> 221 </span><span class="spaces"> </span><span class="istickedoff">(False, (i, False, _) : _, _) -> <span class="nottickedoff">False</span></span> +<span class="lineno"> 222 </span><span class="spaces"> </span><span class="istickedoff">(False, (i, b, _) : _, _) -> True</span></span> +<span class="lineno"> 223 </span> +<span class="lineno"> 224 </span>intersectWithin :: Ray -> Object -> Bool +<span class="lineno"> 225 </span><span class="decl"><span class="nottickedoff">intersectWithin ray p</span> +<span class="lineno"> 226 </span><span class="spaces"> </span><span class="nottickedoff">= case intersectRayWithObject ray p of</span> +<span class="lineno"> 227 </span><span class="spaces"> </span><span class="nottickedoff">(True, _, _) -> False -- eye is inside</span> +<span class="lineno"> 228 </span><span class="spaces"> </span><span class="nottickedoff">(False, [], _) -> False -- eye is inside</span> +<span class="lineno"> 229 </span><span class="spaces"> </span><span class="nottickedoff">(False, (0, b, _) : _, _) -> False -- eye is inside</span> +<span class="lineno"> 230 </span><span class="spaces"> </span><span class="nottickedoff">(False, (i, False, _) : _, _) -> False -- eye is inside</span> +<span class="lineno"> 231 </span><span class="spaces"> </span><span class="nottickedoff">(False, (t, b, _) : _, _) -> t < 1.0</span></span> + +</pre> +</html> +Writing: Geometry.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Geometry +<span class="lineno"> 7 </span> ( Coords +<span class="lineno"> 8 </span> , Ray +<span class="lineno"> 9 </span> , Point -- abstract +<span class="lineno"> 10 </span> , Vector -- abstract +<span class="lineno"> 11 </span> , Matrix -- abstract +<span class="lineno"> 12 </span> , Color -- abstract +<span class="lineno"> 13 </span> , Box(..) +<span class="lineno"> 14 </span> , Radian +<span class="lineno"> 15 </span> , matrix +<span class="lineno"> 16 </span> , coord +<span class="lineno"> 17 </span> , color +<span class="lineno"> 18 </span> , uncolor +<span class="lineno"> 19 </span> , xCoord , yCoord , zCoord +<span class="lineno"> 20 </span> , xComponent , yComponent , zComponent +<span class="lineno"> 21 </span> , point +<span class="lineno"> 22 </span> , vector +<span class="lineno"> 23 </span> , nearV +<span class="lineno"> 24 </span> , point_to_vector +<span class="lineno"> 25 </span> , vector_to_point +<span class="lineno"> 26 </span> , dot +<span class="lineno"> 27 </span> , cross +<span class="lineno"> 28 </span> , tangents +<span class="lineno"> 29 </span> , addVV +<span class="lineno"> 30 </span> , addPV +<span class="lineno"> 31 </span> , subVV +<span class="lineno"> 32 </span> , negV +<span class="lineno"> 33 </span> , subPP +<span class="lineno"> 34 </span> , norm +<span class="lineno"> 35 </span> , normalize +<span class="lineno"> 36 </span> , dist2 +<span class="lineno"> 37 </span> , sq +<span class="lineno"> 38 </span> , distFrom0Sq +<span class="lineno"> 39 </span> , distFrom0 +<span class="lineno"> 40 </span> , multSV +<span class="lineno"> 41 </span> , multMM +<span class="lineno"> 42 </span> , transposeM +<span class="lineno"> 43 </span> , multMV +<span class="lineno"> 44 </span> , multMP +<span class="lineno"> 45 </span> , multMQ +<span class="lineno"> 46 </span> , multMR +<span class="lineno"> 47 </span> , white +<span class="lineno"> 48 </span> , black +<span class="lineno"> 49 </span> , addCC +<span class="lineno"> 50 </span> , subCC +<span class="lineno"> 51 </span> , sumCC +<span class="lineno"> 52 </span> , multCC +<span class="lineno"> 53 </span> , multSC +<span class="lineno"> 54 </span> , nearC +<span class="lineno"> 55 </span> , offsetToPoint +<span class="lineno"> 56 </span> , epsilon +<span class="lineno"> 57 </span> , inf +<span class="lineno"> 58 </span> , nonZero +<span class="lineno"> 59 </span> , eqEps +<span class="lineno"> 60 </span> , near +<span class="lineno"> 61 </span> , clampf +<span class="lineno"> 62 </span> ) where +<span class="lineno"> 63 </span> +<span class="lineno"> 64 </span>import List +<span class="lineno"> 65 </span> +<span class="lineno"> 66 </span>type Coords = (Double,Double,Double) +<span class="lineno"> 67 </span> +<span class="lineno"> 68 </span>type Ray = (Point,Vector) -- origin of ray, and unit vector giving direction +<span class="lineno"> 69 </span> +<span class="lineno"> 70 </span>data Point = P !Double !Double !Double -- implicit extra arg of 1 +<span class="lineno"> 71 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span>) +<span class="lineno"> 72 </span>data Vector = V !Double !Double !Double -- implicit extra arg of 0 +<span class="lineno"> 73 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span>, <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Eq</span></span></span></span>) +<span class="lineno"> 74 </span>data Matrix = M !Quad !Quad !Quad !Quad +<span class="lineno"> 75 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span>) +<span class="lineno"> 76 </span> +<span class="lineno"> 77 </span>data Color = C !Double !Double !Double +<span class="lineno"> 78 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span>, <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Eq</span></span></span></span>) +<span class="lineno"> 79 </span> +<span class="lineno"> 80 </span>data Box = B !Double !Double !Double !Double !Double !Double +<span class="lineno"> 81 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span>) +<span class="lineno"> 82 </span> +<span class="lineno"> 83 </span>data Quad = Q !Double !Double !Double !Double +<span class="lineno"> 84 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span>) +<span class="lineno"> 85 </span> +<span class="lineno"> 86 </span>type Radian = Double +<span class="lineno"> 87 </span> +<span class="lineno"> 88 </span>type Tup4 a = (a,a,a,a) +<span class="lineno"> 89 </span> +<span class="lineno"> 90 </span>--{-# INLINE matrix #-} +<span class="lineno"> 91 </span>matrix :: Tup4 (Tup4 Double) -> Matrix +<span class="lineno"> 92 </span><span class="decl"><span class="istickedoff">matrix ((m11, m12, m13, m14),</span> +<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">(m21, m22, m23, m24),</span> +<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">(m31, m32, m33, m34),</span> +<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">(m41, m42, m43, m44))</span> +<span class="lineno"> 96 </span><span class="spaces"> </span><span class="istickedoff">= M (Q m11 m12 m13 m14)</span> +<span class="lineno"> 97 </span><span class="spaces"> </span><span class="istickedoff">(Q m21 m22 m23 m24)</span> +<span class="lineno"> 98 </span><span class="spaces"> </span><span class="istickedoff">(Q m31 m32 m33 m34)</span> +<span class="lineno"> 99 </span><span class="spaces"> </span><span class="istickedoff">(Q m41 m42 m43 m44)</span></span> +<span class="lineno"> 100 </span> +<span class="lineno"> 101 </span><span class="decl"><span class="nottickedoff">coord x y z = (x, y, z)</span></span> +<span class="lineno"> 102 </span> +<span class="lineno"> 103 </span><span class="decl"><span class="istickedoff">color r g b = C r g b</span></span> +<span class="lineno"> 104 </span> +<span class="lineno"> 105 </span><span class="decl"><span class="istickedoff">uncolor (C r g b) = (r,g,b)</span></span> +<span class="lineno"> 106 </span> +<span class="lineno"> 107 </span>{-# INLINE xCoord #-} +<span class="lineno"> 108 </span><span class="decl"><span class="istickedoff">xCoord (P x y z) = x</span></span> +<span class="lineno"> 109 </span>{-# INLINE yCoord #-} +<span class="lineno"> 110 </span><span class="decl"><span class="istickedoff">yCoord (P x y z) = y</span></span> +<span class="lineno"> 111 </span>{-# INLINE zCoord #-} +<span class="lineno"> 112 </span><span class="decl"><span class="istickedoff">zCoord (P x y z) = z</span></span> +<span class="lineno"> 113 </span> +<span class="lineno"> 114 </span>{-# INLINE xComponent #-} +<span class="lineno"> 115 </span><span class="decl"><span class="istickedoff">xComponent (V x y z) = x</span></span> +<span class="lineno"> 116 </span>{-# INLINE yComponent #-} +<span class="lineno"> 117 </span><span class="decl"><span class="istickedoff">yComponent (V x y z) = y</span></span> +<span class="lineno"> 118 </span>{-# INLINE zComponent #-} +<span class="lineno"> 119 </span><span class="decl"><span class="istickedoff">zComponent (V x y z) = z</span></span> +<span class="lineno"> 120 </span> +<span class="lineno"> 121 </span>point :: Double -> Double -> Double -> Point +<span class="lineno"> 122 </span><span class="decl"><span class="istickedoff">point x y z = P x y z</span></span> +<span class="lineno"> 123 </span> +<span class="lineno"> 124 </span>vector :: Double -> Double -> Double -> Vector +<span class="lineno"> 125 </span><span class="decl"><span class="istickedoff">vector x y z = V x y z</span></span> +<span class="lineno"> 126 </span> +<span class="lineno"> 127 </span>nearV :: Vector -> Vector -> Bool +<span class="lineno"> 128 </span><span class="decl"><span class="nottickedoff">nearV (V a b c) (V d e f) = a `near` d && b `near` e && c `near` f</span></span> +<span class="lineno"> 129 </span> +<span class="lineno"> 130 </span>point_to_vector :: Point -> Vector +<span class="lineno"> 131 </span><span class="decl"><span class="nottickedoff">point_to_vector (P x y z) = V x y z</span></span> +<span class="lineno"> 132 </span> +<span class="lineno"> 133 </span>vector_to_point :: Vector -> Point +<span class="lineno"> 134 </span><span class="decl"><span class="nottickedoff">vector_to_point (V x y z) = P x y z</span></span> +<span class="lineno"> 135 </span> +<span class="lineno"> 136 </span>{-# INLINE vector_to_quad #-} +<span class="lineno"> 137 </span>vector_to_quad :: Vector -> Quad +<span class="lineno"> 138 </span><span class="decl"><span class="istickedoff">vector_to_quad (V x y z) = Q x y z 0</span></span> +<span class="lineno"> 139 </span> +<span class="lineno"> 140 </span>{-# INLINE point_to_quad #-} +<span class="lineno"> 141 </span>point_to_quad :: Point -> Quad +<span class="lineno"> 142 </span><span class="decl"><span class="istickedoff">point_to_quad (P x y z) = Q x y z 1</span></span> +<span class="lineno"> 143 </span> +<span class="lineno"> 144 </span>{-# INLINE quad_to_point #-} +<span class="lineno"> 145 </span>quad_to_point :: Quad -> Point +<span class="lineno"> 146 </span><span class="decl"><span class="istickedoff">quad_to_point (Q x y z _) = P x y z</span></span> +<span class="lineno"> 147 </span> +<span class="lineno"> 148 </span>{-# INLINE quad_to_vector #-} +<span class="lineno"> 149 </span>quad_to_vector :: Quad -> Vector +<span class="lineno"> 150 </span><span class="decl"><span class="istickedoff">quad_to_vector (Q x y z _) = V x y z</span></span> +<span class="lineno"> 151 </span> +<span class="lineno"> 152 </span>--{-# INLINE dot #-} +<span class="lineno"> 153 </span>dot :: Vector -> Vector -> Double +<span class="lineno"> 154 </span><span class="decl"><span class="istickedoff">dot (V x1 y1 z1) (V x2 y2 z2) = x1 * x2 + y1 * y2 + z1 * z2</span></span> +<span class="lineno"> 155 </span> +<span class="lineno"> 156 </span>cross :: Vector -> Vector -> Vector +<span class="lineno"> 157 </span><span class="decl"><span class="istickedoff">cross (V x1 y1 z1) (V x2 y2 z2)</span> +<span class="lineno"> 158 </span><span class="spaces"> </span><span class="istickedoff">= V (y1 * z2 - z1 * y2) (z1 * x2 - x1 * z2) (x1 * y2 - y1 * x2)</span></span> +<span class="lineno"> 159 </span> +<span class="lineno"> 160 </span>-- assumption: the input vector is a normal +<span class="lineno"> 161 </span>tangents :: Vector -> (Vector, Vector) +<span class="lineno"> 162 </span><span class="decl"><span class="nottickedoff">tangents v@(V x y z)</span> +<span class="lineno"> 163 </span><span class="spaces"> </span><span class="nottickedoff">= (v1, v `cross` v1)</span> +<span class="lineno"> 164 </span><span class="spaces"> </span><span class="nottickedoff">where v1 | x == 0 = normalize (vector 0 z (-y))</span> +<span class="lineno"> 165 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = normalize (vector (-y) x 0)</span></span> +<span class="lineno"> 166 </span> +<span class="lineno"> 167 </span>{-# INLINE dot4 #-} +<span class="lineno"> 168 </span>dot4 :: Quad -> Quad -> Double +<span class="lineno"> 169 </span><span class="decl"><span class="istickedoff">dot4 (Q x1 y1 z1 w1) (Q x2 y2 z2 w2) = x1 * x2 + y1 * y2 + z1 * z2 + w1 * w2</span></span> +<span class="lineno"> 170 </span> +<span class="lineno"> 171 </span>addVV :: Vector -> Vector -> Vector +<span class="lineno"> 172 </span><span class="decl"><span class="nottickedoff">addVV (V x1 y1 z1) (V x2 y2 z2) </span> +<span class="lineno"> 173 </span><span class="spaces"> </span><span class="nottickedoff">= V (x1 + x2) (y1 + y2) (z1 + z2)</span></span> +<span class="lineno"> 174 </span> +<span class="lineno"> 175 </span>addPV :: Point -> Vector -> Point +<span class="lineno"> 176 </span><span class="decl"><span class="istickedoff">addPV (P x1 y1 z1) (V x2 y2 z2) </span> +<span class="lineno"> 177 </span><span class="spaces"> </span><span class="istickedoff">= P (x1 + x2) (y1 + y2) (z1 + z2)</span></span> +<span class="lineno"> 178 </span> +<span class="lineno"> 179 </span>subVV :: Vector -> Vector -> Vector +<span class="lineno"> 180 </span><span class="decl"><span class="istickedoff">subVV (V x1 y1 z1) (V x2 y2 z2) </span> +<span class="lineno"> 181 </span><span class="spaces"> </span><span class="istickedoff">= V (x1 - x2) (y1 - y2) (z1 - z2)</span></span> +<span class="lineno"> 182 </span> +<span class="lineno"> 183 </span>negV :: Vector -> Vector +<span class="lineno"> 184 </span><span class="decl"><span class="nottickedoff">negV (V x1 y1 z1) </span> +<span class="lineno"> 185 </span><span class="spaces"> </span><span class="nottickedoff">= V (-x1) (-y1) (-z1)</span></span> +<span class="lineno"> 186 </span> +<span class="lineno"> 187 </span>subPP :: Point -> Point -> Vector +<span class="lineno"> 188 </span><span class="decl"><span class="nottickedoff">subPP (P x1 y1 z1) (P x2 y2 z2) </span> +<span class="lineno"> 189 </span><span class="spaces"> </span><span class="nottickedoff">= V (x1 - x2) (y1 - y2) (z1 - z2)</span></span> +<span class="lineno"> 190 </span> +<span class="lineno"> 191 </span>--{-# INLINE norm #-} +<span class="lineno"> 192 </span>norm :: Vector -> Double +<span class="lineno"> 193 </span><span class="decl"><span class="nottickedoff">norm (V x y z) = sqrt (sq x + sq y + sq z)</span></span> +<span class="lineno"> 194 </span> +<span class="lineno"> 195 </span>--{-# INLINE normalize #-} +<span class="lineno"> 196 </span>-- normalize a vector to a unit vector +<span class="lineno"> 197 </span>normalize :: Vector -> Vector +<span class="lineno"> 198 </span><span class="decl"><span class="istickedoff">normalize v@(V x y z)</span> +<span class="lineno"> 199 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">norm /= 0</span> = multSV (1/norm) v</span> +<span class="lineno"> 200 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">error "normalize empty!"</span></span> +<span class="lineno"> 201 </span><span class="spaces"> </span><span class="istickedoff">where norm = sqrt (sq x + sq y + sq z)</span></span> +<span class="lineno"> 202 </span> +<span class="lineno"> 203 </span>-- This does computes the distance *squared* +<span class="lineno"> 204 </span>dist2 :: Point -> Point -> Double +<span class="lineno"> 205 </span><span class="decl"><span class="nottickedoff">dist2 us vs = sq x + sq y + sq z</span> +<span class="lineno"> 206 </span><span class="spaces"> </span><span class="nottickedoff">where</span> +<span class="lineno"> 207 </span><span class="spaces"> </span><span class="nottickedoff">(V x y z) = subPP us vs</span></span> +<span class="lineno"> 208 </span> +<span class="lineno"> 209 </span>{-# INLINE sq #-} +<span class="lineno"> 210 </span>sq :: Double -> Double +<span class="lineno"> 211 </span><span class="decl"><span class="istickedoff">sq d = d * d</span></span> +<span class="lineno"> 212 </span> +<span class="lineno"> 213 </span>{-# INLINE distFrom0Sq #-} +<span class="lineno"> 214 </span>distFrom0Sq :: Point -> Double -- Distance of point from origin. +<span class="lineno"> 215 </span><span class="decl"><span class="nottickedoff">distFrom0Sq (P x y z) = sq x + sq y + sq z</span></span> +<span class="lineno"> 216 </span> +<span class="lineno"> 217 </span>{-# INLINE distFrom0 #-} +<span class="lineno"> 218 </span>distFrom0 :: Point -> Double -- Distance of point from origin. +<span class="lineno"> 219 </span><span class="decl"><span class="nottickedoff">distFrom0 p = sqrt (distFrom0Sq p)</span></span> +<span class="lineno"> 220 </span> +<span class="lineno"> 221 </span>--{-# INLINE multSV #-} +<span class="lineno"> 222 </span>multSV :: Double -> Vector -> Vector +<span class="lineno"> 223 </span><span class="decl"><span class="istickedoff">multSV k (V x y z) = V (k*x) (k*y) (k*z)</span></span> +<span class="lineno"> 224 </span> +<span class="lineno"> 225 </span>--{-# INLINE multMM #-} +<span class="lineno"> 226 </span>multMM :: Matrix -> Matrix -> Matrix +<span class="lineno"> 227 </span><span class="decl"><span class="istickedoff">multMM m1@(M q1 q2 q3 q4) m2</span> +<span class="lineno"> 228 </span><span class="spaces"> </span><span class="istickedoff">= M (multMQ m2' q1)</span> +<span class="lineno"> 229 </span><span class="spaces"> </span><span class="istickedoff">(multMQ m2' q2)</span> +<span class="lineno"> 230 </span><span class="spaces"> </span><span class="istickedoff">(multMQ m2' q3)</span> +<span class="lineno"> 231 </span><span class="spaces"> </span><span class="istickedoff">(multMQ m2' q4)</span> +<span class="lineno"> 232 </span><span class="spaces"> </span><span class="istickedoff">where</span> +<span class="lineno"> 233 </span><span class="spaces"> </span><span class="istickedoff">m2' = transposeM m2</span></span> +<span class="lineno"> 234 </span> +<span class="lineno"> 235 </span>{-# INLINE transposeM #-} +<span class="lineno"> 236 </span>transposeM :: Matrix -> Matrix +<span class="lineno"> 237 </span><span class="decl"><span class="istickedoff">transposeM (M (Q e11 e12 e13 e14)</span> +<span class="lineno"> 238 </span><span class="spaces"> </span><span class="istickedoff">(Q e21 e22 e23 e24)</span> +<span class="lineno"> 239 </span><span class="spaces"> </span><span class="istickedoff">(Q e31 e32 e33 e34)</span> +<span class="lineno"> 240 </span><span class="spaces"> </span><span class="istickedoff">(Q e41 e42 e43 e44)) = (M (Q e11 e21 e31 e41)</span> +<span class="lineno"> 241 </span><span class="spaces"> </span><span class="istickedoff">(Q e12 e22 e32 e42)</span> +<span class="lineno"> 242 </span><span class="spaces"> </span><span class="istickedoff">(Q e13 e23 e33 e43)</span> +<span class="lineno"> 243 </span><span class="spaces"> </span><span class="istickedoff">(Q e14 e24 e34 e44))</span></span> +<span class="lineno"> 244 </span> +<span class="lineno"> 245 </span> +<span class="lineno"> 246 </span>--multMM m1 m2 = [map (dot4 row) (transpose m2) | row <- m1] +<span class="lineno"> 247 </span> +<span class="lineno"> 248 </span>--{-# INLINE multMV #-} +<span class="lineno"> 249 </span>multMV :: Matrix -> Vector -> Vector +<span class="lineno"> 250 </span><span class="decl"><span class="istickedoff">multMV m v = quad_to_vector (multMQ m (vector_to_quad v))</span></span> +<span class="lineno"> 251 </span> +<span class="lineno"> 252 </span>--{-# INLINE multMP #-} +<span class="lineno"> 253 </span>multMP :: Matrix -> Point -> Point +<span class="lineno"> 254 </span><span class="decl"><span class="istickedoff">multMP m p = quad_to_point (multMQ m (point_to_quad p))</span></span> +<span class="lineno"> 255 </span> +<span class="lineno"> 256 </span>-- mat vec = map (dot4 vec) mat +<span class="lineno"> 257 </span> +<span class="lineno"> 258 </span>{-# INLINE multMQ #-} +<span class="lineno"> 259 </span>multMQ :: Matrix -> Quad -> Quad +<span class="lineno"> 260 </span><span class="decl"><span class="istickedoff">multMQ (M q1 q2 q3 q4) q</span> +<span class="lineno"> 261 </span><span class="spaces"> </span><span class="istickedoff">= Q (dot4 q q1)</span> +<span class="lineno"> 262 </span><span class="spaces"> </span><span class="istickedoff">(dot4 q q2)</span> +<span class="lineno"> 263 </span><span class="spaces"> </span><span class="istickedoff">(dot4 q q3)</span> +<span class="lineno"> 264 </span><span class="spaces"> </span><span class="istickedoff">(dot4 q q4)</span></span> +<span class="lineno"> 265 </span> +<span class="lineno"> 266 </span>{-# INLINE multMR #-} +<span class="lineno"> 267 </span>multMR :: Matrix -> Ray -> Ray +<span class="lineno"> 268 </span><span class="decl"><span class="istickedoff">multMR m (r, v) = (multMP m r, multMV m v)</span></span> +<span class="lineno"> 269 </span> +<span class="lineno"> 270 </span>white :: Color +<span class="lineno"> 271 </span><span class="decl"><span class="nottickedoff">white = C 1 1 1</span></span> +<span class="lineno"> 272 </span>black :: Color +<span class="lineno"> 273 </span><span class="decl"><span class="istickedoff">black = C 0 0 0</span></span> +<span class="lineno"> 274 </span> +<span class="lineno"> 275 </span>addCC :: Color -> Color -> Color +<span class="lineno"> 276 </span><span class="decl"><span class="istickedoff">addCC (C a b c) (C d e f) = C (a+d) (b+e) (c+f)</span></span> +<span class="lineno"> 277 </span> +<span class="lineno"> 278 </span>subCC :: Color -> Color -> Color +<span class="lineno"> 279 </span><span class="decl"><span class="nottickedoff">subCC (C a b c) (C d e f) = C (a-d) (b-e) (c-f)</span></span> +<span class="lineno"> 280 </span> +<span class="lineno"> 281 </span>sumCC :: [Color] -> Color +<span class="lineno"> 282 </span><span class="decl"><span class="istickedoff">sumCC = foldr addCC black</span></span> +<span class="lineno"> 283 </span> +<span class="lineno"> 284 </span>multCC :: Color -> Color -> Color +<span class="lineno"> 285 </span><span class="decl"><span class="istickedoff">multCC (C a b c) (C d e f) = C (a*d) (b*e) (c*f)</span></span> +<span class="lineno"> 286 </span> +<span class="lineno"> 287 </span>multSC :: Double -> Color -> Color +<span class="lineno"> 288 </span><span class="decl"><span class="istickedoff">multSC k (C a b c) = C (a*k) (b*k) (c*k)</span></span> +<span class="lineno"> 289 </span> +<span class="lineno"> 290 </span>nearC :: Color -> Color -> Bool +<span class="lineno"> 291 </span><span class="decl"><span class="istickedoff">nearC (C a b c) (C d e f) = a `near` d && b `near` e && c `near` f</span></span> +<span class="lineno"> 292 </span> +<span class="lineno"> 293 </span>offsetToPoint :: Ray -> Double -> Point +<span class="lineno"> 294 </span><span class="decl"><span class="istickedoff">offsetToPoint (r,v) i = r `addPV` (i `multSV` v)</span></span> +<span class="lineno"> 295 </span> +<span class="lineno"> 296 </span>-- +<span class="lineno"> 297 </span> +<span class="lineno"> 298 </span>epsilon, inf :: Double -- aproximate zero and infinity +<span class="lineno"> 299 </span><span class="decl"><span class="istickedoff">epsilon = 1.0e-10</span></span> +<span class="lineno"> 300 </span><span class="decl"><span class="istickedoff">inf = 1.0e20</span></span> +<span class="lineno"> 301 </span> +<span class="lineno"> 302 </span>nonZero :: Double -> Double -- Use before a division. It makes definitions +<span class="lineno"> 303 </span><span class="decl"><span class="istickedoff">nonZero x | <span class="tickonlytrue">x > epsilon</span> = x -- more complete and I bet the errors that get </span> +<span class="lineno"> 304 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">x < -epsilon</span> = <span class="nottickedoff">x</span> -- introduced will be undetectable if epsilon</span> +<span class="lineno"> 305 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">epsilon</span></span></span> -- is small enough +<span class="lineno"> 306 </span> +<span class="lineno"> 307 </span> +<span class="lineno"> 308 </span><span class="decl"><span class="istickedoff">eqEps x y = abs (x-y) < epsilon</span></span> +<span class="lineno"> 309 </span><span class="decl"><span class="istickedoff">near = eqEps</span></span> +<span class="lineno"> 310 </span> +<span class="lineno"> 311 </span>clampf :: Double -> Double +<span class="lineno"> 312 </span><span class="decl"><span class="istickedoff">clampf p | <span class="tickonlyfalse">p < 0</span> = <span class="nottickedoff">0</span></span> +<span class="lineno"> 313 </span><span class="spaces"> </span><span class="istickedoff">| p > 1 = 1</span> +<span class="lineno"> 314 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">True</span> = p</span></span> + +</pre> +</html> +Writing: CSG.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module CSG(module Construct, +<span class="lineno"> 7 </span> module Geometry, +<span class="lineno"> 8 </span> module Intersections, +<span class="lineno"> 9 </span> module Interval, +<span class="lineno"> 10 </span> module Misc) where +<span class="lineno"> 11 </span> +<span class="lineno"> 12 </span>import Construct +<span class="lineno"> 13 </span>import Geometry +<span class="lineno"> 14 </span>import Intersections +<span class="lineno"> 15 </span>import Interval +<span class="lineno"> 16 </span>import Misc + +</pre> +</html> +Writing: Construct.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Construct +<span class="lineno"> 7 </span> ( Surface (..) +<span class="lineno"> 8 </span> , Face (..) +<span class="lineno"> 9 </span> , CSG (..) +<span class="lineno"> 10 </span> , Texture +<span class="lineno"> 11 </span> , Transform +<span class="lineno"> 12 </span> , union, intersect, difference +<span class="lineno"> 13 </span> , plane, sphere, cube, cylinder, cone +<span class="lineno"> 14 </span> , transform +<span class="lineno"> 15 </span> , translate, translateX, translateY, translateZ +<span class="lineno"> 16 </span> , scale, scaleX, scaleY, scaleZ, uscale +<span class="lineno"> 17 </span> , rotateX, rotateY, rotateZ +<span class="lineno"> 18 </span> , eye, translateEye +<span class="lineno"> 19 </span> , rotateEyeX, rotateEyeY, rotateEyeZ +<span class="lineno"> 20 </span> ) where +<span class="lineno"> 21 </span> +<span class="lineno"> 22 </span>import Geometry +<span class="lineno"> 23 </span> +<span class="lineno"> 24 </span>-- In each case, we model the surface by a point and a pair of tangent vectors. +<span class="lineno"> 25 </span>-- This gives us enough information to determine the surface +<span class="lineno"> 26 </span>-- normal at that point, which is all that is required by the current +<span class="lineno"> 27 </span>-- illumination model. We can't just save the surface normal because +<span class="lineno"> 28 </span>-- that isn't preserved by transformations. +<span class="lineno"> 29 </span> +<span class="lineno"> 30 </span>data Surface +<span class="lineno"> 31 </span> = Planar Point Vector Vector +<span class="lineno"> 32 </span> | Spherical Point Vector Vector +<span class="lineno"> 33 </span> | Cylindrical Point Vector Vector +<span class="lineno"> 34 </span> | Conic Point Vector Vector +<span class="lineno"> 35 </span> deriving <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span> +<span class="lineno"> 36 </span> +<span class="lineno"> 37 </span>data Face +<span class="lineno"> 38 </span> = PlaneFace +<span class="lineno"> 39 </span> | SphereFace +<span class="lineno"> 40 </span> | CubeFront +<span class="lineno"> 41 </span> | CubeBack +<span class="lineno"> 42 </span> | CubeLeft +<span class="lineno"> 43 </span> | CubeRight +<span class="lineno"> 44 </span> | CubeTop +<span class="lineno"> 45 </span> | CubeBottom +<span class="lineno"> 46 </span> | CylinderSide +<span class="lineno"> 47 </span> | CylinderTop +<span class="lineno"> 48 </span> | CylinderBottom +<span class="lineno"> 49 </span> | ConeSide +<span class="lineno"> 50 </span> | ConeBase +<span class="lineno"> 51 </span> deriving <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span> +<span class="lineno"> 52 </span> +<span class="lineno"> 53 </span>data CSG a +<span class="lineno"> 54 </span> = Plane a +<span class="lineno"> 55 </span> | Sphere a +<span class="lineno"> 56 </span> | Cylinder a +<span class="lineno"> 57 </span> | Cube a +<span class="lineno"> 58 </span> | Cone a +<span class="lineno"> 59 </span> | Transform Matrix Matrix (CSG a) +<span class="lineno"> 60 </span> | Union (CSG a) (CSG a) +<span class="lineno"> 61 </span> | Intersect (CSG a) (CSG a) +<span class="lineno"> 62 </span> | Difference (CSG a) (CSG a) +<span class="lineno"> 63 </span> | Box Box (CSG a) +<span class="lineno"> 64 </span> deriving (<span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span>) +<span class="lineno"> 65 </span> +<span class="lineno"> 66 </span>-- the data returned for determining surface texture +<span class="lineno"> 67 </span>-- the Face tells which face of a primitive this is +<span class="lineno"> 68 </span>-- the Point is the point of intersection in object coordinates +<span class="lineno"> 69 </span>-- the a is application-specific texture information +<span class="lineno"> 70 </span>type Texture a = (Face, Point, a) +<span class="lineno"> 71 </span> +<span class="lineno"> 72 </span>union, intersect, difference :: CSG a -> CSG a -> CSG a +<span class="lineno"> 73 </span> +<span class="lineno"> 74 </span><span class="decl"><span class="istickedoff">union p@(Box b1 _) q@(Box b2 _) = <span class="nottickedoff">Box (mergeBox b1 b2) (Union p q)</span></span> +<span class="lineno"> 75 </span><span class="spaces"></span><span class="istickedoff">union p q = Union p q</span></span> +<span class="lineno"> 76 </span> +<span class="lineno"> 77 </span>-- rather pessimistic +<span class="lineno"> 78 </span><span class="decl"><span class="nottickedoff">intersect p@(Box b1 _) q@(Box b2 _) = Box (mergeBox b1 b2) (Intersect p q)</span> +<span class="lineno"> 79 </span><span class="spaces"></span><span class="nottickedoff">intersect p q = Intersect p q</span></span> +<span class="lineno"> 80 </span> +<span class="lineno"> 81 </span><span class="decl"><span class="nottickedoff">difference (Box b1 p) q = Box b1 (Difference p q)</span> +<span class="lineno"> 82 </span><span class="spaces"></span><span class="nottickedoff">-- no need to box again inside</span> +<span class="lineno"> 83 </span><span class="spaces"></span><span class="nottickedoff">-- difference p@(Box b1 _) q = Box b1 (Difference p q)</span> +<span class="lineno"> 84 </span><span class="spaces"></span><span class="nottickedoff">difference p q = Difference p q</span></span> +<span class="lineno"> 85 </span> +<span class="lineno"> 86 </span><span class="decl"><span class="istickedoff">mkBox b p = Box b p</span></span> +<span class="lineno"> 87 </span> +<span class="lineno"> 88 </span>plane, sphere, cube, cylinder, cone :: a -> CSG a +<span class="lineno"> 89 </span> +<span class="lineno"> 90 </span><span class="decl"><span class="istickedoff">plane = Plane</span></span> +<span class="lineno"> 91 </span><span class="decl"><span class="nottickedoff">sphere s =</span> +<span class="lineno"> 92 </span><span class="spaces"> </span><span class="nottickedoff">mkBox (B (-1 - epsilon) (1 + epsilon)</span> +<span class="lineno"> 93 </span><span class="spaces"> </span><span class="nottickedoff">(-1 - epsilon) (1 + epsilon)</span> +<span class="lineno"> 94 </span><span class="spaces"> </span><span class="nottickedoff">(-1 - epsilon) (1 + epsilon)) (Sphere s)</span></span> +<span class="lineno"> 95 </span><span class="decl"><span class="nottickedoff">cone s =</span> +<span class="lineno"> 96 </span><span class="spaces"> </span><span class="nottickedoff">mkBox (B (-1 - epsilon) (1 + epsilon)</span> +<span class="lineno"> 97 </span><span class="spaces"> </span><span class="nottickedoff">( - epsilon) (1 + epsilon)</span> +<span class="lineno"> 98 </span><span class="spaces"> </span><span class="nottickedoff">(-1 - epsilon) (1 + epsilon)) (Cone s)</span></span> +<span class="lineno"> 99 </span><span class="decl"><span class="istickedoff">cube s =</span> +<span class="lineno"> 100 </span><span class="spaces"> </span><span class="istickedoff">mkBox (B (- epsilon) (1 + epsilon)</span> +<span class="lineno"> 101 </span><span class="spaces"> </span><span class="istickedoff">(- epsilon) (1 + epsilon)</span> +<span class="lineno"> 102 </span><span class="spaces"> </span><span class="istickedoff">(- epsilon) (1 + epsilon)) (Cube s)</span></span> +<span class="lineno"> 103 </span><span class="decl"><span class="nottickedoff">cylinder s =</span> +<span class="lineno"> 104 </span><span class="spaces"> </span><span class="nottickedoff">mkBox (B (-1 - epsilon) (1 + epsilon)</span> +<span class="lineno"> 105 </span><span class="spaces"> </span><span class="nottickedoff">( - epsilon) (1 + epsilon)</span> +<span class="lineno"> 106 </span><span class="spaces"> </span><span class="nottickedoff">(-1 - epsilon) (1 + epsilon)) (Cylinder s)</span></span> +<span class="lineno"> 107 </span> +<span class="lineno"> 108 </span>---------------------------- +<span class="lineno"> 109 </span>-- Object transformations +<span class="lineno"> 110 </span>---------------------------- +<span class="lineno"> 111 </span> +<span class="lineno"> 112 </span>type Transform = (Matrix, Matrix) +<span class="lineno"> 113 </span> +<span class="lineno"> 114 </span>transform :: Transform -> CSG a -> CSG a +<span class="lineno"> 115 </span> +<span class="lineno"> 116 </span><span class="decl"><span class="istickedoff">transform (m, m') (Transform mp mp' p) = Transform (multMM m mp) (multMM mp' m') p</span> +<span class="lineno"> 117 </span><span class="spaces"></span><span class="istickedoff">transform mm' (Union p q) = Union (transform mm' p) (transform mm' q)</span> +<span class="lineno"> 118 </span><span class="spaces"></span><span class="istickedoff">transform mm' (Intersect p q) = <span class="nottickedoff">Intersect (transform mm' p) (transform mm' q)</span></span> +<span class="lineno"> 119 </span><span class="spaces"></span><span class="istickedoff">transform mm' (Difference p q) = <span class="nottickedoff">Difference (transform mm' p) (transform mm' q)</span></span> +<span class="lineno"> 120 </span><span class="spaces"></span><span class="istickedoff">transform mm'@(m,_) (Box box p) = Box (transformBox m box) (transform mm' p)</span> +<span class="lineno"> 121 </span><span class="spaces"></span><span class="istickedoff">transform (m, m') prim = Transform m m' prim</span></span> +<span class="lineno"> 122 </span> +<span class="lineno"> 123 </span>translate :: Coords -> CSG a -> CSG a +<span class="lineno"> 124 </span>translateX, translateY, translateZ :: Double -> CSG a -> CSG a +<span class="lineno"> 125 </span> +<span class="lineno"> 126 </span><span class="decl"><span class="istickedoff">translate xyz = transform $ transM xyz</span></span> +<span class="lineno"> 127 </span><span class="decl"><span class="nottickedoff">translateX x = translate (x, 0, 0)</span></span> +<span class="lineno"> 128 </span><span class="decl"><span class="nottickedoff">translateY y = translate (0, y, 0)</span></span> +<span class="lineno"> 129 </span><span class="decl"><span class="nottickedoff">translateZ z = translate (0, 0, z)</span></span> +<span class="lineno"> 130 </span> +<span class="lineno"> 131 </span>scale :: Coords -> CSG a -> CSG a +<span class="lineno"> 132 </span>scaleX, scaleY, scaleZ, uscale :: Double -> CSG a -> CSG a +<span class="lineno"> 133 </span> +<span class="lineno"> 134 </span><span class="decl"><span class="istickedoff">scale xyz = transform $ scaleM xyz</span></span> +<span class="lineno"> 135 </span><span class="decl"><span class="nottickedoff">scaleX x = scale (x, 1, 1)</span></span> +<span class="lineno"> 136 </span><span class="decl"><span class="nottickedoff">scaleY y = scale (1, y, 1)</span></span> +<span class="lineno"> 137 </span><span class="decl"><span class="nottickedoff">scaleZ z = scale (1, 1, z)</span></span> +<span class="lineno"> 138 </span><span class="decl"><span class="istickedoff">uscale u = scale (u,u,u)</span></span> +<span class="lineno"> 139 </span> +<span class="lineno"> 140 </span>rotateX, rotateY, rotateZ :: Radian -> CSG a -> CSG a +<span class="lineno"> 141 </span> +<span class="lineno"> 142 </span><span class="decl"><span class="istickedoff">rotateX a = transform $ rotxM a</span></span> +<span class="lineno"> 143 </span><span class="decl"><span class="istickedoff">rotateY a = transform $ rotyM a</span></span> +<span class="lineno"> 144 </span><span class="decl"><span class="nottickedoff">rotateZ a = transform $ rotzM a</span></span> +<span class="lineno"> 145 </span> +<span class="lineno"> 146 </span><span class="decl"><span class="istickedoff">unit = matrix</span> +<span class="lineno"> 147 </span><span class="spaces"> </span><span class="istickedoff">( ( 1.0, 0.0, 0.0, 0.0 ),</span> +<span class="lineno"> 148 </span><span class="spaces"> </span><span class="istickedoff">( 0.0, 1.0, 0.0, 0.0 ),</span> +<span class="lineno"> 149 </span><span class="spaces"> </span><span class="istickedoff">( 0.0, 0.0, 1.0, 0.0 ),</span> +<span class="lineno"> 150 </span><span class="spaces"> </span><span class="istickedoff">( 0.0, 0.0, 0.0, 1.0 ) )</span></span> +<span class="lineno"> 151 </span> +<span class="lineno"> 152 </span><span class="decl"><span class="istickedoff">transM (x, y, z)</span> +<span class="lineno"> 153 </span><span class="spaces"> </span><span class="istickedoff">= ( matrix</span> +<span class="lineno"> 154 </span><span class="spaces"> </span><span class="istickedoff">( ( 1, 0, 0, x ),</span> +<span class="lineno"> 155 </span><span class="spaces"> </span><span class="istickedoff">( 0, 1, 0, y ),</span> +<span class="lineno"> 156 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 1, z ),</span> +<span class="lineno"> 157 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 0, 1 ) ),</span> +<span class="lineno"> 158 </span><span class="spaces"> </span><span class="istickedoff">matrix</span> +<span class="lineno"> 159 </span><span class="spaces"> </span><span class="istickedoff">( ( 1, 0, 0, -x ),</span> +<span class="lineno"> 160 </span><span class="spaces"> </span><span class="istickedoff">( 0, 1, 0, -y ),</span> +<span class="lineno"> 161 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 1, -z ),</span> +<span class="lineno"> 162 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 0, 1 ) ) )</span></span> +<span class="lineno"> 163 </span> +<span class="lineno"> 164 </span><span class="decl"><span class="istickedoff">scaleM (x, y, z)</span> +<span class="lineno"> 165 </span><span class="spaces"> </span><span class="istickedoff">= ( matrix</span> +<span class="lineno"> 166 </span><span class="spaces"> </span><span class="istickedoff">( ( x', 0, 0, 0 ),</span> +<span class="lineno"> 167 </span><span class="spaces"> </span><span class="istickedoff">( 0, y', 0, 0 ),</span> +<span class="lineno"> 168 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, z', 0 ),</span> +<span class="lineno"> 169 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 0, 1 ) ),</span> +<span class="lineno"> 170 </span><span class="spaces"> </span><span class="istickedoff">matrix</span> +<span class="lineno"> 171 </span><span class="spaces"> </span><span class="istickedoff">( ( 1/x', 0, 0, 0 ),</span> +<span class="lineno"> 172 </span><span class="spaces"> </span><span class="istickedoff">( 0, 1/y', 0, 0 ),</span> +<span class="lineno"> 173 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 1/z', 0 ),</span> +<span class="lineno"> 174 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 0, 1 ) ) )</span> +<span class="lineno"> 175 </span><span class="spaces"> </span><span class="istickedoff">where x' = nonZero x</span> +<span class="lineno"> 176 </span><span class="spaces"> </span><span class="istickedoff">y' = nonZero y</span> +<span class="lineno"> 177 </span><span class="spaces"> </span><span class="istickedoff">z' = nonZero z</span></span> +<span class="lineno"> 178 </span> +<span class="lineno"> 179 </span><span class="decl"><span class="istickedoff">rotxM t</span> +<span class="lineno"> 180 </span><span class="spaces"> </span><span class="istickedoff">= ( matrix</span> +<span class="lineno"> 181 </span><span class="spaces"> </span><span class="istickedoff">( ( 1, 0, 0, 0 ),</span> +<span class="lineno"> 182 </span><span class="spaces"> </span><span class="istickedoff">( 0, cos t, -sin t, 0 ),</span> +<span class="lineno"> 183 </span><span class="spaces"> </span><span class="istickedoff">( 0, sin t, cos t, 0 ),</span> +<span class="lineno"> 184 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 0, 1 ) ),</span> +<span class="lineno"> 185 </span><span class="spaces"> </span><span class="istickedoff">matrix</span> +<span class="lineno"> 186 </span><span class="spaces"> </span><span class="istickedoff">( ( 1, 0, 0, 0 ),</span> +<span class="lineno"> 187 </span><span class="spaces"> </span><span class="istickedoff">( 0, cos t, sin t, 0 ),</span> +<span class="lineno"> 188 </span><span class="spaces"> </span><span class="istickedoff">( 0, -sin t, cos t, 0 ),</span> +<span class="lineno"> 189 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 0, 1 ) ) )</span></span> +<span class="lineno"> 190 </span> +<span class="lineno"> 191 </span><span class="decl"><span class="istickedoff">rotyM t</span> +<span class="lineno"> 192 </span><span class="spaces"> </span><span class="istickedoff">= ( matrix</span> +<span class="lineno"> 193 </span><span class="spaces"> </span><span class="istickedoff">( ( cos t, 0, sin t, 0 ),</span> +<span class="lineno"> 194 </span><span class="spaces"> </span><span class="istickedoff">( 0, 1, 0, 0 ),</span> +<span class="lineno"> 195 </span><span class="spaces"> </span><span class="istickedoff">( -sin t, 0, cos t, 0 ),</span> +<span class="lineno"> 196 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 0, 1 ) ),</span> +<span class="lineno"> 197 </span><span class="spaces"> </span><span class="istickedoff">matrix</span> +<span class="lineno"> 198 </span><span class="spaces"> </span><span class="istickedoff">( ( cos t, 0, -sin t, 0 ),</span> +<span class="lineno"> 199 </span><span class="spaces"> </span><span class="istickedoff">( 0, 1, 0, 0 ),</span> +<span class="lineno"> 200 </span><span class="spaces"> </span><span class="istickedoff">( sin t, 0, cos t, 0 ),</span> +<span class="lineno"> 201 </span><span class="spaces"> </span><span class="istickedoff">( 0, 0, 0, 1 ) ) )</span></span> +<span class="lineno"> 202 </span> +<span class="lineno"> 203 </span><span class="decl"><span class="nottickedoff">rotzM t</span> +<span class="lineno"> 204 </span><span class="spaces"> </span><span class="nottickedoff">= ( matrix</span> +<span class="lineno"> 205 </span><span class="spaces"> </span><span class="nottickedoff">( ( cos t, -sin t, 0, 0 ),</span> +<span class="lineno"> 206 </span><span class="spaces"> </span><span class="nottickedoff">( sin t, cos t, 0, 0 ),</span> +<span class="lineno"> 207 </span><span class="spaces"> </span><span class="nottickedoff">( 0, 0, 1, 0 ),</span> +<span class="lineno"> 208 </span><span class="spaces"> </span><span class="nottickedoff">( 0, 0, 0, 1 ) ),</span> +<span class="lineno"> 209 </span><span class="spaces"> </span><span class="nottickedoff">matrix</span> +<span class="lineno"> 210 </span><span class="spaces"> </span><span class="nottickedoff">( ( cos t, sin t, 0, 0 ),</span> +<span class="lineno"> 211 </span><span class="spaces"> </span><span class="nottickedoff">( -sin t, cos t, 0, 0 ),</span> +<span class="lineno"> 212 </span><span class="spaces"> </span><span class="nottickedoff">( 0, 0, 1, 0 ),</span> +<span class="lineno"> 213 </span><span class="spaces"> </span><span class="nottickedoff">( 0, 0, 0, 1 ) ) )</span></span> +<span class="lineno"> 214 </span> +<span class="lineno"> 215 </span>------------------- +<span class="lineno"> 216 </span>-- Eye transformations +<span class="lineno"> 217 </span> +<span class="lineno"> 218 </span>-- These are used to specify placement of the eye. +<span class="lineno"> 219 </span>-- `eye' starts out at (0, 0, -1). +<span class="lineno"> 220 </span>-- These are implemented as inverse transforms of the model. +<span class="lineno"> 221 </span>------------------- +<span class="lineno"> 222 </span> +<span class="lineno"> 223 </span>eye :: Transform +<span class="lineno"> 224 </span>translateEye :: Coords -> Transform -> Transform +<span class="lineno"> 225 </span>rotateEyeX, rotateEyeY, rotateEyeZ :: Radian -> Transform -> Transform +<span class="lineno"> 226 </span> +<span class="lineno"> 227 </span><span class="decl"><span class="istickedoff">eye = (unit, unit)</span></span> +<span class="lineno"> 228 </span><span class="decl"><span class="nottickedoff">translateEye xyz (eye1, eye2)</span> +<span class="lineno"> 229 </span><span class="spaces"> </span><span class="nottickedoff">= (multMM m1 eye1, multMM eye2 m2)</span> +<span class="lineno"> 230 </span><span class="spaces"> </span><span class="nottickedoff">where (m1, m2) = transM xyz</span></span> +<span class="lineno"> 231 </span><span class="decl"><span class="nottickedoff">rotateEyeX t (eye1, eye2)</span> +<span class="lineno"> 232 </span><span class="spaces"> </span><span class="nottickedoff">= (multMM m1 eye1, multMM eye2 m2)</span> +<span class="lineno"> 233 </span><span class="spaces"> </span><span class="nottickedoff">where (m1, m2) = rotxM t</span></span> +<span class="lineno"> 234 </span><span class="decl"><span class="nottickedoff">rotateEyeY t (eye1, eye2)</span> +<span class="lineno"> 235 </span><span class="spaces"> </span><span class="nottickedoff">= (multMM m1 eye1, multMM eye2 m2)</span> +<span class="lineno"> 236 </span><span class="spaces"> </span><span class="nottickedoff">where (m1, m2) = rotyM t</span></span> +<span class="lineno"> 237 </span><span class="decl"><span class="nottickedoff">rotateEyeZ t (eye1, eye2)</span> +<span class="lineno"> 238 </span><span class="spaces"> </span><span class="nottickedoff">= (multMM m1 eye1, multMM eye2 m2)</span> +<span class="lineno"> 239 </span><span class="spaces"> </span><span class="nottickedoff">where (m1, m2) = rotzM t</span></span> +<span class="lineno"> 240 </span> +<span class="lineno"> 241 </span>------------------- +<span class="lineno"> 242 </span>-- Bounding boxes +<span class="lineno"> 243 </span>------------------- +<span class="lineno"> 244 </span> +<span class="lineno"> 245 </span><span class="decl"><span class="nottickedoff">mergeBox (B x11 x12 y11 y12 z11 z12) (B x21 x22 y21 y22 z21 z22) =</span> +<span class="lineno"> 246 </span><span class="spaces"> </span><span class="nottickedoff">B (x11 `min` x21) (x12 `max` x22)</span> +<span class="lineno"> 247 </span><span class="spaces"> </span><span class="nottickedoff">(y11 `min` y21) (y12 `max` y22)</span> +<span class="lineno"> 248 </span><span class="spaces"> </span><span class="nottickedoff">(z11 `min` z21) (z12 `max` z22)</span></span> +<span class="lineno"> 249 </span> +<span class="lineno"> 250 </span><span class="decl"><span class="istickedoff">transformBox t (B x1 x2 y1 y2 z1 z2)</span> +<span class="lineno"> 251 </span><span class="spaces"> </span><span class="istickedoff">= (B (foldr1 min (map xCoord pts'))</span> +<span class="lineno"> 252 </span><span class="spaces"> </span><span class="istickedoff">(foldr1 max (map xCoord pts'))</span> +<span class="lineno"> 253 </span><span class="spaces"> </span><span class="istickedoff">(foldr1 min (map yCoord pts'))</span> +<span class="lineno"> 254 </span><span class="spaces"> </span><span class="istickedoff">(foldr1 max (map yCoord pts'))</span> +<span class="lineno"> 255 </span><span class="spaces"> </span><span class="istickedoff">(foldr1 min (map zCoord pts'))</span> +<span class="lineno"> 256 </span><span class="spaces"> </span><span class="istickedoff">(foldr1 max (map zCoord pts')))</span> +<span class="lineno"> 257 </span><span class="spaces"> </span><span class="istickedoff">where pts' = map (multMP t) pts</span> +<span class="lineno"> 258 </span><span class="spaces"> </span><span class="istickedoff">pts = [point x1 y1 z1,</span> +<span class="lineno"> 259 </span><span class="spaces"> </span><span class="istickedoff">point x1 y1 z2,</span> +<span class="lineno"> 260 </span><span class="spaces"> </span><span class="istickedoff">point x1 y2 z1,</span> +<span class="lineno"> 261 </span><span class="spaces"> </span><span class="istickedoff">point x1 y2 z2,</span> +<span class="lineno"> 262 </span><span class="spaces"> </span><span class="istickedoff">point x2 y1 z1,</span> +<span class="lineno"> 263 </span><span class="spaces"> </span><span class="istickedoff">point x2 y1 z2,</span> +<span class="lineno"> 264 </span><span class="spaces"> </span><span class="istickedoff">point x2 y2 z1,</span> +<span class="lineno"> 265 </span><span class="spaces"> </span><span class="istickedoff">point x2 y2 z2]</span></span> + +</pre> +</html> +Writing: Intersections.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Intersections +<span class="lineno"> 7 </span> ( intersectRayWithObject, +<span class="lineno"> 8 </span> quadratic +<span class="lineno"> 9 </span> ) where +<span class="lineno"> 10 </span> +<span class="lineno"> 11 </span>import Maybe(isJust) +<span class="lineno"> 12 </span> +<span class="lineno"> 13 </span>import Construct +<span class="lineno"> 14 </span>import Geometry +<span class="lineno"> 15 </span>import Interval +<span class="lineno"> 16 </span>import Misc +<span class="lineno"> 17 </span> +<span class="lineno"> 18 </span>-- This is factored into two bits. The main function `intersections' +<span class="lineno"> 19 </span>-- intersects a line with an object. +<span class="lineno"> 20 </span>-- The wrapper call `intersectRayWithObject' coerces this to an intersection +<span class="lineno"> 21 </span>-- with a ray by clamping the result to start at 0. +<span class="lineno"> 22 </span> +<span class="lineno"> 23 </span><span class="decl"><span class="istickedoff">intersectRayWithObject ray p</span> +<span class="lineno"> 24 </span><span class="spaces"> </span><span class="istickedoff">= clampIntervals is</span> +<span class="lineno"> 25 </span><span class="spaces"> </span><span class="istickedoff">where is = intersections ray p</span></span> +<span class="lineno"> 26 </span> +<span class="lineno"> 27 </span><span class="decl"><span class="istickedoff">clampIntervals (True, [], True) = <span class="nottickedoff">(False, [(0, True, undefined)], True)</span></span> +<span class="lineno"> 28 </span><span class="spaces"></span><span class="istickedoff">clampIntervals empty@(False, [], False) = empty</span> +<span class="lineno"> 29 </span><span class="spaces"></span><span class="istickedoff">clampIntervals (True, is@((i, False, p) : is'), isOpen)</span> +<span class="lineno"> 30 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">i `near` 0 || i < 0</span></span> +<span class="lineno"> 31 </span><span class="spaces"> </span><span class="istickedoff">= clampIntervals (False, is', isOpen)</span> +<span class="lineno"> 32 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span></span> +<span class="lineno"> 33 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">(False, (0, True, undefined) : is, isOpen)</span></span> +<span class="lineno"> 34 </span><span class="spaces"></span><span class="istickedoff">clampIntervals ivals@(False, is@((i, True, p) : is'), isOpen)</span> +<span class="lineno"> 35 </span><span class="spaces"> </span><span class="istickedoff">| i `near` 0 || i < 0</span> +<span class="lineno"> 36 </span><span class="spaces"> </span><span class="istickedoff">-- can unify this with first case...</span> +<span class="lineno"> 37 </span><span class="spaces"> </span><span class="istickedoff">= clampIntervals (True, is', isOpen)</span> +<span class="lineno"> 38 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span></span> +<span class="lineno"> 39 </span><span class="spaces"> </span><span class="istickedoff">= ivals</span></span> +<span class="lineno"> 40 </span> +<span class="lineno"> 41 </span><span class="decl"><span class="istickedoff">intersections ray (Union p q)</span> +<span class="lineno"> 42 </span><span class="spaces"> </span><span class="istickedoff">= unionIntervals is js</span> +<span class="lineno"> 43 </span><span class="spaces"> </span><span class="istickedoff">where is = intersections ray p</span> +<span class="lineno"> 44 </span><span class="spaces"> </span><span class="istickedoff">js = intersections ray q</span> +<span class="lineno"> 45 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 46 </span><span class="spaces"></span><span class="istickedoff">intersections ray (Intersect p q)</span> +<span class="lineno"> 47 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">intersectIntervals is js</span></span> +<span class="lineno"> 48 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">is = intersections ray p</span></span> +<span class="lineno"> 49 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">js = intersections ray q</span></span> +<span class="lineno"> 50 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 51 </span><span class="spaces"></span><span class="istickedoff">intersections ray (Difference p q)</span> +<span class="lineno"> 52 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">differenceIntervals is (negateSurfaces js)</span></span> +<span class="lineno"> 53 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">is = intersections ray p</span></span> +<span class="lineno"> 54 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">js = intersections ray q</span></span> +<span class="lineno"> 55 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 56 </span><span class="spaces"></span><span class="istickedoff">intersections ray (Transform m m' p)</span> +<span class="lineno"> 57 </span><span class="spaces"> </span><span class="istickedoff">= mapI (xform m) is</span> +<span class="lineno"> 58 </span><span class="spaces"> </span><span class="istickedoff">where is = intersections (m' `multMR` ray) p</span> +<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff">xform m (i, b, (s, p0)) = (i, b, (transformSurface m s, p0))</span> +<span class="lineno"> 60 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 61 </span><span class="spaces"></span><span class="istickedoff">intersections ray (Box box p)</span> +<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">| intersectWithBox ray box = intersections ray p</span> +<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = emptyIList</span> +<span class="lineno"> 64 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 65 </span><span class="spaces"></span><span class="istickedoff">intersections ray p@(Plane s)</span> +<span class="lineno"> 66 </span><span class="spaces"> </span><span class="istickedoff">= intersectPlane ray s</span> +<span class="lineno"> 67 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 68 </span><span class="spaces"></span><span class="istickedoff">intersections ray p@(Sphere s)</span> +<span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">intersectSphere ray s</span></span> +<span class="lineno"> 70 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 71 </span><span class="spaces"></span><span class="istickedoff">intersections ray p@(Cube s)</span> +<span class="lineno"> 72 </span><span class="spaces"> </span><span class="istickedoff">= intersectCube ray s</span> +<span class="lineno"> 73 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 74 </span><span class="spaces"></span><span class="istickedoff">intersections ray p@(Cylinder s)</span> +<span class="lineno"> 75 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">intersectCylinder ray s</span></span> +<span class="lineno"> 76 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 77 </span><span class="spaces"></span><span class="istickedoff">intersections ray p@(Cone s)</span> +<span class="lineno"> 78 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">intersectCone ray s</span></span></span> +<span class="lineno"> 79 </span> +<span class="lineno"> 80 </span>negateSurfaces :: IList (Surface, Texture a) -> IList (Surface, Texture a) +<span class="lineno"> 81 </span><span class="decl"><span class="nottickedoff">negateSurfaces = mapI negSurf</span> +<span class="lineno"> 82 </span><span class="spaces"> </span><span class="nottickedoff">where negSurf (i, b, (s,t)) = (i, b, (negateSurface s, t))</span></span> +<span class="lineno"> 83 </span> +<span class="lineno"> 84 </span><span class="decl"><span class="nottickedoff">negateSurface (Planar p0 v0 v1)</span> +<span class="lineno"> 85 </span><span class="spaces"> </span><span class="nottickedoff">= Planar p0 v1 v0</span> +<span class="lineno"> 86 </span><span class="spaces"></span><span class="nottickedoff">negateSurface (Spherical p0 v0 v1)</span> +<span class="lineno"> 87 </span><span class="spaces"> </span><span class="nottickedoff">= Spherical p0 v1 v0</span> +<span class="lineno"> 88 </span><span class="spaces"></span><span class="nottickedoff">negateSurface (Cylindrical p0 v0 v1)</span> +<span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">= Cylindrical p0 v1 v0</span> +<span class="lineno"> 90 </span><span class="spaces"></span><span class="nottickedoff">negateSurface (Conic p0 v0 v1)</span> +<span class="lineno"> 91 </span><span class="spaces"> </span><span class="nottickedoff">= Conic p0 v1 v0</span></span> +<span class="lineno"> 92 </span> +<span class="lineno"> 93 </span><span class="decl"><span class="istickedoff">transformSurface m (Planar p0 v0 v1)</span> +<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">= Planar <span class="nottickedoff">p0'</span> v0' v1'</span> +<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">p0' = multMP m p0</span></span> +<span class="lineno"> 96 </span><span class="spaces"> </span><span class="istickedoff">v0' = multMV m v0</span> +<span class="lineno"> 97 </span><span class="spaces"> </span><span class="istickedoff">v1' = multMV m v1</span> +<span class="lineno"> 98 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 99 </span><span class="spaces"></span><span class="istickedoff">transformSurface m (Spherical p0 v0 v1)</span> +<span class="lineno"> 100 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">Spherical p0' v0' v1'</span></span> +<span class="lineno"> 101 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">p0' = multMP m p0</span></span> +<span class="lineno"> 102 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">v0' = multMV m v0</span></span> +<span class="lineno"> 103 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">v1' = multMV m v1</span></span> +<span class="lineno"> 104 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 105 </span><span class="spaces"></span><span class="istickedoff">-- ditto as above</span> +<span class="lineno"> 106 </span><span class="spaces"></span><span class="istickedoff">transformSurface m (Cylindrical p0 v0 v1)</span> +<span class="lineno"> 107 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">Cylindrical p0' v0' v1'</span></span> +<span class="lineno"> 108 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">p0' = multMP m p0</span></span> +<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">v0' = multMV m v0</span></span> +<span class="lineno"> 110 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">v1' = multMV m v1</span></span> +<span class="lineno"> 111 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 112 </span><span class="spaces"></span><span class="istickedoff">transformSurface m (Conic p0 v0 v1)</span> +<span class="lineno"> 113 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">Conic p0' v0' v1'</span></span> +<span class="lineno"> 114 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">p0' = multMP m p0</span></span> +<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">v0' = multMV m v0</span></span> +<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">v1' = multMV m v1</span></span></span> +<span class="lineno"> 117 </span> +<span class="lineno"> 118 </span>-------------------------------- +<span class="lineno"> 119 </span>-- Plane +<span class="lineno"> 120 </span>-------------------------------- +<span class="lineno"> 121 </span> +<span class="lineno"> 122 </span>intersectPlane :: Ray -> a -> IList (Surface, Texture a) +<span class="lineno"> 123 </span><span class="decl"><span class="istickedoff">intersectPlane ray texture = intersectXZPlane PlaneFace ray 0.0 texture</span></span> +<span class="lineno"> 124 </span> +<span class="lineno"> 125 </span>intersectXZPlane :: Face -> Ray -> Double -> a -> IList (Surface, Texture a) +<span class="lineno"> 126 </span><span class="decl"><span class="istickedoff">intersectXZPlane n (r,v) yoffset texture</span> +<span class="lineno"> 127 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">b `near` 0</span></span> +<span class="lineno"> 128 </span><span class="spaces"> </span><span class="istickedoff">= -- the ray is parallel to the plane - it's either all in, or all out</span> +<span class="lineno"> 129 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">if y `near` yoffset || y < yoffset then openIList else emptyIList</span></span> +<span class="lineno"> 130 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 131 </span><span class="spaces"> </span><span class="istickedoff">-- The line intersects the plane. Find t such that</span> +<span class="lineno"> 132 </span><span class="spaces"> </span><span class="istickedoff">-- (x + at, y + bt, z + ct) intersects the X-Z plane.</span> +<span class="lineno"> 133 </span><span class="spaces"> </span><span class="istickedoff">-- t may be negative (the ray starts within the halfspace),</span> +<span class="lineno"> 134 </span><span class="spaces"> </span><span class="istickedoff">-- but we'll catch that later when we clamp the intervals</span> +<span class="lineno"> 135 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 136 </span><span class="spaces"> </span><span class="istickedoff">| b < 0 -- the ray is pointing downwards</span> +<span class="lineno"> 137 </span><span class="spaces"> </span><span class="istickedoff">= (False, [mkEntry (t0, (Planar <span class="nottickedoff">p0</span> v0 v1, (n, p0, texture)))], <span class="nottickedoff">True</span>)</span> +<span class="lineno"> 138 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 139 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> -- the ray is pointing upwards</span> +<span class="lineno"> 140 </span><span class="spaces"> </span><span class="istickedoff">= (True, [mkExit (t0, (<span class="nottickedoff">Planar p0 v0 v1</span>, <span class="nottickedoff">(n, p0, texture)</span>))], False)</span> +<span class="lineno"> 141 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 142 </span><span class="spaces"> </span><span class="istickedoff">where t0 = (yoffset-y) / b</span> +<span class="lineno"> 143 </span><span class="spaces"> </span><span class="istickedoff">x0 = x + a * t0</span> +<span class="lineno"> 144 </span><span class="spaces"> </span><span class="istickedoff">z0 = z + c * t0</span> +<span class="lineno"> 145 </span><span class="spaces"> </span><span class="istickedoff">p0 = point x0 0 z0</span> +<span class="lineno"> 146 </span><span class="spaces"> </span><span class="istickedoff">v0 = vector 0 0 1</span> +<span class="lineno"> 147 </span><span class="spaces"> </span><span class="istickedoff">v1 = vector 1 0 0</span> +<span class="lineno"> 148 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 149 </span><span class="spaces"> </span><span class="istickedoff">x = xCoord r</span> +<span class="lineno"> 150 </span><span class="spaces"> </span><span class="istickedoff">y = yCoord r</span> +<span class="lineno"> 151 </span><span class="spaces"> </span><span class="istickedoff">z = zCoord r</span> +<span class="lineno"> 152 </span><span class="spaces"> </span><span class="istickedoff">a = xComponent v</span> +<span class="lineno"> 153 </span><span class="spaces"> </span><span class="istickedoff">b = yComponent v</span> +<span class="lineno"> 154 </span><span class="spaces"> </span><span class="istickedoff">c = zComponent v</span></span> +<span class="lineno"> 155 </span> +<span class="lineno"> 156 </span> +<span class="lineno"> 157 </span>-------------------------------- +<span class="lineno"> 158 </span>-- Sphere +<span class="lineno"> 159 </span>-------------------------------- +<span class="lineno"> 160 </span> +<span class="lineno"> 161 </span>intersectSphere :: Ray -> a -> IList (Surface, Texture a) +<span class="lineno"> 162 </span><span class="decl"><span class="nottickedoff">intersectSphere ray@(r, v) texture</span> +<span class="lineno"> 163 </span><span class="spaces"> </span><span class="nottickedoff">= -- Find t such that (x + ta, y + tb, z + tc) intersects the</span> +<span class="lineno"> 164 </span><span class="spaces"> </span><span class="nottickedoff">-- unit sphere, that is, such that:</span> +<span class="lineno"> 165 </span><span class="spaces"> </span><span class="nottickedoff">-- (x + ta)^2 + (y + tb)^2 + (z + tc)^2 = 1</span> +<span class="lineno"> 166 </span><span class="spaces"> </span><span class="nottickedoff">-- This is a quadratic equation in t:</span> +<span class="lineno"> 167 </span><span class="spaces"> </span><span class="nottickedoff">-- t^2(a^2 + b^2 + c^2) + 2t(xa + yb + zc) + (x^2 + y^2 + z^2 - 1) = 0</span> +<span class="lineno"> 168 </span><span class="spaces"> </span><span class="nottickedoff">let c1 = sq a + sq b + sq c</span> +<span class="lineno"> 169 </span><span class="spaces"> </span><span class="nottickedoff">c2 = 2 * (x * a + y * b + z * c)</span> +<span class="lineno"> 170 </span><span class="spaces"> </span><span class="nottickedoff">c3 = sq x + sq y + sq z - 1</span> +<span class="lineno"> 171 </span><span class="spaces"> </span><span class="nottickedoff">in</span> +<span class="lineno"> 172 </span><span class="spaces"> </span><span class="nottickedoff">case quadratic c1 c2 c3 of</span> +<span class="lineno"> 173 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -> emptyIList</span> +<span class="lineno"> 174 </span><span class="spaces"> </span><span class="nottickedoff">Just (t1, t2) -> entryexit (g t1) (g t2)</span> +<span class="lineno"> 175 </span><span class="spaces"> </span><span class="nottickedoff">where x = xCoord r</span> +<span class="lineno"> 176 </span><span class="spaces"> </span><span class="nottickedoff">y = yCoord r</span> +<span class="lineno"> 177 </span><span class="spaces"> </span><span class="nottickedoff">z = zCoord r</span> +<span class="lineno"> 178 </span><span class="spaces"> </span><span class="nottickedoff">a = xComponent v</span> +<span class="lineno"> 179 </span><span class="spaces"> </span><span class="nottickedoff">b = yComponent v</span> +<span class="lineno"> 180 </span><span class="spaces"> </span><span class="nottickedoff">c = zComponent v</span> +<span class="lineno"> 181 </span><span class="spaces"> </span><span class="nottickedoff">g t = (t, (Spherical origin v1 v2, (SphereFace, p0, texture)))</span> +<span class="lineno"> 182 </span><span class="spaces"> </span><span class="nottickedoff">where origin = point 0 0 0</span> +<span class="lineno"> 183 </span><span class="spaces"> </span><span class="nottickedoff">x0 = x + t * a</span> +<span class="lineno"> 184 </span><span class="spaces"> </span><span class="nottickedoff">y0 = y + t * b</span> +<span class="lineno"> 185 </span><span class="spaces"> </span><span class="nottickedoff">z0 = z + t * c</span> +<span class="lineno"> 186 </span><span class="spaces"> </span><span class="nottickedoff">p0 = point x0 y0 z0</span> +<span class="lineno"> 187 </span><span class="spaces"> </span><span class="nottickedoff">v0 = vector x0 y0 z0</span> +<span class="lineno"> 188 </span><span class="spaces"> </span><span class="nottickedoff">(v1, v2) = tangents v0</span></span> +<span class="lineno"> 189 </span> +<span class="lineno"> 190 </span> +<span class="lineno"> 191 </span>-------------------------------- +<span class="lineno"> 192 </span>-- Cube +<span class="lineno"> 193 </span>-------------------------------- +<span class="lineno"> 194 </span> +<span class="lineno"> 195 </span>intersectCube :: Ray -> a -> IList (Surface, Texture a) +<span class="lineno"> 196 </span><span class="decl"><span class="istickedoff">intersectCube ray@(r, v) texture</span> +<span class="lineno"> 197 </span><span class="spaces"> </span><span class="istickedoff">= -- The set of t such that (x + at, y + bt, z + ct) lies within</span> +<span class="lineno"> 198 </span><span class="spaces"> </span><span class="istickedoff">-- the unit cube satisfies:</span> +<span class="lineno"> 199 </span><span class="spaces"> </span><span class="istickedoff">-- 0 <= x + at <= 1, 0 <= y + bt <= 1, 0 <= z + ct <= 1</span> +<span class="lineno"> 200 </span><span class="spaces"> </span><span class="istickedoff">-- The minimum and maximum such values of t give us the two</span> +<span class="lineno"> 201 </span><span class="spaces"> </span><span class="istickedoff">-- intersection points.</span> +<span class="lineno"> 202 </span><span class="spaces"> </span><span class="istickedoff">case intersectSlabIval (intersectCubeSlab face2 face3 x a)</span> +<span class="lineno"> 203 </span><span class="spaces"> </span><span class="istickedoff">(intersectSlabIval (intersectCubeSlab face5 face4 y b)</span> +<span class="lineno"> 204 </span><span class="spaces"> </span><span class="istickedoff">(intersectCubeSlab face0 <span class="nottickedoff">face1</span> z c)) of</span> +<span class="lineno"> 205 </span><span class="spaces"> </span><span class="istickedoff">Nothing -> emptyIList</span> +<span class="lineno"> 206 </span><span class="spaces"> </span><span class="istickedoff">Just (t1, t2) -> entryexit (g t1) (g t2)</span> +<span class="lineno"> 207 </span><span class="spaces"> </span><span class="istickedoff">where g ((n, v0, v1), t)</span> +<span class="lineno"> 208 </span><span class="spaces"> </span><span class="istickedoff">= (t, (Planar <span class="nottickedoff">p0</span> v0 v1, (n, p0, texture)))</span> +<span class="lineno"> 209 </span><span class="spaces"> </span><span class="istickedoff">where p0 = offsetToPoint ray t</span> +<span class="lineno"> 210 </span><span class="spaces"> </span><span class="istickedoff">face0 = (CubeFront, vectorY, vectorX)</span> +<span class="lineno"> 211 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">face1 = (CubeBack, vectorX, vectorY)</span></span> +<span class="lineno"> 212 </span><span class="spaces"> </span><span class="istickedoff">face2 = (CubeLeft, vectorZ, vectorY)</span> +<span class="lineno"> 213 </span><span class="spaces"> </span><span class="istickedoff">face3 = (<span class="nottickedoff">CubeRight</span>, <span class="nottickedoff">vectorY</span>, <span class="nottickedoff">vectorZ</span>)</span> +<span class="lineno"> 214 </span><span class="spaces"> </span><span class="istickedoff">face4 = (CubeTop, vectorZ, vectorX)</span> +<span class="lineno"> 215 </span><span class="spaces"> </span><span class="istickedoff">face5 = (CubeBottom, vectorX, vectorZ)</span> +<span class="lineno"> 216 </span><span class="spaces"> </span><span class="istickedoff">vectorX = vector 1 0 0</span> +<span class="lineno"> 217 </span><span class="spaces"> </span><span class="istickedoff">vectorY = vector 0 1 0</span> +<span class="lineno"> 218 </span><span class="spaces"> </span><span class="istickedoff">vectorZ = vector 0 0 1</span> +<span class="lineno"> 219 </span><span class="spaces"> </span><span class="istickedoff">x = xCoord r</span> +<span class="lineno"> 220 </span><span class="spaces"> </span><span class="istickedoff">y = yCoord r</span> +<span class="lineno"> 221 </span><span class="spaces"> </span><span class="istickedoff">z = zCoord r</span> +<span class="lineno"> 222 </span><span class="spaces"> </span><span class="istickedoff">a = xComponent v</span> +<span class="lineno"> 223 </span><span class="spaces"> </span><span class="istickedoff">b = yComponent v</span> +<span class="lineno"> 224 </span><span class="spaces"> </span><span class="istickedoff">c = zComponent v</span></span> +<span class="lineno"> 225 </span> +<span class="lineno"> 226 </span><span class="decl"><span class="istickedoff">intersectCubeSlab n m w d</span> +<span class="lineno"> 227 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">d `near` 0</span> = <span class="nottickedoff">if (0 <= w) && (w <= 1)</span></span> +<span class="lineno"> 228 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">then Just ((n, -inf), (m, inf)) else Nothing</span></span> +<span class="lineno"> 229 </span><span class="spaces"> </span><span class="istickedoff">| d > 0 = Just ((n, (-w)/d), (m, (1-w)/d))</span> +<span class="lineno"> 230 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = Just ((m, (1-w)/d), (n, (-w)/d))</span></span> +<span class="lineno"> 231 </span> +<span class="lineno"> 232 </span><span class="decl"><span class="istickedoff">intersectSlabIval Nothing Nothing = <span class="nottickedoff">Nothing</span></span> +<span class="lineno"> 233 </span><span class="spaces"></span><span class="istickedoff">intersectSlabIval Nothing (Just i) = <span class="nottickedoff">Nothing</span></span> +<span class="lineno"> 234 </span><span class="spaces"></span><span class="istickedoff">intersectSlabIval (Just i) Nothing = Nothing</span> +<span class="lineno"> 235 </span><span class="spaces"></span><span class="istickedoff">intersectSlabIval (Just (nu1@(n1, u1), mv1@(m1, v1)))</span> +<span class="lineno"> 236 </span><span class="spaces"> </span><span class="istickedoff">(Just (nu2@(n2, u2), mv2@(m2, v2)))</span> +<span class="lineno"> 237 </span><span class="spaces"> </span><span class="istickedoff">= checkInterval (nu, mv)</span> +<span class="lineno"> 238 </span><span class="spaces"> </span><span class="istickedoff">where nu = if u1 < u2 then nu2 else nu1</span> +<span class="lineno"> 239 </span><span class="spaces"> </span><span class="istickedoff">mv = if v1 < v2 then mv1 else mv2</span> +<span class="lineno"> 240 </span><span class="spaces"> </span><span class="istickedoff">checkInterval numv@(nu@(_, u), (m, v))</span> +<span class="lineno"> 241 </span><span class="spaces"> </span><span class="istickedoff">-- rounding error may force us to push v out a bit</span> +<span class="lineno"> 242 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">u `near` v</span> = <span class="nottickedoff">Just (nu, (m, u + epsilon))</span></span> +<span class="lineno"> 243 </span><span class="spaces"> </span><span class="istickedoff">| u < v = Just numv</span> +<span class="lineno"> 244 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = Nothing</span></span> +<span class="lineno"> 245 </span> +<span class="lineno"> 246 </span> +<span class="lineno"> 247 </span>-------------------------------- +<span class="lineno"> 248 </span>-- Cylinder +<span class="lineno"> 249 </span>-------------------------------- +<span class="lineno"> 250 </span> +<span class="lineno"> 251 </span>intersectCylinder :: Ray -> a -> IList (Surface, Texture a) +<span class="lineno"> 252 </span><span class="decl"><span class="nottickedoff">intersectCylinder ray texture</span> +<span class="lineno"> 253 </span><span class="spaces"> </span><span class="nottickedoff">= isectSide `intersectIntervals` isectTop `intersectIntervals` isectBottom</span> +<span class="lineno"> 254 </span><span class="spaces"> </span><span class="nottickedoff">where isectSide = intersectCylSide ray texture</span> +<span class="lineno"> 255 </span><span class="spaces"> </span><span class="nottickedoff">isectTop = intersectXZPlane CylinderTop ray 1.0 texture</span> +<span class="lineno"> 256 </span><span class="spaces"> </span><span class="nottickedoff">isectBottom = complementIntervals $ negateSurfaces $</span> +<span class="lineno"> 257 </span><span class="spaces"> </span><span class="nottickedoff">intersectXZPlane CylinderBottom ray 0.0 texture</span></span> +<span class="lineno"> 258 </span> +<span class="lineno"> 259 </span><span class="decl"><span class="nottickedoff">intersectCylSide (r, v) texture</span> +<span class="lineno"> 260 </span><span class="spaces"> </span><span class="nottickedoff">= -- The ray (x + ta, y + tb, z + tc) intersects the sides of the</span> +<span class="lineno"> 261 </span><span class="spaces"> </span><span class="nottickedoff">-- cylinder if:</span> +<span class="lineno"> 262 </span><span class="spaces"> </span><span class="nottickedoff">-- (x + ta)^2 + (z + tc)^2 = 1 and 0 <= y + tb <= 1.</span> +<span class="lineno"> 263 </span><span class="spaces"> </span><span class="nottickedoff">if (sq a + sq c) `near` 0</span> +<span class="lineno"> 264 </span><span class="spaces"> </span><span class="nottickedoff">then -- The ray is parallel to the Y-axis, and does not intersect</span> +<span class="lineno"> 265 </span><span class="spaces"> </span><span class="nottickedoff">-- the cylinder sides. It's either all in, or all out</span> +<span class="lineno"> 266 </span><span class="spaces"> </span><span class="nottickedoff">if (sqxy `near` 1.0 || sqxy < 1.0) then openIList else emptyIList</span> +<span class="lineno"> 267 </span><span class="spaces"> </span><span class="nottickedoff">else -- Find values of t that solve the quadratic equation</span> +<span class="lineno"> 268 </span><span class="spaces"> </span><span class="nottickedoff">-- (a^2 + c^2)t^2 + 2(ax + cz)t + x^2 + z^2 - 1 = 0</span> +<span class="lineno"> 269 </span><span class="spaces"> </span><span class="nottickedoff">let c1 = sq a + sq c</span> +<span class="lineno"> 270 </span><span class="spaces"> </span><span class="nottickedoff">c2 = 2 * (x * a + z * c)</span> +<span class="lineno"> 271 </span><span class="spaces"> </span><span class="nottickedoff">c3 = sq x + sq z - 1</span> +<span class="lineno"> 272 </span><span class="spaces"> </span><span class="nottickedoff">in</span> +<span class="lineno"> 273 </span><span class="spaces"> </span><span class="nottickedoff">case quadratic c1 c2 c3 of</span> +<span class="lineno"> 274 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -> emptyIList</span> +<span class="lineno"> 275 </span><span class="spaces"> </span><span class="nottickedoff">Just (t1, t2) -> entryexit (g t1) (g t2)</span> +<span class="lineno"> 276 </span><span class="spaces"></span><span class="nottickedoff"></span> +<span class="lineno"> 277 </span><span class="spaces"> </span><span class="nottickedoff">where sqxy = sq x + sq y</span> +<span class="lineno"> 278 </span><span class="spaces"> </span><span class="nottickedoff">g t = (t, (Cylindrical origin v1 v2, (CylinderSide, p0, texture)))</span> +<span class="lineno"> 279 </span><span class="spaces"> </span><span class="nottickedoff">where origin = point 0 0 0</span> +<span class="lineno"> 280 </span><span class="spaces"> </span><span class="nottickedoff">x0 = x + t * a</span> +<span class="lineno"> 281 </span><span class="spaces"> </span><span class="nottickedoff">y0 = y + t * b</span> +<span class="lineno"> 282 </span><span class="spaces"> </span><span class="nottickedoff">z0 = z + t * c</span> +<span class="lineno"> 283 </span><span class="spaces"> </span><span class="nottickedoff">p0 = point x0 y0 z0</span> +<span class="lineno"> 284 </span><span class="spaces"> </span><span class="nottickedoff">v0 = vector x0 0 z0</span> +<span class="lineno"> 285 </span><span class="spaces"> </span><span class="nottickedoff">(v1, v2) = tangents v0</span> +<span class="lineno"> 286 </span><span class="spaces"></span><span class="nottickedoff"></span> +<span class="lineno"> 287 </span><span class="spaces"> </span><span class="nottickedoff">x = xCoord r</span> +<span class="lineno"> 288 </span><span class="spaces"> </span><span class="nottickedoff">y = yCoord r</span> +<span class="lineno"> 289 </span><span class="spaces"> </span><span class="nottickedoff">z = zCoord r</span> +<span class="lineno"> 290 </span><span class="spaces"> </span><span class="nottickedoff">a = xComponent v</span> +<span class="lineno"> 291 </span><span class="spaces"> </span><span class="nottickedoff">b = yComponent v</span> +<span class="lineno"> 292 </span><span class="spaces"> </span><span class="nottickedoff">c = zComponent v</span></span> +<span class="lineno"> 293 </span> +<span class="lineno"> 294 </span> +<span class="lineno"> 295 </span>------------------- +<span class="lineno"> 296 </span>-- Cone +<span class="lineno"> 297 </span>------------------- +<span class="lineno"> 298 </span> +<span class="lineno"> 299 </span>intersectCone :: Ray -> a -> IList (Surface, Texture a) +<span class="lineno"> 300 </span><span class="decl"><span class="nottickedoff">intersectCone ray texture</span> +<span class="lineno"> 301 </span><span class="spaces"> </span><span class="nottickedoff">= isectSide `intersectIntervals` isectTop `intersectIntervals` isectBottom</span> +<span class="lineno"> 302 </span><span class="spaces"> </span><span class="nottickedoff">where isectSide = intersectConeSide ray texture</span> +<span class="lineno"> 303 </span><span class="spaces"> </span><span class="nottickedoff">isectTop = intersectXZPlane ConeBase ray 1.0 texture</span> +<span class="lineno"> 304 </span><span class="spaces"> </span><span class="nottickedoff">isectBottom = complementIntervals $ negateSurfaces $</span> +<span class="lineno"> 305 </span><span class="spaces"> </span><span class="nottickedoff">intersectXZPlane ConeBase ray 0.0 texture</span></span> +<span class="lineno"> 306 </span> +<span class="lineno"> 307 </span><span class="decl"><span class="nottickedoff">intersectConeSide (r, v) texture</span> +<span class="lineno"> 308 </span><span class="spaces"> </span><span class="nottickedoff">= -- Find the points where the ray intersects the cond side. At any points of</span> +<span class="lineno"> 309 </span><span class="spaces"> </span><span class="nottickedoff">-- intersection, we must have:</span> +<span class="lineno"> 310 </span><span class="spaces"> </span><span class="nottickedoff">-- (x + ta)^2 + (z + tc)^2 = (y + tb)^2</span> +<span class="lineno"> 311 </span><span class="spaces"> </span><span class="nottickedoff">-- which is the following quadratic equation:</span> +<span class="lineno"> 312 </span><span class="spaces"> </span><span class="nottickedoff">-- t^2(a^2-b^2+c^2) + 2t(xa-yb+cz) + (x^2-y^2+z^2) = 0</span> +<span class="lineno"> 313 </span><span class="spaces"> </span><span class="nottickedoff">let c1 = sq a - sq b + sq c</span> +<span class="lineno"> 314 </span><span class="spaces"> </span><span class="nottickedoff">c2 = 2 * (x * a - y * b + c * z)</span> +<span class="lineno"> 315 </span><span class="spaces"> </span><span class="nottickedoff">c3 = sq x - sq y + sq z</span> +<span class="lineno"> 316 </span><span class="spaces"> </span><span class="nottickedoff">in case quadratic c1 c2 c3 of</span> +<span class="lineno"> 317 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -> emptyIList</span> +<span class="lineno"> 318 </span><span class="spaces"> </span><span class="nottickedoff">Just (t1, t2) -></span> +<span class="lineno"> 319 </span><span class="spaces"> </span><span class="nottickedoff">-- If either intersection strikes the middle, then the other</span> +<span class="lineno"> 320 </span><span class="spaces"> </span><span class="nottickedoff">-- can only be off by rounding error, so we make a tangent</span> +<span class="lineno"> 321 </span><span class="spaces"> </span><span class="nottickedoff">-- strike using the "good" value.</span> +<span class="lineno"> 322 </span><span class="spaces"> </span><span class="nottickedoff">-- If the intersections straddle the origin, then it's</span> +<span class="lineno"> 323 </span><span class="spaces"> </span><span class="nottickedoff">-- an exit/entry pair, otherwise it's an entry/exit pair.</span> +<span class="lineno"> 324 </span><span class="spaces"> </span><span class="nottickedoff">let y1 = y + t1 * b</span> +<span class="lineno"> 325 </span><span class="spaces"> </span><span class="nottickedoff">y2 = y + t2 * b</span> +<span class="lineno"> 326 </span><span class="spaces"> </span><span class="nottickedoff">in if y1 `near` 0 then entryexit (g t1) (g t1)</span> +<span class="lineno"> 327 </span><span class="spaces"> </span><span class="nottickedoff">else if y2 `near` 0 then entryexit (g t2) (g t2)</span> +<span class="lineno"> 328 </span><span class="spaces"> </span><span class="nottickedoff">else if (y1 < 0) `xor` (y2 < 0) then exitentry (g t1) (g t2)</span> +<span class="lineno"> 329 </span><span class="spaces"> </span><span class="nottickedoff">else entryexit (g t1) (g t2)</span> +<span class="lineno"> 330 </span><span class="spaces"></span><span class="nottickedoff"></span> +<span class="lineno"> 331 </span><span class="spaces"> </span><span class="nottickedoff">where g t = (t, (Conic origin v1 v2, (ConeSide, p0, texture)))</span> +<span class="lineno"> 332 </span><span class="spaces"> </span><span class="nottickedoff">where origin = point 0 0 0</span> +<span class="lineno"> 333 </span><span class="spaces"> </span><span class="nottickedoff">x0 = x + t * a</span> +<span class="lineno"> 334 </span><span class="spaces"> </span><span class="nottickedoff">y0 = y + t * b</span> +<span class="lineno"> 335 </span><span class="spaces"> </span><span class="nottickedoff">z0 = z + t * c</span> +<span class="lineno"> 336 </span><span class="spaces"> </span><span class="nottickedoff">p0 = point x0 y0 z0</span> +<span class="lineno"> 337 </span><span class="spaces"> </span><span class="nottickedoff">v0 = normalize $ vector x0 (-y0) z0</span> +<span class="lineno"> 338 </span><span class="spaces"> </span><span class="nottickedoff">(v1, v2) = tangents v0</span> +<span class="lineno"> 339 </span><span class="spaces"></span><span class="nottickedoff"></span> +<span class="lineno"> 340 </span><span class="spaces"> </span><span class="nottickedoff">x = xCoord r</span> +<span class="lineno"> 341 </span><span class="spaces"> </span><span class="nottickedoff">y = yCoord r</span> +<span class="lineno"> 342 </span><span class="spaces"> </span><span class="nottickedoff">z = zCoord r</span> +<span class="lineno"> 343 </span><span class="spaces"> </span><span class="nottickedoff">a = xComponent v</span> +<span class="lineno"> 344 </span><span class="spaces"> </span><span class="nottickedoff">b = yComponent v</span> +<span class="lineno"> 345 </span><span class="spaces"> </span><span class="nottickedoff">c = zComponent v</span> +<span class="lineno"> 346 </span><span class="spaces"></span><span class="nottickedoff"></span> +<span class="lineno"> 347 </span><span class="spaces"> </span><span class="nottickedoff">-- beyond me why this isn't defined in the prelude...</span> +<span class="lineno"> 348 </span><span class="spaces"> </span><span class="nottickedoff">xor False b = b</span> +<span class="lineno"> 349 </span><span class="spaces"> </span><span class="nottickedoff">xor True b = not b</span></span> +<span class="lineno"> 350 </span> +<span class="lineno"> 351 </span> +<span class="lineno"> 352 </span>------------------- +<span class="lineno"> 353 </span>-- Solving quadratics +<span class="lineno"> 354 </span>------------------- +<span class="lineno"> 355 </span> +<span class="lineno"> 356 </span>quadratic :: Double -> Double -> Double -> Maybe (Double, Double) +<span class="lineno"> 357 </span><span class="decl"><span class="nottickedoff">quadratic a b c =</span> +<span class="lineno"> 358 </span><span class="spaces"> </span><span class="nottickedoff">-- Solve the equation ax^2 + bx + c = 0 by using the quadratic formula.</span> +<span class="lineno"> 359 </span><span class="spaces"> </span><span class="nottickedoff">let d = sq b - 4 * a * c</span> +<span class="lineno"> 360 </span><span class="spaces"> </span><span class="nottickedoff">d' = if d `near` 0 then 0 else d</span> +<span class="lineno"> 361 </span><span class="spaces"> </span><span class="nottickedoff">in if d' < 0</span> +<span class="lineno"> 362 </span><span class="spaces"> </span><span class="nottickedoff">then Nothing -- There are no real roots.</span> +<span class="lineno"> 363 </span><span class="spaces"> </span><span class="nottickedoff">else</span> +<span class="lineno"> 364 </span><span class="spaces"> </span><span class="nottickedoff">if a > 0 then Just (((-b) - sqrt d') / (2 * a),</span> +<span class="lineno"> 365 </span><span class="spaces"> </span><span class="nottickedoff">((-b) + sqrt d') / (2 * a))</span> +<span class="lineno"> 366 </span><span class="spaces"> </span><span class="nottickedoff">else Just (((-b) + sqrt d') / (2 * a),</span> +<span class="lineno"> 367 </span><span class="spaces"> </span><span class="nottickedoff">((-b) - sqrt d') / (2 * a))</span></span> +<span class="lineno"> 368 </span> +<span class="lineno"> 369 </span>------------------- +<span class="lineno"> 370 </span>-- Bounding boxes +<span class="lineno"> 371 </span>------------------- +<span class="lineno"> 372 </span> +<span class="lineno"> 373 </span>data MaybeInterval = Interval !Double !Double +<span class="lineno"> 374 </span> | NoInterval +<span class="lineno"> 375 </span> +<span class="lineno"> 376 </span><span class="decl"><span class="istickedoff">isInterval (Interval _ _) = True</span> +<span class="lineno"> 377 </span><span class="spaces"></span><span class="istickedoff">isInterval _ = False</span></span> +<span class="lineno"> 378 </span> +<span class="lineno"> 379 </span>intersectWithBox :: Ray -> Box -> Bool +<span class="lineno"> 380 </span><span class="decl"><span class="istickedoff">intersectWithBox (r, v) (B x1 x2 y1 y2 z1 z2)</span> +<span class="lineno"> 381 </span><span class="spaces"> </span><span class="istickedoff">= isInterval interval</span> +<span class="lineno"> 382 </span><span class="spaces"> </span><span class="istickedoff">where x_interval = intersectRayWithSlab (xCoord r) (xComponent v) (x1, x2)</span> +<span class="lineno"> 383 </span><span class="spaces"> </span><span class="istickedoff">y_interval = intersectRayWithSlab (yCoord r) (yComponent v) (y1, y2)</span> +<span class="lineno"> 384 </span><span class="spaces"> </span><span class="istickedoff">z_interval = intersectRayWithSlab (zCoord r) (zComponent v) (z1, z2)</span> +<span class="lineno"> 385 </span><span class="spaces"> </span><span class="istickedoff">interval = intersectInterval x_interval</span> +<span class="lineno"> 386 </span><span class="spaces"> </span><span class="istickedoff">(intersectInterval y_interval z_interval)</span></span> +<span class="lineno"> 387 </span> +<span class="lineno"> 388 </span>intersectInterval :: MaybeInterval -> MaybeInterval -> MaybeInterval +<span class="lineno"> 389 </span><span class="decl"><span class="istickedoff">intersectInterval NoInterval _ = <span class="nottickedoff">NoInterval</span></span> +<span class="lineno"> 390 </span><span class="spaces"></span><span class="istickedoff">intersectInterval _ NoInterval = NoInterval</span> +<span class="lineno"> 391 </span><span class="spaces"></span><span class="istickedoff">intersectInterval (Interval a b) (Interval c d)</span> +<span class="lineno"> 392 </span><span class="spaces"> </span><span class="istickedoff">| b < c || d < a = NoInterval</span> +<span class="lineno"> 393 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = Interval (a `max` c) (b `min` d)</span></span> +<span class="lineno"> 394 </span> +<span class="lineno"> 395 </span>{-# INLINE intersectRayWithSlab #-} +<span class="lineno"> 396 </span>intersectRayWithSlab :: Double -> Double -> (Double,Double) -> MaybeInterval +<span class="lineno"> 397 </span><span class="decl"><span class="istickedoff">intersectRayWithSlab xCoord alpha (x1, x2)</span> +<span class="lineno"> 398 </span><span class="spaces"> </span><span class="istickedoff">| alpha == 0 = if xCoord < x1 || xCoord > x2 then NoInterval else infInterval</span> +<span class="lineno"> 399 </span><span class="spaces"> </span><span class="istickedoff">| alpha > 0 = Interval a b</span> +<span class="lineno"> 400 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = Interval b a </span> +<span class="lineno"> 401 </span><span class="spaces"> </span><span class="istickedoff">where a = (x1 - xCoord) / alpha</span> +<span class="lineno"> 402 </span><span class="spaces"> </span><span class="istickedoff">b = (x2 - xCoord) / alpha</span></span> +<span class="lineno"> 403 </span> +<span class="lineno"> 404 </span><span class="decl"><span class="istickedoff">infInterval = Interval (-inf) inf</span></span> + +</pre> +</html> +Writing: Misc.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Misc where +<span class="lineno"> 7 </span> +<span class="lineno"> 8 </span>import Debug.Trace +<span class="lineno"> 9 </span> +<span class="lineno"> 10 </span><span class="decl"><span class="nottickedoff">debug s v = trace (s ++" : "++ show v ++ "\n") v</span></span> +<span class="lineno"> 11 </span>-- debug s v = v + +</pre> +</html> +Writing: Interval.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Interval +<span class="lineno"> 7 </span> ( IList +<span class="lineno"> 8 </span> , Intersection +<span class="lineno"> 9 </span> , emptyIList, openIList +<span class="lineno"> 10 </span> , mkEntry, mkExit +<span class="lineno"> 11 </span> , entryexit, exitentry +<span class="lineno"> 12 </span> , mapI +<span class="lineno"> 13 </span> , unionIntervals, intersectIntervals, differenceIntervals +<span class="lineno"> 14 </span> , complementIntervals +<span class="lineno"> 15 </span> ) where +<span class="lineno"> 16 </span> +<span class="lineno"> 17 </span>import Geometry +<span class="lineno"> 18 </span> +<span class="lineno"> 19 </span>-- The result of a ray trace is represented as a list of surface +<span class="lineno"> 20 </span>-- intersections. Each intersection is a point along the ray with +<span class="lineno"> 21 </span>-- a flag indicating whether this intersection is an entry or an +<span class="lineno"> 22 </span>-- exit from the solid. Each intersection also carries unspecified +<span class="lineno"> 23 </span>-- surface data for use by the illumination model. +<span class="lineno"> 24 </span> +<span class="lineno"> 25 </span>-- Just the list of intersections isn't enough, however. An empty +<span class="lineno"> 26 </span>-- list can denote either a trace that is always within the solid +<span class="lineno"> 27 </span>-- or never in the solid. To dissambiguate, an extra flag is kept +<span class="lineno"> 28 </span>-- that indicates whether we are starting inside or outside of the +<span class="lineno"> 29 </span>-- solid. As a convenience, we also keep an additional flag that +<span class="lineno"> 30 </span>-- indicates whether the last intersection ends inside or outside. +<span class="lineno"> 31 </span> +<span class="lineno"> 32 </span>type IList a = (Bool, [Intersection a], Bool) +<span class="lineno"> 33 </span>type Intersection a = (Double, Bool, a) +<span class="lineno"> 34 </span> +<span class="lineno"> 35 </span><span class="decl"><span class="istickedoff">emptyIList = (False, [], False)</span></span> +<span class="lineno"> 36 </span><span class="decl"><span class="nottickedoff">openIList = (True, [], True)</span></span> +<span class="lineno"> 37 </span> +<span class="lineno"> 38 </span><span class="decl"><span class="istickedoff">mapI f (b1, is, b2) = (b1, map f is, b2)</span></span> +<span class="lineno"> 39 </span> +<span class="lineno"> 40 </span><span class="decl"><span class="istickedoff">isEntry (_, entry, _) = entry</span></span> +<span class="lineno"> 41 </span><span class="decl"><span class="nottickedoff">isExit (_, entry, _) = not entry</span></span> +<span class="lineno"> 42 </span> +<span class="lineno"> 43 </span><span class="decl"><span class="istickedoff">mkEntry (t, a) = (t, True, a)</span></span> +<span class="lineno"> 44 </span><span class="decl"><span class="istickedoff">mkExit (t, a) = (t, False, a)</span></span> +<span class="lineno"> 45 </span> +<span class="lineno"> 46 </span><span class="decl"><span class="istickedoff">entryexit w1 w2 = (False, [mkEntry w1, mkExit w2], False)</span></span> +<span class="lineno"> 47 </span><span class="decl"><span class="nottickedoff">exitentry w1 w2 = (True, [mkExit w1, mkEntry w2], True)</span></span> +<span class="lineno"> 48 </span><span class="decl"><span class="nottickedoff">arrange w1@(t1, _) w2@(t2, _) | t1 < t2 = entryexit w1 w2</span> +<span class="lineno"> 49 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = entryexit w2 w1</span></span> +<span class="lineno"> 50 </span> +<span class="lineno"> 51 </span> +<span class="lineno"> 52 </span>cmpI :: Intersection a -> Intersection a -> Ordering +<span class="lineno"> 53 </span><span class="decl"><span class="istickedoff">cmpI (i, _, _) (j, _, _)</span> +<span class="lineno"> 54 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">i `near` j</span> = <span class="nottickedoff">EQ</span></span> +<span class="lineno"> 55 </span><span class="spaces"> </span><span class="istickedoff">| i < j = LT</span> +<span class="lineno"> 56 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = GT</span></span> +<span class="lineno"> 57 </span> +<span class="lineno"> 58 </span><span class="decl"><span class="nottickedoff">bad (b1, [], b2) = b1 /= b2</span> +<span class="lineno"> 59 </span><span class="spaces"></span><span class="nottickedoff">bad (b1, is, b2) = bad' b1 is || b2 /= b3</span> +<span class="lineno"> 60 </span><span class="spaces"> </span><span class="nottickedoff">where (_, b3, _) = last is</span></span> +<span class="lineno"> 61 </span> +<span class="lineno"> 62 </span><span class="decl"><span class="nottickedoff">bad' b [] = False</span> +<span class="lineno"> 63 </span><span class="spaces"></span><span class="nottickedoff">bad' b ((_, c, _) : is) = b == c || bad' c is</span></span> +<span class="lineno"> 64 </span> +<span class="lineno"> 65 </span>unionIntervals :: IList a -> IList a -> IList a +<span class="lineno"> 66 </span><span class="decl"><span class="istickedoff">unionIntervals (isStartOpen, is, isEndOpen) (jsStartOpen, js, jsEndOpen)</span> +<span class="lineno"> 67 </span><span class="spaces"> </span><span class="istickedoff">= (isStartOpen || jsStartOpen, uniIntervals is js, isEndOpen || jsEndOpen)</span> +<span class="lineno"> 68 </span><span class="spaces"> </span><span class="istickedoff">where uniIntervals is [] | <span class="tickonlyfalse">jsEndOpen</span> = <span class="nottickedoff">[]</span></span> +<span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = is</span> +<span class="lineno"> 70 </span><span class="spaces"> </span><span class="istickedoff">uniIntervals [] js | <span class="tickonlyfalse">isEndOpen</span> = <span class="nottickedoff">[]</span></span> +<span class="lineno"> 71 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span> = js</span> +<span class="lineno"> 72 </span><span class="spaces"> </span><span class="istickedoff">uniIntervals is@(i : is') js@(j : js')</span> +<span class="lineno"> 73 </span><span class="spaces"> </span><span class="istickedoff">= case cmpI i j of</span> +<span class="lineno"> 74 </span><span class="spaces"> </span><span class="istickedoff">EQ -> <span class="nottickedoff">if isEntry i == isEntry j then i : uniIntervals is' js'</span></span> +<span class="lineno"> 75 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">else uniIntervals is' js'</span></span> +<span class="lineno"> 76 </span><span class="spaces"> </span><span class="istickedoff">LT -> if <span class="tickonlytrue">isEntry j</span> then i : <span class="nottickedoff">uniIntervals is' js</span></span> +<span class="lineno"> 77 </span><span class="spaces"> </span><span class="istickedoff">else <span class="nottickedoff">uniIntervals is' js</span></span> +<span class="lineno"> 78 </span><span class="spaces"> </span><span class="istickedoff">GT -> if <span class="tickonlytrue">isEntry i</span> then j : uniIntervals is js'</span> +<span class="lineno"> 79 </span><span class="spaces"> </span><span class="istickedoff">else <span class="nottickedoff">uniIntervals is js'</span></span></span> +<span class="lineno"> 80 </span> +<span class="lineno"> 81 </span>intersectIntervals :: IList a -> IList a -> IList a +<span class="lineno"> 82 </span><span class="decl"><span class="nottickedoff">intersectIntervals is js</span> +<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">= complementIntervals (unionIntervals is' js')</span> +<span class="lineno"> 84 </span><span class="spaces"> </span><span class="nottickedoff">where is' = complementIntervals is</span> +<span class="lineno"> 85 </span><span class="spaces"> </span><span class="nottickedoff">js' = complementIntervals js</span></span> +<span class="lineno"> 86 </span> +<span class="lineno"> 87 </span>differenceIntervals :: IList a -> IList a -> IList a +<span class="lineno"> 88 </span><span class="decl"><span class="nottickedoff">differenceIntervals is js</span> +<span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">= complementIntervals (unionIntervals is' js)</span> +<span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">where is' = complementIntervals is</span></span> +<span class="lineno"> 91 </span> +<span class="lineno"> 92 </span>complementIntervals :: IList a -> IList a +<span class="lineno"> 93 </span><span class="decl"><span class="nottickedoff">complementIntervals (o1, is, o2)</span> +<span class="lineno"> 94 </span><span class="spaces"> </span><span class="nottickedoff">= (not o1, [ (i, not isentry, a) | (i, isentry, a) <- is ], not o2)</span></span> +<span class="lineno"> 95 </span> +<span class="lineno"> 96 </span>-- tests... +<span class="lineno"> 97 </span> +<span class="lineno"> 98 </span>{- +<span class="lineno"> 99 </span>mkIn, mkOut :: Double -> Intersection a +<span class="lineno"> 100 </span>mkIn x = (x, True, undefined) +<span class="lineno"> 101 </span>mkOut x = (x, False, undefined) +<span class="lineno"> 102 </span> +<span class="lineno"> 103 </span>i1 = (False, [ mkIn 2, mkOut 7 ], False) +<span class="lineno"> 104 </span>i1' = (True, [ mkOut 2, mkIn 7 ], True) +<span class="lineno"> 105 </span>i2 = (False, [ mkIn 1, mkOut 3, mkIn 4, mkOut 5, mkIn 6, mkOut 8 ], False) +<span class="lineno"> 106 </span> +<span class="lineno"> 107 </span>t1 = unionIntervals i1 i2 +<span class="lineno"> 108 </span>t2 = intersectIntervals i1 i2 +<span class="lineno"> 109 </span>t3 = intersectIntervals i2 i1 +<span class="lineno"> 110 </span>t4 = complementIntervals i1 +<span class="lineno"> 111 </span>t5 = intersectIntervals i2 i1' +<span class="lineno"> 112 </span>t6 = differenceIntervals i2 i1 +<span class="lineno"> 113 </span>t7 = differenceIntervals i2 i2 +<span class="lineno"> 114 </span> +<span class="lineno"> 115 </span>sh (o1,is,o2) = +<span class="lineno"> 116 </span> do if o1 then putStr "..." else return () +<span class="lineno"> 117 </span> putStr $ foldr1 (++) (map si is) +<span class="lineno"> 118 </span> if o2 then putStr "..." else return () +<span class="lineno"> 119 </span>si (i, True, _, _) = "<" ++ show i +<span class="lineno"> 120 </span>si (i, False, _, _) = " " ++ show i ++ ">" +<span class="lineno"> 121 </span>-} + +</pre> +</html> +Writing: Surface.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Surface +<span class="lineno"> 7 </span> ( SurfaceFn (..) +<span class="lineno"> 8 </span> , Properties +<span class="lineno"> 9 </span> , sfun, sconst +<span class="lineno"> 10 </span> , prop +<span class="lineno"> 11 </span> , matte, shiny +<span class="lineno"> 12 </span> , chgColor +<span class="lineno"> 13 </span> , surface +<span class="lineno"> 14 </span> ) where +<span class="lineno"> 15 </span> +<span class="lineno"> 16 </span>import Geometry +<span class="lineno"> 17 </span>import CSG +<span class="lineno"> 18 </span>import Misc +<span class="lineno"> 19 </span> +<span class="lineno"> 20 </span>-- the surface gets passed face then u then v. +<span class="lineno"> 21 </span>data SurfaceFn c v = SFun (Int -> Double -> Double -> Properties c v) +<span class="lineno"> 22 </span> | SConst (Properties c v) +<span class="lineno"> 23 </span> +<span class="lineno"> 24 </span>sfun :: (Int -> Double -> Double -> Properties c v) -> SurfaceFn c v +<span class="lineno"> 25 </span><span class="decl"><span class="nottickedoff">sfun = SFun</span></span> +<span class="lineno"> 26 </span>sconst :: Properties c v -> SurfaceFn c v +<span class="lineno"> 27 </span><span class="decl"><span class="nottickedoff">sconst = SConst</span></span> +<span class="lineno"> 28 </span> +<span class="lineno"> 29 </span>type Properties c v = (c, v, v, v) +<span class="lineno"> 30 </span> +<span class="lineno"> 31 </span><span class="decl"><span class="istickedoff">prop c d s p = (c, d, s, p)</span></span> +<span class="lineno"> 32 </span> +<span class="lineno"> 33 </span><span class="decl"><span class="nottickedoff">matte = (white, 1.0, 0.0, 1.0)</span></span> +<span class="lineno"> 34 </span><span class="decl"><span class="nottickedoff">shiny = (white, 0.0, 1.0, 1.0)</span></span> +<span class="lineno"> 35 </span> +<span class="lineno"> 36 </span>chgColor :: c -> Properties d v -> Properties c v +<span class="lineno"> 37 </span><span class="decl"><span class="nottickedoff">chgColor c (_, d, s, p) = (c, d, s, p)</span></span> +<span class="lineno"> 38 </span> +<span class="lineno"> 39 </span>instance (Show c, Show v) => Show (SurfaceFn c v) where +<span class="lineno"> 40 </span> <span class="decl"><span class="nottickedoff">show (SFun _) = "Surface function"</span> +<span class="lineno"> 41 </span><span class="spaces"> </span><span class="nottickedoff">-- show (SConst p) = "Surface constant: " ++ show p</span> +<span class="lineno"> 42 </span><span class="spaces"> </span><span class="nottickedoff">show (SConst p) = "Surface constant"</span></span> +<span class="lineno"> 43 </span> +<span class="lineno"> 44 </span>evalSurface :: SurfaceFn Color Double -> Int -> Double -> Double -> Properties Color Double +<span class="lineno"> 45 </span><span class="decl"><span class="istickedoff">evalSurface (SConst p) = <span class="nottickedoff">\_ _ _ -> p</span></span> +<span class="lineno"> 46 </span><span class="spaces"></span><span class="istickedoff">evalSurface (SFun f) = f</span></span> +<span class="lineno"> 47 </span> +<span class="lineno"> 48 </span>-- calculate surface properties, given the type of +<span class="lineno"> 49 </span>-- surface, and intersection point in object coordinates +<span class="lineno"> 50 </span> +<span class="lineno"> 51 </span>-- surface :: Surface SurfaceFn -> (Int, Point) -> (Vector, Properties) +<span class="lineno"> 52 </span> +<span class="lineno"> 53 </span><span class="decl"><span class="istickedoff">surface (Planar _ v0 v1) (n, p0, fn)</span> +<span class="lineno"> 54 </span><span class="spaces"> </span><span class="istickedoff">= (norm, evalSurface fn <span class="nottickedoff">n'</span> u v)</span> +<span class="lineno"> 55 </span><span class="spaces"> </span><span class="istickedoff">where norm = normalize $ cross v0 v1</span> +<span class="lineno"> 56 </span><span class="spaces"> </span><span class="istickedoff">(n', u, v) = planarUV n p0</span> +<span class="lineno"> 57 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 58 </span><span class="spaces"></span><span class="istickedoff">surface (Spherical _ v0 v1) (_, p0, fn)</span> +<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">(norm, evalSurface fn 0 u v)</span></span> +<span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">x = xCoord p0</span></span> +<span class="lineno"> 61 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">y = yCoord p0</span></span> +<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">z = zCoord p0</span></span> +<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">k = sqrt (1 - sq y)</span></span> +<span class="lineno"> 64 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">theta = adjustRadian (atan2 (x / k) (z / k))</span></span> +<span class="lineno"> 65 </span><span class="spaces"> </span><span class="istickedoff">-- correct so that the image grows left-to-right</span> +<span class="lineno"> 66 </span><span class="spaces"> </span><span class="istickedoff">-- instead of right-to-left</span> +<span class="lineno"> 67 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">u = 1.0 - clampf (theta / (2 * pi))</span></span> +<span class="lineno"> 68 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">v = clampf ((y + 1) / 2)</span></span> +<span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">norm = normalize $ cross v0 v1</span></span> +<span class="lineno"> 70 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 71 </span><span class="spaces"></span><span class="istickedoff">-- ZZ ignore the (incorrect) surface model, and estimate the normal</span> +<span class="lineno"> 72 </span><span class="spaces"></span><span class="istickedoff">-- from the intersection in object space</span> +<span class="lineno"> 73 </span><span class="spaces"></span><span class="istickedoff">surface (Cylindrical _ v0 v1) (_, p0, fn)</span> +<span class="lineno"> 74 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">(norm, evalSurface fn 0 u v)</span></span> +<span class="lineno"> 75 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">x = xCoord p0</span></span> +<span class="lineno"> 76 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">y = yCoord p0</span></span> +<span class="lineno"> 77 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">z = zCoord p0</span></span> +<span class="lineno"> 78 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">u = clampf $ adjustRadian (atan2 x z) / (2 * pi)</span></span> +<span class="lineno"> 79 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">v = y</span></span> +<span class="lineno"> 80 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">norm = normalize $ cross v0 v1</span></span> +<span class="lineno"> 81 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 82 </span><span class="spaces"></span><span class="istickedoff">-- ZZ ignore the (incorrect) surface model, and estimate the normal</span> +<span class="lineno"> 83 </span><span class="spaces"></span><span class="istickedoff">-- from the intersection in object space</span> +<span class="lineno"> 84 </span><span class="spaces"></span><span class="istickedoff">surface (Conic _ v0 v1) (_, p0, fn)</span> +<span class="lineno"> 85 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">(norm, evalSurface fn 0 u v)</span></span> +<span class="lineno"> 86 </span><span class="spaces"> </span><span class="istickedoff">where <span class="nottickedoff">x = xCoord p0</span></span> +<span class="lineno"> 87 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">y = yCoord p0</span></span> +<span class="lineno"> 88 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">z = zCoord p0</span></span> +<span class="lineno"> 89 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">u = clampf $ adjustRadian (atan2 (x / y) (z / y)) / (2 * pi)</span></span> +<span class="lineno"> 90 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">v = y</span></span> +<span class="lineno"> 91 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">norm = normalize $ cross v0 v1</span></span></span> +<span class="lineno"> 92 </span> +<span class="lineno"> 93 </span><span class="decl"><span class="istickedoff">planarUV face p0</span> +<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">= case face of</span> +<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">PlaneFace -> (<span class="nottickedoff">0</span>, x, z)</span> +<span class="lineno"> 96 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 97 </span><span class="spaces"> </span><span class="istickedoff">CubeFront -> (<span class="nottickedoff">0</span>, x, y)</span> +<span class="lineno"> 98 </span><span class="spaces"> </span><span class="istickedoff">CubeBack -> <span class="nottickedoff">(1, x, y)</span></span> +<span class="lineno"> 99 </span><span class="spaces"> </span><span class="istickedoff">CubeLeft -> (<span class="nottickedoff">2</span>, z, y)</span> +<span class="lineno"> 100 </span><span class="spaces"> </span><span class="istickedoff">CubeRight -> <span class="nottickedoff">(3, z, y)</span></span> +<span class="lineno"> 101 </span><span class="spaces"> </span><span class="istickedoff">CubeTop -> (<span class="nottickedoff">4</span>, x, z)</span> +<span class="lineno"> 102 </span><span class="spaces"> </span><span class="istickedoff">CubeBottom -> (<span class="nottickedoff">5</span>, x, z)</span> +<span class="lineno"> 103 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 104 </span><span class="spaces"> </span><span class="istickedoff">CylinderTop -> <span class="nottickedoff">(1, (x + 1) / 2, (z + 1) / 2)</span></span> +<span class="lineno"> 105 </span><span class="spaces"> </span><span class="istickedoff">CylinderBottom -> <span class="nottickedoff">(2, (x + 1) / 2, (z + 1) / 2)</span></span> +<span class="lineno"> 106 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 107 </span><span class="spaces"> </span><span class="istickedoff">ConeBase -> <span class="nottickedoff">(1, (x + 1) / 2, (z + 1) / 2)</span></span> +<span class="lineno"> 108 </span><span class="spaces"> </span><span class="istickedoff">where x = xCoord p0</span> +<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff">y = yCoord p0</span> +<span class="lineno"> 110 </span><span class="spaces"> </span><span class="istickedoff">z = zCoord p0</span></span> +<span class="lineno"> 111 </span> +<span class="lineno"> 112 </span>-- misc +<span class="lineno"> 113 </span> +<span class="lineno"> 114 </span>adjustRadian :: Radian -> Radian +<span class="lineno"> 115 </span><span class="decl"><span class="nottickedoff">adjustRadian r = if r > 0 then r else r + 2 * pi</span></span> + +</pre> +</html> +Writing: Primitives.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Primitives where +<span class="lineno"> 7 </span> +<span class="lineno"> 8 </span>rad2deg :: Double -> Double +<span class="lineno"> 9 </span><span class="decl"><span class="nottickedoff">rad2deg r = r * 180 / pi</span></span> +<span class="lineno"> 10 </span> +<span class="lineno"> 11 </span>deg2rad :: Double -> Double +<span class="lineno"> 12 </span><span class="decl"><span class="istickedoff">deg2rad d = d * pi / 180</span></span> +<span class="lineno"> 13 </span> +<span class="lineno"> 14 </span>addi :: Int -> Int -> Int +<span class="lineno"> 15 </span><span class="decl"><span class="nottickedoff">addi = (+)</span></span> +<span class="lineno"> 16 </span> +<span class="lineno"> 17 </span>addf :: Double -> Double -> Double +<span class="lineno"> 18 </span><span class="decl"><span class="nottickedoff">addf = (+)</span></span> +<span class="lineno"> 19 </span> +<span class="lineno"> 20 </span>acosD :: Double -> Double +<span class="lineno"> 21 </span><span class="decl"><span class="nottickedoff">acosD x = acos x * 180 / pi</span></span> +<span class="lineno"> 22 </span> +<span class="lineno"> 23 </span>asinD :: Double -> Double +<span class="lineno"> 24 </span><span class="decl"><span class="nottickedoff">asinD x = asin x * 180 / pi</span></span> + +</pre> +</html> +Writing: Eval.hs.html +<html><style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +<pre> +<span class="lineno"> 1 </span>-- Copyright (c) 2000 Galois Connections, Inc. +<span class="lineno"> 2 </span>-- All rights reserved. This software is distributed as +<span class="lineno"> 3 </span>-- free software under the license in the file "LICENSE", +<span class="lineno"> 4 </span>-- which is included in the distribution. +<span class="lineno"> 5 </span> +<span class="lineno"> 6 </span>module Eval where +<span class="lineno"> 7 </span> +<span class="lineno"> 8 </span>import Array +<span class="lineno"> 9 </span> +<span class="lineno"> 10 </span>import Geometry +<span class="lineno"> 11 </span>import CSG +<span class="lineno"> 12 </span>import Surface +<span class="lineno"> 13 </span>import Data +<span class="lineno"> 14 </span>import Parse (rayParse, rayParseF) +<span class="lineno"> 15 </span> +<span class="lineno"> 16 </span>class Monad m => MonadEval m where +<span class="lineno"> 17 </span> doOp :: PrimOp -> GMLOp -> Stack -> m Stack +<span class="lineno"> 18 </span> tick :: m () +<span class="lineno"> 19 </span> err :: String -> m a +<span class="lineno"> 20 </span> +<span class="lineno"> 21 </span> <span class="decl"><span class="istickedoff">tick = return <span class="nottickedoff">()</span></span></span> +<span class="lineno"> 22 </span> +<span class="lineno"> 23 </span>newtype Pure a = Pure a deriving <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span> +<span class="lineno"> 24 </span> +<span class="lineno"> 25 </span>instance Monad Pure where +<span class="lineno"> 26 </span> <span class="decl"><span class="istickedoff">Pure x >>= k = k x</span></span> +<span class="lineno"> 27 </span> <span class="decl"><span class="istickedoff">return = Pure</span></span> +<span class="lineno"> 28 </span> <span class="decl"><span class="nottickedoff">fail s = error s</span></span> +<span class="lineno"> 29 </span> +<span class="lineno"> 30 </span>instance MonadEval Pure where +<span class="lineno"> 31 </span> <span class="decl"><span class="istickedoff">doOp = doPureOp</span></span> +<span class="lineno"> 32 </span> <span class="decl"><span class="nottickedoff">err s = error s</span></span> +<span class="lineno"> 33 </span> +<span class="lineno"> 34 </span>instance MonadEval IO where +<span class="lineno"> 35 </span> <span class="decl"><span class="istickedoff">doOp prim op stk = do { -- putStrLn ("Calling " ++ show op</span> +<span class="lineno"> 36 </span><span class="spaces"> </span><span class="istickedoff">-- ++ " << " ++ show stk ++ " >>")</span> +<span class="lineno"> 37 </span><span class="spaces"> </span><span class="istickedoff">doAllOp prim op stk</span> +<span class="lineno"> 38 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> +<span class="lineno"> 39 </span> <span class="decl"><span class="nottickedoff">err s = error s</span></span> +<span class="lineno"> 40 </span> +<span class="lineno"> 41 </span>data State +<span class="lineno"> 42 </span> = State { env :: Env +<span class="lineno"> 43 </span> , stack :: Stack +<span class="lineno"> 44 </span> , code :: Code +<span class="lineno"> 45 </span> } deriving <span class="decl"><span class="nottickedoff"><span class="decl"><span class="nottickedoff">Show</span></span></span></span> +<span class="lineno"> 46 </span> +<span class="lineno"> 47 </span>callback :: Env -> Code -> Stack -> Stack +<span class="lineno"> 48 </span><span class="decl"><span class="istickedoff">callback env code stk</span> +<span class="lineno"> 49 </span><span class="spaces"> </span><span class="istickedoff">= case eval (State { env = env, stack = stk, code = code}) of</span> +<span class="lineno"> 50 </span><span class="spaces"> </span><span class="istickedoff">Pure stk -> stk</span></span> +<span class="lineno"> 51 </span> +<span class="lineno"> 52 </span>{-# SPECIALIZE eval :: State -> Pure Stack #-} +<span class="lineno"> 53 </span>{-# SPECIALIZE eval :: State -> IO Stack #-} +<span class="lineno"> 54 </span> +<span class="lineno"> 55 </span>eval :: MonadEval m => State -> m Stack +<span class="lineno"> 56 </span><span class="decl"><span class="istickedoff">eval st =</span> +<span class="lineno"> 57 </span><span class="spaces"> </span><span class="istickedoff">do { () <- return () -- $ unsafePerformIO (print st) -- Functional debugger</span> +<span class="lineno"> 58 </span><span class="spaces"> </span><span class="istickedoff">; if moreCode st then</span> +<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff">do { tick -- tick first, so as to catch loops on new eval.</span> +<span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff">; st' <- step st</span> +<span class="lineno"> 61 </span><span class="spaces"> </span><span class="istickedoff">; eval st'</span> +<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff">else return (stack st)</span> +<span class="lineno"> 64 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> +<span class="lineno"> 65 </span> +<span class="lineno"> 66 </span>moreCode :: State -> Bool +<span class="lineno"> 67 </span><span class="decl"><span class="istickedoff">moreCode (State {code = []}) = False</span> +<span class="lineno"> 68 </span><span class="spaces"></span><span class="istickedoff">moreCode _ = True</span></span> +<span class="lineno"> 69 </span> +<span class="lineno"> 70 </span>-- Step has a precondition that there *is* code to run +<span class="lineno"> 71 </span>{-# SPECIALIZE step :: State -> Pure State #-} +<span class="lineno"> 72 </span>{-# SPECIALIZE step :: State -> IO State #-} +<span class="lineno"> 73 </span>step :: MonadEval m => State -> m State +<span class="lineno"> 74 </span> +<span class="lineno"> 75 </span>-- Rule 1: Pushing BaseValues +<span class="lineno"> 76 </span><span class="decl"><span class="istickedoff">step st@(State{ stack = stack, code = (TBool b):cs }) </span> +<span class="lineno"> 77 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">return (st { stack = (VBool b):stack, code = cs })</span></span> +<span class="lineno"> 78 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ stack = stack, code = (TInt i):cs }) </span> +<span class="lineno"> 79 </span><span class="spaces"> </span><span class="istickedoff">= return (st { stack = (VInt i):stack, code = cs })</span> +<span class="lineno"> 80 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ stack = stack, code = (TReal r):cs }) </span> +<span class="lineno"> 81 </span><span class="spaces"> </span><span class="istickedoff">= return (st { stack = (VReal r):stack, code = cs })</span> +<span class="lineno"> 82 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ stack = stack, code = (TString s):cs }) </span> +<span class="lineno"> 83 </span><span class="spaces"> </span><span class="istickedoff">= return (st { stack = (VString <span class="nottickedoff">s</span>):stack, code = cs })</span> +<span class="lineno"> 84 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 85 </span><span class="spaces"></span><span class="istickedoff">-- Rule 2: Name binding</span> +<span class="lineno"> 86 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = (v:stack), code = (TBind id):cs }) =</span> +<span class="lineno"> 87 </span><span class="spaces"> </span><span class="istickedoff">return (State { env = extendEnv env id v, stack = stack, code = cs })</span> +<span class="lineno"> 88 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = [], code = (TBind id):cs }) =</span> +<span class="lineno"> 89 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">err "Attempt to bind the top of an empty stack"</span></span> +<span class="lineno"> 90 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 91 </span><span class="spaces"></span><span class="istickedoff">-- Rule 3: Name lookup</span> +<span class="lineno"> 92 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = stack, code = (TId id):cs }) =</span> +<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">case (lookupEnv env id) of</span> +<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">Just v -> return (st { stack = v:stack, code = cs })</span> +<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">Nothing -> <span class="nottickedoff">err ("Cannot find value for identifier: " ++ id)</span></span> +<span class="lineno"> 96 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 97 </span><span class="spaces"></span><span class="istickedoff">-- Rule 4: Closure creation</span> +<span class="lineno"> 98 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = stack, code = (TBody body):cs }) =</span> +<span class="lineno"> 99 </span><span class="spaces"> </span><span class="istickedoff">return (st { stack = (VClosure env body):stack, code = cs })</span> +<span class="lineno"> 100 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 101 </span><span class="spaces"></span><span class="istickedoff">-- Rule 5: Application</span> +<span class="lineno"> 102 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = (VClosure env' code'):stack, code = TApply:cs }) =</span> +<span class="lineno"> 103 </span><span class="spaces"> </span><span class="istickedoff">do { stk <- eval (State {env = <span class="nottickedoff">env'</span>, stack = stack, code = code'})</span> +<span class="lineno"> 104 </span><span class="spaces"> </span><span class="istickedoff">; return (st { stack = stk, code = cs })</span> +<span class="lineno"> 105 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 106 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = [], code = TApply:cs }) =</span> +<span class="lineno"> 107 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">err "Application with an empty stack"</span></span> +<span class="lineno"> 108 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = _:_, code = TApply:cs }) =</span> +<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">err "Application of a non-closure"</span></span> +<span class="lineno"> 110 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 111 </span><span class="spaces"></span><span class="istickedoff">-- Rule 6: Arrays</span> +<span class="lineno"> 112 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = stack, code = TArray code':cs }) =</span> +<span class="lineno"> 113 </span><span class="spaces"> </span><span class="istickedoff">do { stk <- eval (State {env = env, stack = [], code = code'})</span> +<span class="lineno"> 114 </span><span class="spaces"> </span><span class="istickedoff">; let last = length stk-1</span> +<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff">; let arr = array (0,last) (zip [last,last-1..] stk)</span> +<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff">; return (st { stack = (VArray arr):stack, code = cs })</span> +<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 118 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 119 </span><span class="spaces"></span><span class="istickedoff">-- Rule 7 & 8: If statement</span> +<span class="lineno"> 120 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = (VClosure e2 c2):(VClosure e1 c1):(VBool True):stack, code = TIf:cs }) =</span> +<span class="lineno"> 121 </span><span class="spaces"> </span><span class="istickedoff">do { stk <- eval (State {env = e1, stack = stack, code = c1})</span> +<span class="lineno"> 122 </span><span class="spaces"> </span><span class="istickedoff">; return (st { stack = stk, code = cs })</span> +<span class="lineno"> 123 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 124 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = (VClosure e2 c2):(VClosure e1 c1):(VBool False):stack, code = TIf:cs }) =</span> +<span class="lineno"> 125 </span><span class="spaces"> </span><span class="istickedoff">do { stk <- eval (State {env = e2, stack = stack, code = c2})</span> +<span class="lineno"> 126 </span><span class="spaces"> </span><span class="istickedoff">; return (st { stack = stk, code = cs })</span> +<span class="lineno"> 127 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 128 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = _, code = TIf:cs }) =</span> +<span class="lineno"> 129 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">err "Incorrect use of if (bad and/or inappropriate values on the stack)"</span></span> +<span class="lineno"> 130 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 131 </span><span class="spaces"></span><span class="istickedoff">-- Rule 9: Operators</span> +<span class="lineno"> 132 </span><span class="spaces"></span><span class="istickedoff">step st@(State{ env = env, stack = stack, code = (TOp op):cs }) =</span> +<span class="lineno"> 133 </span><span class="spaces"> </span><span class="istickedoff">do { stk <- doOp (opFnTable ! op) op stack</span> +<span class="lineno"> 134 </span><span class="spaces"> </span><span class="istickedoff">; return (st { stack = stk, code = cs })</span> +<span class="lineno"> 135 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 136 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 137 </span><span class="spaces"></span><span class="istickedoff">-- Rule Opps</span> +<span class="lineno"> 138 </span><span class="spaces"></span><span class="istickedoff">step _ = <span class="nottickedoff">err "Tripped on sidewalk while stepping."</span></span></span> +<span class="lineno"> 139 </span> +<span class="lineno"> 140 </span> +<span class="lineno"> 141 </span>-------------------------------------------------------------------------- +<span class="lineno"> 142 </span>-- Operator code +<span class="lineno"> 143 </span> +<span class="lineno"> 144 </span>opFnTable :: Array GMLOp PrimOp +<span class="lineno"> 145 </span><span class="decl"><span class="istickedoff">opFnTable = array (minBound,maxBound) </span> +<span class="lineno"> 146 </span><span class="spaces"> </span><span class="istickedoff">[ (op,prim) | (_,TOp op,prim) <- opcodes ]</span></span> +<span class="lineno"> 147 </span> +<span class="lineno"> 148 </span> +<span class="lineno"> 149 </span> +<span class="lineno"> 150 </span> +<span class="lineno"> 151 </span>doPureOp :: (MonadEval m) => PrimOp -> GMLOp -> Stack -> m Stack +<span class="lineno"> 152 </span><span class="decl"><span class="istickedoff">doPureOp _ Op_render _ = </span> +<span class="lineno"> 153 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">err ("\nAttempting to call render from inside a purely functional callback.")</span></span> +<span class="lineno"> 154 </span><span class="spaces"></span><span class="istickedoff">doPureOp primOp op stk = doPrimOp primOp <span class="nottickedoff">op</span> stk</span></span> -- call the purely functional operators +<span class="lineno"> 155 </span> +<span class="lineno"> 156 </span>{-# SPECIALIZE doPrimOp :: PrimOp -> GMLOp -> Stack -> Pure Stack #-} +<span class="lineno"> 157 </span>{-# SPECIALIZE doPrimOp :: PrimOp -> GMLOp -> Stack -> IO Stack #-} +<span class="lineno"> 158 </span>{-# SPECIALIZE doPrimOp :: PrimOp -> GMLOp -> Stack -> Abs Stack #-} +<span class="lineno"> 159 </span> +<span class="lineno"> 160 </span>doPrimOp :: (MonadEval m) => PrimOp -> GMLOp -> Stack -> m Stack +<span class="lineno"> 161 </span> +<span class="lineno"> 162 </span>-- 1 argument. +<span class="lineno"> 163 </span> +<span class="lineno"> 164 </span><span class="decl"><span class="istickedoff">doPrimOp (Int_Int fn) _ (VInt i1:stk)</span> +<span class="lineno"> 165 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">return ((VInt (fn i1)) : stk)</span></span> +<span class="lineno"> 166 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Real_Real fn) _ (VReal r1:stk)</span> +<span class="lineno"> 167 </span><span class="spaces"> </span><span class="istickedoff">= return ((VReal (fn r1)) : stk)</span> +<span class="lineno"> 168 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Point_Real fn) _ (VPoint x y z:stk)</span> +<span class="lineno"> 169 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">return ((VReal (fn x y z)) : stk)</span></span> +<span class="lineno"> 170 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 171 </span><span class="spaces"></span><span class="istickedoff">-- This is where the callbacks happen from...</span> +<span class="lineno"> 172 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Surface_Obj fn) _ (VClosure env code:stk)</span> +<span class="lineno"> 173 </span><span class="spaces"> </span><span class="istickedoff">= case absapply env code [<span class="nottickedoff">VAbsObj AbsFACE</span>,<span class="nottickedoff">VAbsObj AbsU</span>,<span class="nottickedoff">VAbsObj AbsV</span>] of</span> +<span class="lineno"> 174 </span><span class="spaces"> </span><span class="istickedoff">Just [VReal r3,VReal r2,VReal r1,VPoint c1 c2 c3] -> </span> +<span class="lineno"> 175 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let</span></span> +<span class="lineno"> 176 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">res = prop (color c1 c2 c3) r1 r2 r3</span></span> +<span class="lineno"> 177 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">in</span></span> +<span class="lineno"> 178 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">return ((VObject (fn (SConst res))) : stk)</span></span> +<span class="lineno"> 179 </span><span class="spaces"> </span><span class="istickedoff">_ -> return ((VObject (fn (SFun call))) : stk)</span> +<span class="lineno"> 180 </span><span class="spaces"> </span><span class="istickedoff">where </span> +<span class="lineno"> 181 </span><span class="spaces"> </span><span class="istickedoff">-- The most general case</span> +<span class="lineno"> 182 </span><span class="spaces"> </span><span class="istickedoff">call i r1 r2 =</span> +<span class="lineno"> 183 </span><span class="spaces"> </span><span class="istickedoff">case callback env code [VReal r2,VReal r1,<span class="nottickedoff">VInt i</span>] of</span> +<span class="lineno"> 184 </span><span class="spaces"> </span><span class="istickedoff">[VReal r3,VReal r2,VReal r1,VPoint c1 c2 c3] </span> +<span class="lineno"> 185 </span><span class="spaces"> </span><span class="istickedoff">-> prop (color c1 c2 c3) r1 r2 r3</span> +<span class="lineno"> 186 </span><span class="spaces"> </span><span class="istickedoff">stk -> <span class="nottickedoff">error ("callback failed: incorrectly typed return arguments"</span></span> +<span class="lineno"> 187 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">++ show stk)</span></span> +<span class="lineno"> 188 </span><span class="spaces"> </span><span class="istickedoff"></span> +<span class="lineno"> 189 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Real_Int fn) _ (VReal r1:stk)</span> +<span class="lineno"> 190 </span><span class="spaces"> </span><span class="istickedoff">= return ((VInt (fn r1)) : stk)</span> +<span class="lineno"> 191 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Int_Real fn) _ (VInt r1:stk)</span> +<span class="lineno"> 192 </span><span class="spaces"> </span><span class="istickedoff">= return ((VReal (fn r1)) : stk)</span> +<span class="lineno"> 193 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Arr_Int fn) _ (VArray arr:stk)</span> +<span class="lineno"> 194 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">return ((VInt (fn arr)) : stk)</span></span> +<span class="lineno"> 195 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 196 </span><span class="spaces"></span><span class="istickedoff">-- 2 arguments.</span> +<span class="lineno"> 197 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 198 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Int_Int_Int fn) _ (VInt i2:VInt i1:stk)</span> +<span class="lineno"> 199 </span><span class="spaces"> </span><span class="istickedoff">= return ((VInt (fn i1 i2)) : stk)</span> +<span class="lineno"> 200 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Int_Int_Bool fn) _ (VInt i2:VInt i1:stk)</span> +<span class="lineno"> 201 </span><span class="spaces"> </span><span class="istickedoff">= return ((VBool (fn i1 i2)) : stk)</span> +<span class="lineno"> 202 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Real_Real_Real fn) _ (VReal r2:VReal r1:stk)</span> +<span class="lineno"> 203 </span><span class="spaces"> </span><span class="istickedoff">= return ((VReal (fn r1 r2)) : stk)</span> +<span class="lineno"> 204 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Real_Real_Bool fn) _ (VReal r2:VReal r1:stk)</span> +<span class="lineno"> 205 </span><span class="spaces"> </span><span class="istickedoff">= return ((VBool (fn r1 r2)) : stk)</span> +<span class="lineno"> 206 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Arr_Int_Value fn) _ (VInt i:VArray arr:stk)</span> +<span class="lineno"> 207 </span><span class="spaces"> </span><span class="istickedoff">= return ((fn arr i) : stk)</span> +<span class="lineno"> 208 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 209 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 210 </span><span class="spaces"> </span><span class="istickedoff">-- Many arguments, typically image mangling</span> +<span class="lineno"> 211 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 212 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Obj_Obj_Obj fn) _ (VObject o2:VObject o1:stk)</span> +<span class="lineno"> 213 </span><span class="spaces"> </span><span class="istickedoff">= return ((VObject (fn o1 o2)) : <span class="nottickedoff">stk</span>)</span> +<span class="lineno"> 214 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Point_Color_Light fn) _ (VPoint r g b:VPoint x y z : stk)</span> +<span class="lineno"> 215 </span><span class="spaces"> </span><span class="istickedoff">= return (VLight (fn (x,y,z) (color r g b)) : <span class="nottickedoff">stk</span>)</span> +<span class="lineno"> 216 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Point_Point_Color_Real_Real_Light fn) _ </span> +<span class="lineno"> 217 </span><span class="spaces"> </span><span class="istickedoff">(VReal r2:VReal r1:VPoint r g b:VPoint x2 y2 z2:VPoint x1 y1 z1 : stk)</span> +<span class="lineno"> 218 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">return (VLight (fn (x1,y1,z1) (x2,y2,z2) (color r g b) r1 r2) : stk)</span></span> +<span class="lineno"> 219 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Real_Real_Real_Point fn) _ (VReal r3:VReal r2:VReal r1:stk)</span> +<span class="lineno"> 220 </span><span class="spaces"> </span><span class="istickedoff">= return ((fn r1 r2 r3) : stk)</span> +<span class="lineno"> 221 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Obj_Real_Obj fn) _ (VReal r:VObject o:stk)</span> +<span class="lineno"> 222 </span><span class="spaces"> </span><span class="istickedoff">= return (VObject (fn o r) : <span class="nottickedoff">stk</span>)</span> +<span class="lineno"> 223 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Obj_Real_Real_Real_Obj fn) _ (VReal r3:VReal r2:VReal r1:VObject o:stk)</span> +<span class="lineno"> 224 </span><span class="spaces"> </span><span class="istickedoff">= return (VObject (fn o r1 r2 r3) : stk)</span> +<span class="lineno"> 225 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 226 </span><span class="spaces"></span><span class="istickedoff">-- This one is our testing harness</span> +<span class="lineno"> 227 </span><span class="spaces"></span><span class="istickedoff">doPrimOp (Value_String_Value fn) _ (VString s:o:stk)</span> +<span class="lineno"> 228 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">res `seq` return (res : stk)</span></span> +<span class="lineno"> 229 </span><span class="spaces"> </span><span class="istickedoff">where</span> +<span class="lineno"> 230 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">res = fn o s</span></span> +<span class="lineno"> 231 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 232 </span><span class="spaces"></span><span class="istickedoff">doPrimOp primOp op args </span> +<span class="lineno"> 233 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">err ("\n\ntype error when attempting to execute builtin primitive \"" ++</span></span> +<span class="lineno"> 234 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">show op ++ "\"\n\n| " ++</span></span> +<span class="lineno"> 235 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">show op ++ " takes " ++ show (length types) ++ " argument" ++ s</span></span> +<span class="lineno"> 236 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">++ " with" ++ the ++ " type" ++ s ++ "\n|\n|" ++</span></span> +<span class="lineno"> 237 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">" " ++ unwords [ show ty | ty <- types ] ++ "\n|\n|" ++ </span></span> +<span class="lineno"> 238 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">" currently, the relevent argument" ++ s ++ " on the stack " ++ </span></span> +<span class="lineno"> 239 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">are ++ "\n|\n| " ++ </span></span> +<span class="lineno"> 240 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">unwords [ "(" ++ show arg ++ ")" </span></span> +<span class="lineno"> 241 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">| arg <- reverse (take (length types) args) ] ++ "\n|\n| "</span></span> +<span class="lineno"> 242 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">++ " (top of stack is on the right hand side)\n\n")</span></span> +<span class="lineno"> 243 </span><span class="spaces"> </span><span class="istickedoff">where</span> +<span class="lineno"> 244 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">len = length types</span></span> +<span class="lineno"> 245 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">s = (if len /= 1 then "s" else "")</span></span> +<span class="lineno"> 246 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">are = (if len /= 1 then "are" else "is")</span></span> +<span class="lineno"> 247 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">the = (if len /= 1 then "" else " the")</span></span> +<span class="lineno"> 248 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">types = getPrimOpType primOp</span></span></span> +<span class="lineno"> 249 </span> +<span class="lineno"> 250 </span> +<span class="lineno"> 251 </span>-- Render is somewhat funny, becauase it can only get called at top level. +<span class="lineno"> 252 </span>-- All other operations are purely functional. +<span class="lineno"> 253 </span> +<span class="lineno"> 254 </span>doAllOp :: PrimOp -> GMLOp -> Stack -> IO Stack +<span class="lineno"> 255 </span><span class="decl"><span class="istickedoff">doAllOp (Render render) Op_render</span> +<span class="lineno"> 256 </span><span class="spaces"> </span><span class="istickedoff">(VString str:VInt ht:VInt wid:VReal fov</span> +<span class="lineno"> 257 </span><span class="spaces"> </span><span class="istickedoff">:VInt dep:VObject obj:VArray arr</span> +<span class="lineno"> 258 </span><span class="spaces"> </span><span class="istickedoff">:VPoint r g b : stk)</span> +<span class="lineno"> 259 </span><span class="spaces"> </span><span class="istickedoff">= do { render (color r g b) lights obj dep (fov * (pi / 180.0)) wid ht <span class="nottickedoff">str</span></span> +<span class="lineno"> 260 </span><span class="spaces"> </span><span class="istickedoff">; return <span class="nottickedoff">stk</span></span> +<span class="lineno"> 261 </span><span class="spaces"> </span><span class="istickedoff">}</span> +<span class="lineno"> 262 </span><span class="spaces"> </span><span class="istickedoff">where</span> +<span class="lineno"> 263 </span><span class="spaces"> </span><span class="istickedoff">lights = [ light | (VLight light) <- elems arr ]</span> +<span class="lineno"> 264 </span><span class="spaces"></span><span class="istickedoff"></span> +<span class="lineno"> 265 </span><span class="spaces"></span><span class="istickedoff">doAllOp primOp op stk = doPrimOp primOp <span class="nottickedoff">op</span> stk</span></span> -- call the purely functional operators +<span class="lineno"> 266 </span> +<span class="lineno"> 267 </span>------------------------------------------------------------------------------ +<span class="lineno"> 268 </span>{- +<span class="lineno"> 269 </span> - Abstract evaluation. +<span class="lineno"> 270 </span> - +<span class="lineno"> 271 </span> - The idea is you check for constant code that +<span class="lineno"> 272 </span> - (1) does not look at its arguments +<span class="lineno"> 273 </span> - (2) gives a fixed result +<span class="lineno"> 274 </span> - +<span class="lineno"> 275 </span> - We run for 100 steps. +<span class="lineno"> 276 </span> - +<span class="lineno"> 277 </span> -} +<span class="lineno"> 278 </span> +<span class="lineno"> 279 </span>absapply :: Env -> Code -> Stack -> Maybe Stack +<span class="lineno"> 280 </span><span class="decl"><span class="istickedoff">absapply env code stk = </span> +<span class="lineno"> 281 </span><span class="spaces"> </span><span class="istickedoff">case runAbs (eval (State env stk code)) 100 of</span> +<span class="lineno"> 282 </span><span class="spaces"> </span><span class="istickedoff">AbsState stk _ -> <span class="nottickedoff">Just stk</span></span> +<span class="lineno"> 283 </span><span class="spaces"> </span><span class="istickedoff">AbsFail m -> Nothing</span></span> +<span class="lineno"> 284 </span> +<span class="lineno"> 285 </span>newtype Abs a = Abs { runAbs :: Int -> AbsState a } +<span class="lineno"> 286 </span>data AbsState a = AbsState a !Int +<span class="lineno"> 287 </span> | AbsFail String +<span class="lineno"> 288 </span> +<span class="lineno"> 289 </span>instance Monad Abs where +<span class="lineno"> 290 </span> <span class="decl"><span class="istickedoff">(Abs fn) >>= k = Abs (\ s -> case fn s of</span> +<span class="lineno"> 291 </span><span class="spaces"> </span><span class="istickedoff">AbsState r s' -> runAbs (k r) s'</span> +<span class="lineno"> 292 </span><span class="spaces"> </span><span class="istickedoff">AbsFail m -> AbsFail <span class="nottickedoff">m</span>)</span></span> +<span class="lineno"> 293 </span> <span class="decl"><span class="istickedoff">return x = Abs (\ n -> AbsState x n)</span></span> +<span class="lineno"> 294 </span> <span class="decl"><span class="istickedoff">fail s = Abs (\ n -> AbsFail <span class="nottickedoff">s</span>)</span></span> +<span class="lineno"> 295 </span> +<span class="lineno"> 296 </span>instance MonadEval Abs where +<span class="lineno"> 297 </span> <span class="decl"><span class="istickedoff">doOp = doAbsOp</span></span> +<span class="lineno"> 298 </span> <span class="decl"><span class="istickedoff">err = fail</span></span> +<span class="lineno"> 299 </span> <span class="decl"><span class="istickedoff">tick = Abs (\ n -> if <span class="tickonlyfalse">n <= 0</span></span> +<span class="lineno"> 300 </span><span class="spaces"> </span><span class="istickedoff">then <span class="nottickedoff">AbsFail "run out of time"</span></span> +<span class="lineno"> 301 </span><span class="spaces"> </span><span class="istickedoff">else AbsState <span class="nottickedoff">()</span> (n-1))</span></span> +<span class="lineno"> 302 </span> +<span class="lineno"> 303 </span>doAbsOp :: PrimOp -> GMLOp -> Stack -> Abs Stack +<span class="lineno"> 304 </span><span class="decl"><span class="istickedoff">doAbsOp _ Op_point (VReal r3:VReal r2:VReal r1:stk) </span> +<span class="lineno"> 305 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">return ((VPoint r1 r2 r3) : stk)</span></span> +<span class="lineno"> 306 </span><span class="spaces"> </span><span class="istickedoff">-- here, you could have an (AbsPoint :: AbsObj) which you put on the</span> +<span class="lineno"> 307 </span><span class="spaces"> </span><span class="istickedoff">-- stack, with any object in the three fields.</span> +<span class="lineno"> 308 </span><span class="spaces"></span><span class="istickedoff">doAbsOp _ op _ = err <span class="nottickedoff">("operator not understood (" ++ show op ++ ")")</span></span></span> +<span class="lineno"> 309 </span> +<span class="lineno"> 310 </span>------------------------------------------------------------------------------ +<span class="lineno"> 311 </span>-- Driver +<span class="lineno"> 312 </span> +<span class="lineno"> 313 </span>mainEval :: Code -> IO () +<span class="lineno"> 314 </span><span class="decl"><span class="istickedoff">mainEval prog = do { stk <- eval (State <span class="nottickedoff">emptyEnv</span> [] prog) </span> +<span class="lineno"> 315 </span><span class="spaces"> </span><span class="istickedoff">; return <span class="nottickedoff">()</span></span> +<span class="lineno"> 316 </span><span class="spaces"> </span><span class="istickedoff">}</span></span> +<span class="lineno"> 317 </span>{- +<span class="lineno"> 318 </span> * Oops, one of the example actually has something +<span class="lineno"> 319 </span> * on the stack at the end. +<span class="lineno"> 320 </span> * Oh well... +<span class="lineno"> 321 </span> ; if null stk +<span class="lineno"> 322 </span> then return () +<span class="lineno"> 323 </span> else do { putStrLn done +<span class="lineno"> 324 </span> ; print stk +<span class="lineno"> 325 </span> } +<span class="lineno"> 326 </span>-} +<span class="lineno"> 327 </span> +<span class="lineno"> 328 </span><span class="decl"><span class="nottickedoff">done = "Items still on stack at (successfull) termination of program"</span></span> +<span class="lineno"> 329 </span> +<span class="lineno"> 330 </span>------------------------------------------------------------------------------ +<span class="lineno"> 331 </span>-- testing +<span class="lineno"> 332 </span> +<span class="lineno"> 333 </span>test :: String -> Pure Stack +<span class="lineno"> 334 </span><span class="decl"><span class="nottickedoff">test is = eval (State emptyEnv [] (rayParse is))</span></span> +<span class="lineno"> 335 </span> +<span class="lineno"> 336 </span>testF :: String -> IO Stack +<span class="lineno"> 337 </span><span class="decl"><span class="nottickedoff">testF is = do prog <- rayParseF is</span> +<span class="lineno"> 338 </span><span class="spaces"> </span><span class="nottickedoff">eval (State emptyEnv [] prog)</span></span> +<span class="lineno"> 339 </span> +<span class="lineno"> 340 </span>testA :: String -> Either String (Stack,Int) +<span class="lineno"> 341 </span><span class="decl"><span class="nottickedoff">testA is = case runAbs (eval (State emptyEnv </span> +<span class="lineno"> 342 </span><span class="spaces"> </span><span class="nottickedoff">[VAbsObj AbsFACE,VAbsObj AbsU,VAbsObj AbsV]</span> +<span class="lineno"> 343 </span><span class="spaces"> </span><span class="nottickedoff">(rayParse is))) 100 of</span> +<span class="lineno"> 344 </span><span class="spaces"> </span><span class="nottickedoff">AbsState a n -> Right (a,n)</span> +<span class="lineno"> 345 </span><span class="spaces"> </span><span class="nottickedoff">AbsFail m -> Left m</span></span> +<span class="lineno"> 346 </span> +<span class="lineno"> 347 </span><span class="decl"><span class="nottickedoff">abstest1 = "1.0 0.0 0.0 point /red { /v /u /face red 1.0 0.0 1.0 } apply"</span></span> +<span class="lineno"> 348 </span> +<span class="lineno"> 349 </span>-- should be [3:: Int] +<span class="lineno"> 350 </span><span class="decl"><span class="nottickedoff">et1 = test "1 /x { x } /f 2 /x f apply x addi"</span></span> +<span class="lineno"> 351 </span> +<span class="lineno"> 352 </span> +<span class="lineno"> 353 </span> +<span class="lineno"> 354 </span> +<span class="lineno"> 355 </span> + +</pre> +</html> +Writing: hpc_index.html +<html><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +<table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="CSG.hs.html">CSG</a></tt></td> +<td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">- </td><td>0/0</td><td width=100> </td></tr> +<tr> +<td> <tt>module <a href="Construct.hs.html">Construct</a></tt></td> +<td align="right">41%</td><td>17/41</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>5/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>381/635</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Data.hs.html">Data</a></tt></td> +<td align="right">22%</td><td>10/45</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">3%</td><td>2/51</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="3%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">39%</td><td>254/646</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="39%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Eval.hs.html">Eval</a></tt></td> +<td align="right">62%</td><td>22/35</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="62%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">59%</td><td>40/67</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="59%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>361/628</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Geometry.hs.html">Geometry</a></tt></td> +<td align="right">58%</td><td>42/72</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">40%</td><td>4/10</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>300/427</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Illumination.hs.html">Illumination</a></tt></td> +<td align="right">45%</td><td>11/24</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="45%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>16/42</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">44%</td><td>299/678</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="44%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Intersections.hs.html">Intersections</a></tt></td> +<td align="right">63%</td><td>14/22</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="63%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">42%</td><td>35/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="42%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>382/1001</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Interval.hs.html">Interval</a></tt></td> +<td align="right">47%</td><td>8/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="47%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">39%</td><td>9/23</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="39%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>69/165</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">100%</td><td>6/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Misc.hs.html">Misc</a></tt></td> +<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/10</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Parse.hs.html">Parse</a></tt></td> +<td align="right">80%</td><td>16/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">42%</td><td>6/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="42%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">72%</td><td>192/264</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="72%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Primitives.hs.html">Primitives</a></tt></td> +<td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">20%</td><td>5/24</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Surface.hs.html">Surface</a></tt></td> +<td align="right">36%</td><td>4/11</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">35%</td><td>7/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="35%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>43/231</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">49%</td><td>146/295</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="49%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>124/322</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">48%</td><td>2292/4715</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="48%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></html> +Writing: hpc_index_fun.html +<html><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +<table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">100%</td><td>6/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Parse.hs.html">Parse</a></tt></td> +<td align="right">80%</td><td>16/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">42%</td><td>6/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="42%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">72%</td><td>192/264</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="72%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Intersections.hs.html">Intersections</a></tt></td> +<td align="right">63%</td><td>14/22</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="63%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">42%</td><td>35/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="42%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>382/1001</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Eval.hs.html">Eval</a></tt></td> +<td align="right">62%</td><td>22/35</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="62%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">59%</td><td>40/67</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="59%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>361/628</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Geometry.hs.html">Geometry</a></tt></td> +<td align="right">58%</td><td>42/72</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">40%</td><td>4/10</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>300/427</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Interval.hs.html">Interval</a></tt></td> +<td align="right">47%</td><td>8/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="47%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">39%</td><td>9/23</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="39%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>69/165</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Illumination.hs.html">Illumination</a></tt></td> +<td align="right">45%</td><td>11/24</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="45%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>16/42</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">44%</td><td>299/678</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="44%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Construct.hs.html">Construct</a></tt></td> +<td align="right">41%</td><td>17/41</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>5/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>381/635</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Surface.hs.html">Surface</a></tt></td> +<td align="right">36%</td><td>4/11</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">35%</td><td>7/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="35%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>43/231</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Data.hs.html">Data</a></tt></td> +<td align="right">22%</td><td>10/45</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">3%</td><td>2/51</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="3%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">39%</td><td>254/646</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="39%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Primitives.hs.html">Primitives</a></tt></td> +<td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">20%</td><td>5/24</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Misc.hs.html">Misc</a></tt></td> +<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/10</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="CSG.hs.html">CSG</a></tt></td> +<td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">- </td><td>0/0</td><td width=100> </td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">49%</td><td>146/295</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="49%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>124/322</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">48%</td><td>2292/4715</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="48%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></html> +Writing: hpc_index_alt.html +<html><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +<table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Eval.hs.html">Eval</a></tt></td> +<td align="right">62%</td><td>22/35</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="62%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">59%</td><td>40/67</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="59%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>361/628</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Parse.hs.html">Parse</a></tt></td> +<td align="right">80%</td><td>16/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">42%</td><td>6/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="42%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">72%</td><td>192/264</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="72%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Intersections.hs.html">Intersections</a></tt></td> +<td align="right">63%</td><td>14/22</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="63%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">42%</td><td>35/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="42%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>382/1001</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Construct.hs.html">Construct</a></tt></td> +<td align="right">41%</td><td>17/41</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>5/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>381/635</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Geometry.hs.html">Geometry</a></tt></td> +<td align="right">58%</td><td>42/72</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">40%</td><td>4/10</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>300/427</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Interval.hs.html">Interval</a></tt></td> +<td align="right">47%</td><td>8/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="47%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">39%</td><td>9/23</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="39%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>69/165</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Illumination.hs.html">Illumination</a></tt></td> +<td align="right">45%</td><td>11/24</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="45%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>16/42</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">44%</td><td>299/678</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="44%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Surface.hs.html">Surface</a></tt></td> +<td align="right">36%</td><td>4/11</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">35%</td><td>7/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="35%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>43/231</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Data.hs.html">Data</a></tt></td> +<td align="right">22%</td><td>10/45</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">3%</td><td>2/51</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="3%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">39%</td><td>254/646</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="39%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">100%</td><td>6/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="CSG.hs.html">CSG</a></tt></td> +<td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">- </td><td>0/0</td><td width=100> </td></tr> +<tr> +<td> <tt>module <a href="Misc.hs.html">Misc</a></tt></td> +<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/10</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Primitives.hs.html">Primitives</a></tt></td> +<td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">20%</td><td>5/24</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">49%</td><td>146/295</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="49%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>124/322</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">48%</td><td>2292/4715</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="48%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></html> +Writing: hpc_index_exp.html +<html><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +<table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">100%</td><td>6/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Parse.hs.html">Parse</a></tt></td> +<td align="right">80%</td><td>16/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">42%</td><td>6/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="42%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">72%</td><td>192/264</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="72%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Geometry.hs.html">Geometry</a></tt></td> +<td align="right">58%</td><td>42/72</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">40%</td><td>4/10</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>300/427</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Construct.hs.html">Construct</a></tt></td> +<td align="right">41%</td><td>17/41</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>5/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>381/635</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Eval.hs.html">Eval</a></tt></td> +<td align="right">62%</td><td>22/35</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="62%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">59%</td><td>40/67</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="59%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>361/628</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Illumination.hs.html">Illumination</a></tt></td> +<td align="right">45%</td><td>11/24</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="45%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>16/42</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">44%</td><td>299/678</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="44%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Interval.hs.html">Interval</a></tt></td> +<td align="right">47%</td><td>8/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="47%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">39%</td><td>9/23</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="39%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>69/165</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Data.hs.html">Data</a></tt></td> +<td align="right">22%</td><td>10/45</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">3%</td><td>2/51</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="3%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">39%</td><td>254/646</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="39%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Intersections.hs.html">Intersections</a></tt></td> +<td align="right">63%</td><td>14/22</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="63%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">42%</td><td>35/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="42%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>382/1001</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Primitives.hs.html">Primitives</a></tt></td> +<td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">20%</td><td>5/24</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Surface.hs.html">Surface</a></tt></td> +<td align="right">36%</td><td>4/11</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">35%</td><td>7/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="35%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>43/231</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="Misc.hs.html">Misc</a></tt></td> +<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/10</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr> +<tr> +<td> <tt>module <a href="CSG.hs.html">CSG</a></tt></td> +<td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">- </td><td>0/0</td><td width=100> </td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">49%</td><td>146/295</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="49%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">38%</td><td>124/322</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">48%</td><td>2292/4715</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="48%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></html> + + diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_report_multi_001.stdout b/testsuite/tests/hpc/raytrace/tixs/hpc_report_multi_001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..e74f2e5955d64709219be62f5aac2b98daa6730e --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_report_multi_001.stdout @@ -0,0 +1,9 @@ +-----<module Geometry>----- + 70% expressions used (300/427) + 10% boolean coverage (1/10) + 10% guards (1/10), 3 always True, 1 always False, 5 unevaluated + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) + 40% alternatives used (4/10) + 66% local declarations used (2/3) + 58% top-level declarations used (42/72) diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_report_multi_002.stdout b/testsuite/tests/hpc/raytrace/tixs/hpc_report_multi_002.stdout new file mode 100644 index 0000000000000000000000000000000000000000..b9ab872c6cf78d4029e82d9a612d8483b870409a --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_report_multi_002.stdout @@ -0,0 +1,108 @@ +-----<module CSG>----- +100% expressions used (0/0) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (0/0) +-----<module Construct>----- + 60% expressions used (381/635) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) + 41% alternatives used (5/12) +100% local declarations used (5/5) + 41% top-level declarations used (17/41) +-----<module Data>----- + 39% expressions used (254/646) + 0% boolean coverage (0/4) + 0% guards (0/4), 1 always True, 3 unevaluated + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) + 3% alternatives used (2/51) +100% local declarations used (0/0) + 18% top-level declarations used (10/53) +-----<module Eval>----- + 57% expressions used (361/628) + 20% boolean coverage (1/5) + 100% guards (0/0) + 20% 'if' conditions (1/5), 1 always False, 3 unevaluated + 100% qualifiers (0/0) + 59% alternatives used (40/67) + 36% local declarations used (4/11) + 62% top-level declarations used (22/35) +-----<module Illumination>----- + 44% expressions used (299/678) + 18% boolean coverage (3/16) + 16% guards (2/12), 2 always True, 1 always False, 7 unevaluated + 33% 'if' conditions (1/3), 1 always True, 1 always False + 0% qualifiers (0/1), 1 unevaluated + 38% alternatives used (16/42) + 57% local declarations used (27/47) + 45% top-level declarations used (11/24) +-----<module Intersections>----- + 38% expressions used (382/1001) + 33% boolean coverage (11/33) + 40% guards (8/20), 8 always True, 3 always False, 1 unevaluated + 23% 'if' conditions (3/13), 10 unevaluated + 100% qualifiers (0/0) + 42% alternatives used (35/83) + 36% local declarations used (44/120) + 63% top-level declarations used (14/22) +-----<module Interval>----- + 41% expressions used (69/165) + 8% boolean coverage (1/12) + 11% guards (1/9), 3 always True, 3 always False, 2 unevaluated + 0% 'if' conditions (0/3), 2 always True, 1 unevaluated + 100% qualifiers (0/0) + 39% alternatives used (9/23) + 25% local declarations used (1/4) + 47% top-level declarations used (8/17) +-----<module Main>----- +100% expressions used (6/6) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) +-----<module Misc>----- + 0% expressions used (0/10) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) + 0% top-level declarations used (0/1) +-----<module Parse>----- + 72% expressions used (191/264) + 50% boolean coverage (1/2) + 100% guards (0/0) + 50% 'if' conditions (1/2), 1 always False + 100% qualifiers (0/0) + 42% alternatives used (6/14) +100% local declarations used (2/2) + 80% top-level declarations used (16/20) +-----<module Primitives>----- + 20% expressions used (5/24) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) + 16% top-level declarations used (1/6) +-----<module Surface>----- + 18% expressions used (43/231) + 0% boolean coverage (0/1) + 100% guards (0/0) + 0% 'if' conditions (0/1), 1 unevaluated + 100% qualifiers (0/0) + 35% alternatives used (7/20) + 16% local declarations used (4/24) + 36% top-level declarations used (4/11) diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_report_multi_003.stdout b/testsuite/tests/hpc/raytrace/tixs/hpc_report_multi_003.stdout new file mode 100644 index 0000000000000000000000000000000000000000..670778f34c2f5bc0fa1ded9109acdf64c0bc82f3 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_report_multi_003.stdout @@ -0,0 +1,41 @@ +-----<module Geometry>----- + 70% expressions used (300/427) + 10% boolean coverage (1/10) + 10% guards (1/10), 3 always True, 1 always False, 5 unevaluated + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) + 40% alternatives used (4/10) + 66% local declarations used (2/3) + 58% top-level declarations used (42/72) +unused declarations: + /= + /= + == + == + addVV + coord + dist2 + distFrom0 + distFrom0Sq + nearV + negV + norm + point_to_vector + showList + showList + showList + showList + showList + showList + showsPrec + showsPrec + showsPrec + showsPrec + showsPrec + showsPrec + subCC + subPP + tangents + tangents.v1 + vector_to_point + white diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_sample.tix b/testsuite/tests/hpc/raytrace/tixs/hpc_sample.tix new file mode 100644 index 0000000000000000000000000000000000000000..ea09b324eaf4b9725b08133e24a6a866454a294c --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_sample.tix @@ -0,0 +1 @@ +Tix [ TixModule "Main" 1310345646 7 [1,1,1,1,1,1,1], TixModule "Parse" 501961473 290 [1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,7,1,4138,4304,7,7,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,41,41,41,41,41,41,41,41,41,41,41,42,4022,1,0,0,0,0,0,0,0,0,0,0,3980,3899,3899,3899,3899,3978,3980,3980,3980,4022,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,11,11,11,11,11,11,1,1,1,1,1,1,1,1,427,427,119,119,119,119,119,119,119,427,1,1,1,119,118,119,119,1,1,1,1,119,119,119,63,25,38,25,25,25,37,37,38,63,56,0,56,0,0,0,0,55,56,56,119,2,2,1,1,13,16,16,1,1,1,65,65,65,1,1,0,1,1,1,0,1,1,1,92,94,1,0,1,1,1,1,1,25,25,1,0,1,1,4019,4022,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], TixModule "Eval" 1993219040 684 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,1,1,1,49,20,49,1,1,1,269762,3059036,3328798,0,0,0,0,0,0,0,0,176132,176053,176053,176132,176132,176132,176132,176132,369283,369283,369283,369279,369283,369283,369283,369283,1,0,1,1,1,1,1,1,371112,441868,409350,441868,441866,441868,441868,441868,0,0,711560,711560,711560,711560,711557,711556,711559,711560,711560,711560,0,0,0,0,711560,376835,118594,204675,376835,376835,376835,376835,376835,376835,0,65024,65025,65025,65025,65024,65024,65024,65024,65024,65025,0,0,0,0,1,1,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,13483,39849,39849,39849,39849,39849,39849,39849,39849,39849,39849,105109,132311,132311,132311,132311,132311,132311,132311,132311,132311,132311,0,0,746105,746105,746105,746094,746105,746107,746105,746104,746105,746105,746105,746107,0,0,3059036,4153,3328782,3328798,3328798,3059036,269762,4086,3059036,3059036,3059033,3059033,3059036,269761,269761,269762,3328798,3328798,3328798,1,2,2,2,2,2,2,0,0,1,2,2,0,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32512,32512,32512,32512,32512,32512,32512,32512,0,0,0,0,0,0,53568,53568,53568,53568,53568,53568,0,0,0,0,0,0,0,0,32512,32512,32512,32512,32512,32512,0,0,32512,32512,32512,32512,32512,32512,32512,32512,26812,32512,0,0,0,0,0,32512,32512,1,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,1,2,2,2,118592,118592,118592,118592,118592,118592,32512,32512,32512,32512,32512,32512,0,0,0,0,0,0,53568,53568,53568,53568,53568,53568,53568,118592,118592,118592,118592,118592,118592,118592,218155,218155,218155,218155,218155,218155,218155,53568,53568,53568,53568,53568,53568,53568,65024,65024,65024,65024,65024,65024,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32515,32515,32515,32515,32513,32515,32515,3,3,3,3,0,3,3,3,3,3,3,3,3,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,746104,0,0,746091,0,746091,746091,746091,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,13,0,13,13,14,0,1,1,0,0,0,0,1,1,17,17,17,0,17,0,0,0,17,17,17,17,17,1,1,1,1,1,50,54,31,48,46,48,0,6,54,54,54,54,31,31,31,15,15,15,0,2,2,2,2,14,1,14,14,14,14,0,0,0,1,1,0,0,0,7362839,10417773,10417773,1,1,0,0,0], TixModule "Data" 2953926806 707 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53568,53568,53568,53568,0,0,0,0,0,0,65024,65024,65024,65024,65024,0,65024,65024,65024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,1,0,0,1,1,0,1,0,0,1,1,49,49,49,20,49,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,53,22,53,1,1,0,0,0,0,711560,711560,711560,711560,441868,409350,441868,371112,441868,441868,441868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,746155,746155,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], TixModule "Geometry" 1504513891 522 [180000,180000,180000,0,180000,0,180000,180000,180000,4582,175418,4582,175418,175418,0,175418,180000,1,1,1,1,3,3,3,3,0,3,0,0,0,0,0,0,0,0,0,0,0,3,376778,376778,376778,376778,376778,376778,376778,1,1,32512,32512,32512,5785,5785,5785,5785,5785,5785,5785,32512,32512,183672,183672,183672,183672,183672,183672,183672,183672,183672,183672,183672,112863,112863,112863,112863,112863,112863,112863,112863,112863,112863,112863,0,0,0,0,0,0,0,0,0,0,0,151160,151160,151160,151160,151160,151160,151160,151160,151160,151160,151160,1,1,1,1,1,1,1,1,1,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,229838,229838,229838,229838,229838,229838,229838,229838,229838,229838,229838,419283,419283,419283,419283,0,0,0,0,0,0,0,0,0,0,0,0,0,139761,139761,139761,139761,139761,139761,139761,139761,139761,139761,139761,139761,139761,139761,0,139761,139761,139761,139761,139761,0,0,0,0,0,139761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53539,53539,53539,53539,53539,53539,53539,53539,53539,53539,53539,63350,63350,63350,63350,63350,63350,63350,63350,63350,63350,63350,34539,34539,34539,34539,34539,34539,0,0,0,0,0,0,0,0,0,0,0,1323260,1323260,1323260,1323260,1323260,1323260,1323260,1323260,1323260,1323260,1323260,1323260,1323260,1323260,1323260,1323260,330815,330815,330815,330815,330815,330815,330815,330815,330815,330815,330815,330815,330815,330815,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,112863,112863,112863,112863,112863,112863,112863,112863,112863,112863,112863,112863,197872,197872,197872,197872,197872,132895,132895,132895,132895,132895,132895,132895,132895,132895,132895,132895,132895,132895,132895,132895,132895,132895,197872,197872,197872,197872,197872,197872,197872,197872,197872,197872,197872,197872,132847,132847,132847,132847,132847,132847,132847,132847,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60006,60006,60006,60006,60006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26833,26833,26833,26833,26833,159631,159631,248385,248385,159631,159631,188590,188590,253212,253212,187913,187913,60000,60000,60000,60000,60000,32514,32514,32514,32514,32514,0,0,0,0,0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], TixModule "CSG" 1441175296 0 [], TixModule "Surface" 1778761563 268 [0,0,0,0,0,0,0,0,0,0,0,0,0,28863,28863,28863,4731,4731,4731,31430,31430,31430,32512,0,26784,26784,26784,0,3649,3649,3649,0,0,0,0,0,1082,1082,1082,0,0,0,0,0,945,945,945,0,52,52,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32512,32512,0,0,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,0,32512,32512,32512,32512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32512,32512,32512,26812,32512,32512,0,0,0,0,0,0,0], TixModule "Illumination" 615204115 781 [0,0,0,0,0,0,0,0,0,0,0,0,28811,28811,28811,0,26812,0,0,1999,28811,28811,86727,86727,86727,0,1,0,0,32512,32512,32512,28811,28811,28811,32512,32512,32512,32512,86727,86727,0,0,0,0,0,0,0,0,0,0,32512,32512,32512,32512,32512,3701,28811,1,28811,28811,28811,28811,28811,28811,28811,28811,28811,1999,26812,1,26812,26812,0,26812,26812,26812,26812,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32512,28811,28811,32512,32512,32512,32512,32512,32512,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,180000,180000,180000,180000,180000,180000,0,0,0,0,0,0,0,0,0,0,0,0,1,1,200,200,60000,60000,60000,60000,60000,60000,60000,200,200,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32512,32512,32512,32512,26727,26727,26727,26727,26727,26727,26727,26727,26727,26727,26727,26727,26727,26727,26727,26727,32512,32512,32512,5785,26727,5785,26727,26727,26727,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,0,0,0,28811,28811,28811,32512,32512,32512,32512,32512,32512,32512,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,32512,32512,32512,32512,32512,32512,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,26812,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,32512,86727,86727,86727,86727,0,86727,0,86727,86727,0,86727,86727,86727,86727,86727,86727,54215,32512,26727,26727,26727,26727,32512,32512,28808,32512,86727,86727,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,200,1,1,200,60000,60000,60000,60000,60000,60000,60000,200,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,180000,180000,180000,180000,180000,180000,180000,180000,180000,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0], TixModule "Primitives" 3702571582 30 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0], TixModule "Misc" 1840720397 11 [0,0,0,0,0,0,0,0,0,0,0], TixModule "Construct" 2039014732 681 [6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,2,2,2,2,15,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0], TixModule "Intersections" 1674175314 1209 [1,1,1,1,1,317803,317803,317803,317803,317803,317803,317803,317803,317803,317803,317803,317803,346614,346614,346614,28811,317803,28811,28811,28811,21311,21311,21311,28811,1,10594,1,10594,28811,317803,317803,317803,215534,102269,215534,215534,215534,102269,102269,0,102269,102269,102269,346614,0,3,147905,147905,147905,81032,81032,81032,147905,2,67893,2,67893,67893,0,67893,67893,67893,67893,67893,67893,67893,231076,17309,3,115538,115538,115538,115538,115538,115538,108038,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,31374,31374,31374,0,31374,0,0,0,0,0,0,0,0,31374,31374,31374,23819,1,23819,23819,1,1,0,1,31374,31374,31374,31374,14552,16822,14552,16822,31374,31374,31374,31374,31374,22758,8616,22758,8616,31374,31374,31374,31374,31374,31374,34618,51927,51927,51927,0,51927,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51927,51927,51927,37729,14198,7735,35117,35117,35117,35117,35117,945,35117,35117,35117,35117,35117,35117,35117,37729,14198,14198,0,2019,13566,13566,13566,13566,13566,13566,1082,13566,13566,13566,13566,13566,13566,14198,51927,17309,17309,17309,17309,17309,17309,17309,17309,17309,17309,17309,17309,17309,17309,17309,14065,14065,14065,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,879,879,1,1,1,1890,1890,0,0,0,1074,1074,1,1,1,2164,2164,0,0,0,0,0,1,1,1,5774,5774,5728,5728,5728,5728,11781,0,5728,5728,5728,5728,5728,5728,5728,11781,11781,11781,2164,1074,14065,17309,17309,879,1890,17309,17309,17309,5774,0,17309,17309,17309,17309,17309,1,9754,9754,2027,2027,9754,17309,17309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26784,26784,26784,115538,115538,115538,26784,26784,26784,26784,26784,26784,115538,115538,115538,26784,26784,26784,1,1,1,1,1,1,1,1,1,1,115538,115538,115538,115538,115538,115538,26784,26784,26784,26784,26784,26784,26784,26784,26784,26784,26784,26784,26784,26784,26784,26784,26784,115538,115538,115538,0,115538,0,0,0,0,0,0,0,0,0,0,0,0,115538,115538,115538,30000,85538,30000,30000,0,26784,26784,26784,26784,26784,26784,26784,30000,30000,30000,30000,0,30000,85538,85538,0,85538,85538,0,0,0,0,0,0,0,0,85538,85538,85538,85538,85538,85538,115538,26784,115538,115538,26784,115538,115538,32512,32512,32512,32512,32512,32512,32512,32512,0,0,0,0,0,32512,32512,32512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,115538,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127319,127319,32512,32512,32512,32512,32512,127319,127319,132847,132847,132847,132847,132847,132847,32512,125292,132847,132847,115538,115538,115538,17309,3,17309,17309,17309,1,1,0,1,115538,26784,115538,0,0,0,17309,5728,17309,0,0,0,0,0,0,496770,0,0,0,0,0,0,0,0,81027,87565,87565,87565,60838,60838,60838,87565,87565,0,87565,87565,83054,87565,87565,0,0,0,0,0,0,0,0,0,0,0,0,36538,36538,36538,36538,36538,36538,36538,2027,34511,2027,2027,2027,2027,2027,34511,34511,0,34511,205130,115538,115538,115538,115538,115538,115538,115538], TixModule "Interval" 238116040 210 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9754,9754,9754,0,9754,0,9754,9754,9754,3216,6538,3216,6538,6538,0,6538,9754,87565,87565,87565,87565,87565,39754,39754,39754,39754,39754,9754,9754,9754,2027,2027,9754,2027,9754,9754,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9754,9754,6538,0,6538,0,6538,6538,0,6538,105784,0,105784,0,105784,105784,0,105784,9754,9754,9754,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3216,3216,3216,0,3216,0,0,0,3216,0,0,0,3216,6538,6538,6538,0,6538,6538,6538,6538,6538,0,0,0,6538,9754,122076,115538,115538,115538,115538,115538,115538,81027,81027,81027,115538,115538,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132847,125292,132847,132847,95120,132847,132847,0,0,0,0,0,1,1,1,1,1]] diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_show_multi_001.stdout b/testsuite/tests/hpc/raytrace/tixs/hpc_show_multi_001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..a3408856ccb3f68c89f5ad7c2113dc054ffa7a89 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_show_multi_001.stdout @@ -0,0 +1,5400 @@ + 0 1 Main 13:29-13:40 ExpBox False + 1 1 Main 13:20-13:40 ExpBox False + 2 1 Main 14:32-14:34 ExpBox False + 3 1 Main 14:22-14:35 ExpBox False + 4 1 Main 14:13-14:35 ExpBox False + 5 1 Main 13:8-15:11 ExpBox False + 6 1 Main 13:1-15:11 TopLevelBox ["main"] + 0 1 Parse 105:24-105:26 ExpBox False + 1 1 Parse 105:17-105:26 ExpBox False + 2 1 Parse 106:34-106:41 ExpBox False + 3 1 Parse 106:26-106:42 ExpBox False + 4 1 Parse 106:17-106:42 ExpBox False + 5 0 Parse 107:24-107:25 ExpBox False + 6 1 Parse 107:17-107:25 ExpBox False + 7 1 Parse 105:13-108:15 ExpBox False + 8 1 Parse 104:9-108:15 LocalBox ["whiteSpace","oneLineComment"] + 9 1 Parse 103:40-103:50 ExpBox False + 10 1 Parse 103:33-103:51 ExpBox False + 11 1 Parse 103:23-103:51 ExpBox False + 12 1 Parse 103:9-103:51 LocalBox ["whiteSpace","simpleSpace"] + 13 1 Parse 102:25-102:35 ExpBox False + 14 1 Parse 102:41-102:54 ExpBox False + 15 1 Parse 102:25-102:54 ExpBox False + 16 0 Parse 102:60-102:61 ExpBox False + 17 1 Parse 102:24-102:62 ExpBox False + 18 1 Parse 102:15-102:62 ExpBox False + 19 1 Parse 102:1-108:15 TopLevelBox ["whiteSpace"] + 20 7 Parse 100:21-100:21 ExpBox False + 21 1 Parse 100:24-100:33 ExpBox False + 22 4138 Parse 100:43-100:43 ExpBox False + 23 4304 Parse 100:36-100:43 ExpBox False + 24 7 Parse 100:12-100:46 ExpBox False + 25 7 Parse 100:1-100:46 TopLevelBox ["lexeme"] + 26 4 Parse 98:30-98:33 ExpBox False + 27 4 Parse 98:22-98:34 ExpBox False + 28 4 Parse 98:15-98:34 ExpBox False + 29 4 Parse 98:1-98:34 TopLevelBox ["symbol"] + 30 1 Parse 96:30-96:32 ExpBox False + 31 1 Parse 96:22-96:33 ExpBox False + 32 1 Parse 96:43-96:45 ExpBox False + 33 1 Parse 96:35-96:46 ExpBox False + 34 1 Parse 96:48-96:48 ExpBox False + 35 1 Parse 96:14-96:48 ExpBox False + 36 1 Parse 96:1-96:48 TopLevelBox ["brackets"] + 37 1 Parse 95:30-95:32 ExpBox False + 38 1 Parse 95:22-95:33 ExpBox False + 39 1 Parse 95:43-95:45 ExpBox False + 40 1 Parse 95:35-95:46 ExpBox False + 41 1 Parse 95:48-95:48 ExpBox False + 42 1 Parse 95:14-95:48 ExpBox False + 43 1 Parse 95:1-95:48 TopLevelBox ["braces"] + 44 1 Parse 89:18-89:19 ExpBox False + 45 1 Parse 89:29-89:31 ExpBox False + 46 1 Parse 89:21-89:32 ExpBox False + 47 1 Parse 89:11-89:32 ExpBox False + 48 1 Parse 89:1-89:32 TopLevelBox ["optSign"] + 49 1 Parse 86:17-86:21 ExpBox False + 50 1 Parse 86:11-86:21 ExpBox False + 51 1 Parse 86:1-86:21 TopLevelBox ["decimal"] + 52 1 Parse 79:13-79:15 ExpBox False + 53 1 Parse 80:19-80:22 ExpBox False + 54 1 Parse 80:13-80:22 ExpBox False + 55 0 Parse 81:13-81:19 ExpBox False + 56 0 Parse 82:13-82:19 ExpBox False + 57 0 Parse 83:16-83:16 ExpBox False + 58 0 Parse 83:18-83:18 ExpBox False + 59 0 Parse 83:23-83:23 ExpBox False + 60 0 Parse 83:18-83:23 ExpBox False + 61 0 Parse 83:15-83:24 ExpBox False + 62 0 Parse 83:8-83:24 ExpBox False + 63 1 Parse 80:3-84:6 ExpBox False + 64 1 Parse 79:13-84:6 ExpBox False + 65 1 Parse 79:1-84:6 TopLevelBox ["exponent'"] + 66 1 Parse 64:10-64:15 ExpBox False + 67 1 Parse 65:13-65:19 ExpBox False + 68 1 Parse 66:13-66:19 ExpBox False + 69 1 Parse 67:24-67:26 ExpBox False + 70 1 Parse 67:17-67:26 ExpBox False + 71 1 Parse 68:22-68:28 ExpBox False + 72 1 Parse 69:29-69:30 ExpBox False + 73 1 Parse 69:32-69:40 ExpBox False + 74 1 Parse 69:22-69:40 ExpBox False + 75 41 Parse 70:38-70:38 ExpBox False + 76 41 Parse 70:43-70:43 ExpBox False + 77 41 Parse 70:48-70:50 ExpBox False + 78 41 Parse 70:55-70:55 ExpBox False + 79 41 Parse 70:60-70:60 ExpBox False + 80 41 Parse 70:55-70:60 ExpBox False + 81 41 Parse 70:48-70:60 ExpBox False + 82 41 Parse 70:43-70:60 ExpBox False + 83 41 Parse 70:37-70:61 ExpBox False + 84 41 Parse 70:31-70:62 ExpBox False + 85 41 Parse 70:24-70:63 ExpBox False + 86 42 Parse 70:17-70:63 ExpBox False + 87 4022 Parse 67:12-71:15 ExpBox False + 88 1 Parse 72:22-72:30 ExpBox False + 89 0 Parse 73:38-73:38 ExpBox False + 90 0 Parse 73:43-73:43 ExpBox False + 91 0 Parse 73:48-73:51 ExpBox False + 92 0 Parse 73:56-73:56 ExpBox False + 93 0 Parse 73:48-73:56 ExpBox False + 94 0 Parse 73:43-73:56 ExpBox False + 95 0 Parse 73:37-73:57 ExpBox False + 96 0 Parse 73:31-73:58 ExpBox False + 97 0 Parse 73:24-73:59 ExpBox False + 98 0 Parse 73:17-73:59 ExpBox False + 99 3980 Parse 72:12-74:15 ExpBox False + 100 3899 Parse 75:37-75:37 ExpBox False + 101 3899 Parse 75:42-75:42 ExpBox False + 102 3899 Parse 75:36-75:43 ExpBox False + 103 3899 Parse 75:30-75:44 ExpBox False + 104 3978 Parse 75:24-75:45 ExpBox False + 105 3980 Parse 75:17-75:45 ExpBox False + 106 3980 Parse 75:12-75:47 ExpBox False + 107 3980 Parse 72:12-75:47 ExpBox False + 108 4022 Parse 67:12-75:47 ExpBox False + 109 1 Parse 65:3-76:6 ExpBox False + 110 1 Parse 64:10-76:6 ExpBox False + 111 1 Parse 64:1-76:6 TopLevelBox ["number"] + 112 0 Parse 55:15-55:33 ExpBox False + 113 0 Parse 56:15-56:79 ExpBox False + 114 0 Parse 57:15-57:59 ExpBox False + 115 0 Parse 58:15-58:50 ExpBox False + 116 0 Parse 59:15-59:68 ExpBox False + 117 0 Parse 58:15-59:68 ExpBox False + 118 0 Parse 57:15-59:68 ExpBox False + 119 0 Parse 56:15-59:68 ExpBox False + 120 0 Parse 55:15-59:68 ExpBox False + 121 0 Parse 55:1-59:68 TopLevelBox ["test_number"] + 122 1 Parse 51:13-51:18 ExpBox False + 123 1 Parse 51:36-51:38 ExpBox False + 124 1 Parse 51:30-51:39 ExpBox False + 125 1 Parse 51:47-51:49 ExpBox False + 126 1 Parse 51:41-51:50 ExpBox False + 127 11 Parse 51:82-51:82 ExpBox False + 128 11 Parse 51:74-51:82 ExpBox False + 129 11 Parse 51:87-51:87 ExpBox False + 130 11 Parse 51:92-51:94 ExpBox False + 131 11 Parse 51:87-51:94 ExpBox False + 132 11 Parse 51:74-51:94 ExpBox False + 133 1 Parse 51:67-51:95 ExpBox False + 134 1 Parse 51:58-51:96 ExpBox False + 135 1 Parse 51:52-51:97 ExpBox False + 136 1 Parse 51:22-51:97 ExpBox False + 137 1 Parse 51:13-51:97 ExpBox False + 138 1 Parse 51:1-51:97 TopLevelBox ["gmlString"] + 139 1 Parse 44:9-44:14 ExpBox False + 140 1 Parse 45:13-45:18 ExpBox False + 141 427 Parse 46:46-46:46 ExpBox False + 142 427 Parse 46:35-46:46 ExpBox False + 143 119 Parse 46:51-46:51 ExpBox False + 144 119 Parse 46:56-46:58 ExpBox False + 145 119 Parse 46:51-46:58 ExpBox False + 146 119 Parse 46:63-46:63 ExpBox False + 147 119 Parse 46:68-46:70 ExpBox False + 148 119 Parse 46:63-46:70 ExpBox False + 149 119 Parse 46:51-46:70 ExpBox False + 150 427 Parse 46:35-46:70 ExpBox False + 151 1 Parse 46:28-46:71 ExpBox False + 152 1 Parse 46:19-46:72 ExpBox False + 153 1 Parse 46:14-46:72 ExpBox False + 154 119 Parse 47:16-47:16 ExpBox False + 155 118 Parse 47:18-47:19 ExpBox False + 156 119 Parse 47:15-47:20 ExpBox False + 157 119 Parse 47:8-47:20 ExpBox False + 158 1 Parse 45:3-48:6 ExpBox False + 159 1 Parse 44:9-48:6 ExpBox False + 160 1 Parse 44:1-48:6 TopLevelBox ["ident"] + 161 1 Parse 37:14-37:18 ExpBox False + 162 119 Parse 38:21-38:22 ExpBox False + 163 119 Parse 38:24-38:30 ExpBox False + 164 119 Parse 38:13-38:31 ExpBox False + 165 63 Parse 39:22-39:27 ExpBox False + 166 25 Parse 39:22-39:27 BinBox CondBinBox True + 167 38 Parse 39:22-39:27 BinBox CondBinBox False + 168 25 Parse 39:48-39:49 ExpBox False + 169 25 Parse 39:41-39:50 ExpBox False + 170 25 Parse 39:34-39:50 ExpBox True + 171 37 Parse 39:69-39:70 ExpBox False + 172 37 Parse 39:64-39:71 ExpBox False + 173 38 Parse 39:57-39:71 ExpBox True + 174 63 Parse 39:19-39:71 ExpBox True + 175 56 Parse 40:22-40:27 ExpBox False + 176 0 Parse 40:22-40:27 BinBox CondBinBox True + 177 56 Parse 40:22-40:27 BinBox CondBinBox False + 178 0 Parse 40:41-40:76 ExpBox False + 179 0 Parse 40:81-40:82 ExpBox False + 180 0 Parse 40:40-40:83 ExpBox False + 181 0 Parse 40:34-40:83 ExpBox True + 182 55 Parse 40:97-40:97 ExpBox False + 183 56 Parse 40:90-40:97 ExpBox True + 184 56 Parse 40:19-40:97 ExpBox True + 185 119 Parse 38:8-40:97 ExpBox False + 186 2 Parse 37:3-41:6 ExpBox False + 187 2 Parse 36:1-41:6 TopLevelBox ["pident"] + 188 1 Parse 27:28-27:36 ExpBox False + 189 1 Parse 27:19-27:36 ExpBox False + 190 13 Parse 27:63-27:64 ExpBox False + 191 16 Parse 27:56-27:65 ExpBox False + 192 16 Parse 27:49-27:65 ExpBox False + 193 1 Parse 27:8-27:67 ExpBox False + 194 1 Parse 28:28-28:36 ExpBox False + 195 1 Parse 28:19-28:36 ExpBox False + 196 65 Parse 28:64-28:65 ExpBox False + 197 65 Parse 28:56-28:66 ExpBox False + 198 65 Parse 28:49-28:66 ExpBox False + 199 1 Parse 28:8-28:68 ExpBox False + 200 1 Parse 29:19-29:27 ExpBox False + 201 0 Parse 29:65-29:65 ExpBox False + 202 1 Parse 29:56-29:66 ExpBox False + 203 1 Parse 29:49-29:66 ExpBox False + 204 1 Parse 29:8-29:68 ExpBox False + 205 0 Parse 29:74-29:81 ExpBox False + 206 1 Parse 29:7-29:82 ExpBox False + 207 1 Parse 30:25-30:29 ExpBox False + 208 1 Parse 30:18-30:29 ExpBox False + 209 92 Parse 30:56-30:56 ExpBox False + 210 94 Parse 30:49-30:56 ExpBox False + 211 1 Parse 30:8-30:58 ExpBox False + 212 0 Parse 30:74-30:85 ExpBox False + 213 1 Parse 30:7-30:86 ExpBox False + 214 1 Parse 31:18-31:20 ExpBox False + 215 1 Parse 31:13-31:20 ExpBox False + 216 1 Parse 32:25-32:28 ExpBox False + 217 1 Parse 32:18-32:28 ExpBox False + 218 25 Parse 32:56-32:56 ExpBox False + 219 25 Parse 32:49-32:56 ExpBox False + 220 1 Parse 31:8-32:58 ExpBox False + 221 0 Parse 32:64-32:83 ExpBox False + 222 1 Parse 31:7-32:84 ExpBox False + 223 1 Parse 33:18-33:23 ExpBox False + 224 4019 Parse 33:56-33:56 ExpBox False + 225 4022 Parse 33:49-33:56 ExpBox False + 226 1 Parse 33:8-33:58 ExpBox False + 227 0 Parse 33:64-33:71 ExpBox False + 228 1 Parse 33:7-33:72 ExpBox False + 229 1 Parse 31:7-33:72 ExpBox False + 230 1 Parse 30:7-33:72 ExpBox False + 231 1 Parse 29:7-33:72 ExpBox False + 232 1 Parse 28:8-33:72 ExpBox False + 233 1 Parse 27:8-33:72 ExpBox False + 234 1 Parse 26:1-33:72 TopLevelBox ["token"] + 235 1 Parse 23:18-23:22 ExpBox False + 236 1 Parse 23:13-23:22 ExpBox False + 237 0 Parse 23:28-23:43 ExpBox False + 238 1 Parse 23:13-23:43 ExpBox False + 239 1 Parse 23:1-23:43 TopLevelBox ["tokenList"] + 240 1 Parse 16:8-16:17 ExpBox False + 241 1 Parse 17:14-17:22 ExpBox False + 242 1 Parse 18:8-18:10 ExpBox False + 243 1 Parse 19:15-19:16 ExpBox False + 244 1 Parse 19:8-19:16 ExpBox False + 245 1 Parse 16:3-20:6 ExpBox False + 246 1 Parse 15:1-20:6 TopLevelBox ["program"] + 247 1 Parse 114:27-114:33 ExpBox False + 248 0 Parse 114:35-114:43 ExpBox False + 249 1 Parse 114:45-114:46 ExpBox False + 250 1 Parse 114:20-114:47 ExpBox False + 251 0 Parse 115:39-115:41 ExpBox False + 252 0 Parse 115:33-115:42 ExpBox False + 253 0 Parse 115:27-115:42 ExpBox True + 254 1 Parse 116:27-116:27 ExpBox True + 255 1 Parse 114:15-116:27 ExpBox False + 256 1 Parse 114:1-116:27 TopLevelBox ["rayParse"] + 257 0 Parse 120:27-120:33 ExpBox False + 258 0 Parse 120:35-120:38 ExpBox False + 259 0 Parse 120:13-120:38 ExpBox False + 260 0 Parse 121:13-121:13 ExpBox False + 261 0 Parse 122:32-122:34 ExpBox False + 262 0 Parse 122:26-122:35 ExpBox False + 263 0 Parse 122:20-122:35 ExpBox True + 264 0 Parse 123:27-123:27 ExpBox False + 265 0 Parse 123:20-123:27 ExpBox True + 266 0 Parse 121:8-123:27 ExpBox False + 267 0 Parse 120:3-124:6 ExpBox False + 268 0 Parse 119:1-124:6 TopLevelBox ["rayParseF"] + 269 0 Parse 127:22-127:28 ExpBox False + 270 0 Parse 127:30-127:31 ExpBox False + 271 0 Parse 127:33-127:34 ExpBox False + 272 0 Parse 127:15-127:35 ExpBox False + 273 0 Parse 128:28-128:30 ExpBox False + 274 0 Parse 128:22-128:30 ExpBox True + 275 0 Parse 129:28-129:28 ExpBox False + 276 0 Parse 129:22-129:28 ExpBox True + 277 0 Parse 127:10-129:28 ExpBox False + 278 0 Parse 127:1-129:28 TopLevelBox ["run"] + 279 0 Parse 133:27-133:33 ExpBox False + 280 0 Parse 133:35-133:46 ExpBox False + 281 0 Parse 133:13-133:46 ExpBox False + 282 0 Parse 134:13-134:13 ExpBox False + 283 0 Parse 135:26-135:28 ExpBox False + 284 0 Parse 135:20-135:28 ExpBox True + 285 0 Parse 136:26-136:26 ExpBox False + 286 0 Parse 136:20-136:26 ExpBox True + 287 0 Parse 134:8-136:26 ExpBox False + 288 0 Parse 133:3-137:6 ExpBox False + 289 0 Parse 132:1-137:6 TopLevelBox ["runF"] + 0 0 Eval 347:12-347:73 ExpBox False + 1 0 Eval 347:1-347:73 TopLevelBox ["abstest1"] + 2 0 Eval 328:8-328:69 ExpBox False + 3 0 Eval 328:1-328:69 TopLevelBox ["done"] + 4 0 Eval 305:34-305:35 ExpBox False + 5 0 Eval 305:37-305:38 ExpBox False + 6 0 Eval 305:40-305:41 ExpBox False + 7 0 Eval 305:26-305:42 ExpBox False + 8 0 Eval 305:46-305:48 ExpBox False + 9 0 Eval 305:25-305:49 ExpBox False + 10 0 Eval 305:18-305:49 ExpBox True + 11 0 Eval 308:23-308:49 ExpBox False + 12 0 Eval 308:59-308:60 ExpBox False + 13 0 Eval 308:54-308:60 ExpBox False + 14 0 Eval 308:65-308:67 ExpBox False + 15 0 Eval 308:54-308:67 ExpBox False + 16 0 Eval 308:22-308:68 ExpBox False + 17 2 Eval 308:18-308:68 ExpBox True + 18 2 Eval 304:1-308:68 TopLevelBox ["doAbsOp"] + 19 1 Eval 145:20-145:27 ExpBox False + 20 1 Eval 145:29-145:36 ExpBox False + 21 1 Eval 145:19-145:37 ExpBox False + 22 1 Eval 146:52-146:58 ExpBox False + 23 49 Eval 146:22-146:23 ExpBox False + 24 20 Eval 146:25-146:28 ExpBox False + 25 49 Eval 146:21-146:29 ExpBox False + 26 1 Eval 146:19-146:60 ExpBox False + 27 1 Eval 145:13-146:60 ExpBox False + 28 1 Eval 145:1-146:60 TopLevelBox ["opFnTable"] + 29 269762 Eval 67:32-67:36 ExpBox True + 30 3059036 Eval 68:32-68:35 ExpBox True + 31 3328798 Eval 67:1-68:35 TopLevelBox ["moreCode"] + 32 0 Eval 77:15-77:16 ExpBox False + 33 0 Eval 77:35-77:35 ExpBox False + 34 0 Eval 77:28-77:36 ExpBox False + 35 0 Eval 77:38-77:42 ExpBox False + 36 0 Eval 77:28-77:42 ExpBox False + 37 0 Eval 77:55-77:56 ExpBox False + 38 0 Eval 77:14-77:59 ExpBox False + 39 0 Eval 77:7-77:59 ExpBox True + 40 176132 Eval 79:15-79:16 ExpBox False + 41 176053 Eval 79:34-79:34 ExpBox False + 42 176053 Eval 79:28-79:35 ExpBox False + 43 176132 Eval 79:37-79:41 ExpBox False + 44 176132 Eval 79:28-79:41 ExpBox False + 45 176132 Eval 79:55-79:56 ExpBox False + 46 176132 Eval 79:14-79:59 ExpBox False + 47 176132 Eval 79:7-79:59 ExpBox True + 48 369283 Eval 81:15-81:16 ExpBox False + 49 369283 Eval 81:35-81:35 ExpBox False + 50 369283 Eval 81:28-81:36 ExpBox False + 51 369279 Eval 81:38-81:42 ExpBox False + 52 369283 Eval 81:28-81:42 ExpBox False + 53 369283 Eval 81:55-81:56 ExpBox False + 54 369283 Eval 81:14-81:59 ExpBox False + 55 369283 Eval 81:7-81:59 ExpBox True + 56 1 Eval 83:15-83:16 ExpBox False + 57 0 Eval 83:37-83:37 ExpBox False + 58 1 Eval 83:28-83:38 ExpBox False + 59 1 Eval 83:40-83:44 ExpBox False + 60 1 Eval 83:28-83:44 ExpBox False + 61 1 Eval 83:55-83:56 ExpBox False + 62 1 Eval 83:14-83:59 ExpBox False + 63 1 Eval 83:7-83:59 ExpBox True + 64 371112 Eval 87:35-87:37 ExpBox False + 65 441868 Eval 87:39-87:40 ExpBox False + 66 409350 Eval 87:42-87:42 ExpBox False + 67 441868 Eval 87:25-87:42 ExpBox False + 68 441866 Eval 87:53-87:57 ExpBox False + 69 441868 Eval 87:68-87:69 ExpBox False + 70 441868 Eval 87:10-87:72 ExpBox False + 71 441868 Eval 87:3-87:72 ExpBox True + 72 0 Eval 89:7-89:49 ExpBox False + 73 0 Eval 89:3-89:49 ExpBox True + 74 711560 Eval 93:19-93:21 ExpBox False + 75 711560 Eval 93:23-93:24 ExpBox False + 76 711560 Eval 93:8-93:25 ExpBox False + 77 711560 Eval 94:21-94:22 ExpBox False + 78 711557 Eval 94:34-94:34 ExpBox False + 79 711556 Eval 94:36-94:40 ExpBox False + 80 711559 Eval 94:34-94:40 ExpBox False + 81 711560 Eval 94:51-94:52 ExpBox False + 82 711560 Eval 94:20-94:55 ExpBox False + 83 711560 Eval 94:13-94:55 ExpBox True + 84 0 Eval 95:19-95:54 ExpBox False + 85 0 Eval 95:59-95:60 ExpBox False + 86 0 Eval 95:18-95:61 ExpBox False + 87 0 Eval 95:14-95:61 ExpBox True + 88 711560 Eval 93:3-95:61 ExpBox True + 89 376835 Eval 99:11-99:12 ExpBox False + 90 118594 Eval 99:34-99:36 ExpBox False + 91 204675 Eval 99:38-99:41 ExpBox False + 92 376835 Eval 99:24-99:42 ExpBox False + 93 376835 Eval 99:44-99:48 ExpBox False + 94 376835 Eval 99:24-99:48 ExpBox False + 95 376835 Eval 99:58-99:59 ExpBox False + 96 376835 Eval 99:10-99:62 ExpBox False + 97 376835 Eval 99:3-99:62 ExpBox True + 98 0 Eval 103:34-103:37 ExpBox False + 99 65024 Eval 103:48-103:52 ExpBox False + 100 65025 Eval 103:62-103:66 ExpBox False + 101 65025 Eval 103:20-103:68 ExpBox False + 102 65025 Eval 103:15-103:68 ExpBox False + 103 65024 Eval 104:16-104:17 ExpBox False + 104 65024 Eval 104:29-104:31 ExpBox False + 105 65024 Eval 104:41-104:42 ExpBox False + 106 65024 Eval 104:15-104:45 ExpBox False + 107 65024 Eval 104:8-104:45 ExpBox False + 108 65025 Eval 103:3-105:6 ExpBox True + 109 0 Eval 107:7-107:39 ExpBox False + 110 0 Eval 107:3-107:39 ExpBox True + 111 0 Eval 109:7-109:36 ExpBox False + 112 0 Eval 109:3-109:36 ExpBox True + 113 1 Eval 113:34-113:36 ExpBox False + 114 1 Eval 113:47-113:48 ExpBox False + 115 65 Eval 113:58-113:62 ExpBox False + 116 65 Eval 113:20-113:64 ExpBox False + 117 65 Eval 113:15-113:64 ExpBox False + 118 65 Eval 114:26-114:28 ExpBox False + 119 65 Eval 114:19-114:28 ExpBox False + 120 65 Eval 114:30-114:30 ExpBox False + 121 65 Eval 114:19-114:30 ExpBox False + 122 65 Eval 114:12-114:30 LocalBox ["step","last"] + 123 65 Eval 115:25-115:25 ExpBox False + 124 65 Eval 115:27-115:30 ExpBox False + 125 65 Eval 115:24-115:31 ExpBox False + 126 65 Eval 115:39-115:42 ExpBox False + 127 65 Eval 115:44-115:47 ExpBox False + 128 65 Eval 115:49-115:49 ExpBox False + 129 65 Eval 115:44-115:49 ExpBox False + 130 65 Eval 115:38-115:52 ExpBox False + 131 65 Eval 115:54-115:56 ExpBox False + 132 65 Eval 115:33-115:57 ExpBox False + 133 65 Eval 115:18-115:57 ExpBox False + 134 65 Eval 115:12-115:57 LocalBox ["step","arr"] + 135 65 Eval 116:16-116:17 ExpBox False + 136 65 Eval 116:37-116:39 ExpBox False + 137 65 Eval 116:29-116:40 ExpBox False + 138 65 Eval 116:42-116:46 ExpBox False + 139 65 Eval 116:29-116:46 ExpBox False + 140 65 Eval 116:56-116:57 ExpBox False + 141 65 Eval 116:15-116:60 ExpBox False + 142 65 Eval 116:8-116:60 ExpBox False + 143 65 Eval 113:3-117:6 ExpBox True + 144 13483 Eval 121:34-121:35 ExpBox False + 145 39849 Eval 121:46-121:50 ExpBox False + 146 39849 Eval 121:60-121:61 ExpBox False + 147 39849 Eval 121:20-121:63 ExpBox False + 148 39849 Eval 121:15-121:63 ExpBox False + 149 39849 Eval 122:16-122:17 ExpBox False + 150 39849 Eval 122:29-122:31 ExpBox False + 151 39849 Eval 122:41-122:42 ExpBox False + 152 39849 Eval 122:15-122:45 ExpBox False + 153 39849 Eval 122:8-122:45 ExpBox False + 154 39849 Eval 121:3-123:6 ExpBox True + 155 105109 Eval 125:34-125:35 ExpBox False + 156 132311 Eval 125:46-125:50 ExpBox False + 157 132311 Eval 125:60-125:61 ExpBox False + 158 132311 Eval 125:20-125:63 ExpBox False + 159 132311 Eval 125:15-125:63 ExpBox False + 160 132311 Eval 126:16-126:17 ExpBox False + 161 132311 Eval 126:29-126:31 ExpBox False + 162 132311 Eval 126:41-126:42 ExpBox False + 163 132311 Eval 126:15-126:45 ExpBox False + 164 132311 Eval 126:8-126:45 ExpBox False + 165 132311 Eval 125:3-127:6 ExpBox True + 166 0 Eval 129:7-129:74 ExpBox False + 167 0 Eval 129:3-129:74 ExpBox True + 168 746105 Eval 133:21-133:29 ExpBox False + 169 746105 Eval 133:33-133:34 ExpBox False + 170 746105 Eval 133:20-133:35 ExpBox False + 171 746094 Eval 133:37-133:38 ExpBox False + 172 746105 Eval 133:40-133:44 ExpBox False + 173 746107 Eval 133:15-133:44 ExpBox False + 174 746105 Eval 134:16-134:17 ExpBox False + 175 746104 Eval 134:29-134:31 ExpBox False + 176 746105 Eval 134:41-134:42 ExpBox False + 177 746105 Eval 134:15-134:45 ExpBox False + 178 746105 Eval 134:8-134:45 ExpBox False + 179 746107 Eval 133:3-135:6 ExpBox True + 180 0 Eval 138:14-138:50 ExpBox False + 181 0 Eval 138:10-138:50 ExpBox True + 182 3059036 Eval 76:1-138:50 TopLevelBox ["step"] + 183 4153 Eval 57:21-57:22 ExpBox False + 184 3328782 Eval 57:14-57:22 ExpBox False + 185 3328798 Eval 58:20-58:21 ExpBox False + 186 3328798 Eval 58:11-58:21 ExpBox False + 187 3059036 Eval 58:11-58:21 BinBox CondBinBox True + 188 269762 Eval 58:11-58:21 BinBox CondBinBox False + 189 4086 Eval 59:13-59:16 ExpBox False + 190 3059036 Eval 60:27-60:28 ExpBox False + 191 3059036 Eval 60:22-60:28 ExpBox False + 192 3059033 Eval 61:20-61:22 ExpBox False + 193 3059033 Eval 61:15-61:22 ExpBox False + 194 3059036 Eval 59:8-62:13 ExpBox True + 195 269761 Eval 63:28-63:29 ExpBox False + 196 269761 Eval 63:21-63:30 ExpBox False + 197 269762 Eval 63:14-63:30 ExpBox True + 198 3328798 Eval 58:8-63:30 ExpBox False + 199 3328798 Eval 57:3-64:6 ExpBox False + 200 3328798 Eval 56:1-64:6 TopLevelBox ["eval"] + 201 1 Eval 281:31-281:33 ExpBox False + 202 2 Eval 281:35-281:37 ExpBox False + 203 2 Eval 281:39-281:42 ExpBox False + 204 2 Eval 281:24-281:43 ExpBox False + 205 2 Eval 281:18-281:44 ExpBox False + 206 2 Eval 281:46-281:48 ExpBox False + 207 2 Eval 281:11-281:48 ExpBox False + 208 0 Eval 282:31-282:33 ExpBox False + 209 0 Eval 282:26-282:33 ExpBox True + 210 1 Eval 283:26-283:32 ExpBox True + 211 2 Eval 281:6-283:32 ExpBox False + 212 2 Eval 280:1-283:32 TopLevelBox ["absapply"] + 213 0 Eval 314:41-314:48 ExpBox False + 214 1 Eval 314:50-314:51 ExpBox False + 215 1 Eval 314:53-314:56 ExpBox False + 216 1 Eval 314:34-314:57 ExpBox False + 217 1 Eval 314:29-314:57 ExpBox False + 218 0 Eval 315:29-315:30 ExpBox False + 219 1 Eval 315:22-315:30 ExpBox False + 220 1 Eval 314:17-316:20 ExpBox False + 221 1 Eval 314:1-316:20 TopLevelBox ["mainEval"] + 222 0 Eval 334:23-334:30 ExpBox False + 223 0 Eval 334:32-334:33 ExpBox False + 224 0 Eval 334:45-334:46 ExpBox False + 225 0 Eval 334:35-334:47 ExpBox False + 226 0 Eval 334:16-334:48 ExpBox False + 227 0 Eval 334:11-334:48 ExpBox False + 228 0 Eval 334:1-334:48 TopLevelBox ["test"] + 229 0 Eval 350:12-350:46 ExpBox False + 230 0 Eval 350:7-350:46 ExpBox False + 231 0 Eval 350:1-350:46 TopLevelBox ["et1"] + 232 0 Eval 337:33-337:34 ExpBox False + 233 0 Eval 337:23-337:34 ExpBox False + 234 0 Eval 338:27-338:34 ExpBox False + 235 0 Eval 338:36-338:37 ExpBox False + 236 0 Eval 338:39-338:42 ExpBox False + 237 0 Eval 338:20-338:43 ExpBox False + 238 0 Eval 338:15-338:43 ExpBox False + 239 0 Eval 337:12-338:43 ExpBox False + 240 0 Eval 337:1-338:43 TopLevelBox ["testF"] + 241 0 Eval 341:37-341:44 ExpBox False + 242 0 Eval 342:46-342:52 ExpBox False + 243 0 Eval 342:38-342:52 ExpBox False + 244 0 Eval 342:62-342:65 ExpBox False + 245 0 Eval 342:54-342:65 ExpBox False + 246 0 Eval 342:75-342:78 ExpBox False + 247 0 Eval 342:67-342:78 ExpBox False + 248 0 Eval 342:37-342:79 ExpBox False + 249 0 Eval 343:47-343:48 ExpBox False + 250 0 Eval 343:37-343:49 ExpBox False + 251 0 Eval 341:30-343:50 ExpBox False + 252 0 Eval 341:24-343:51 ExpBox False + 253 0 Eval 343:53-343:55 ExpBox False + 254 0 Eval 341:17-343:55 ExpBox False + 255 0 Eval 344:37-344:37 ExpBox False + 256 0 Eval 344:39-344:39 ExpBox False + 257 0 Eval 344:36-344:40 ExpBox False + 258 0 Eval 344:30-344:40 ExpBox True + 259 0 Eval 345:32-345:32 ExpBox False + 260 0 Eval 345:27-345:32 ExpBox True + 261 0 Eval 341:12-345:32 ExpBox False + 262 0 Eval 341:1-345:32 TopLevelBox ["testA"] + 263 32512 Eval 49:34-49:36 ExpBox False + 264 32512 Eval 49:47-49:49 ExpBox False + 265 32512 Eval 49:59-49:62 ExpBox False + 266 32512 Eval 49:19-49:64 ExpBox False + 267 32512 Eval 49:14-49:64 ExpBox False + 268 32512 Eval 50:26-50:28 ExpBox False + 269 32512 Eval 49:9-50:28 ExpBox False + 270 32512 Eval 48:1-50:28 TopLevelBox ["callback"] + 271 0 Eval 165:23-165:24 ExpBox False + 272 0 Eval 165:19-165:25 ExpBox False + 273 0 Eval 165:13-165:26 ExpBox False + 274 0 Eval 165:30-165:32 ExpBox False + 275 0 Eval 165:12-165:33 ExpBox False + 276 0 Eval 165:5-165:33 ExpBox True + 277 53568 Eval 167:24-167:25 ExpBox False + 278 53568 Eval 167:20-167:26 ExpBox False + 279 53568 Eval 167:13-167:27 ExpBox False + 280 53568 Eval 167:31-167:33 ExpBox False + 281 53568 Eval 167:12-167:34 ExpBox False + 282 53568 Eval 167:5-167:34 ExpBox True + 283 0 Eval 169:24-169:24 ExpBox False + 284 0 Eval 169:26-169:26 ExpBox False + 285 0 Eval 169:28-169:28 ExpBox False + 286 0 Eval 169:20-169:29 ExpBox False + 287 0 Eval 169:13-169:30 ExpBox False + 288 0 Eval 169:34-169:36 ExpBox False + 289 0 Eval 169:12-169:37 ExpBox False + 290 0 Eval 169:5-169:37 ExpBox True + 291 32512 Eval 183:25-183:27 ExpBox False + 292 32512 Eval 183:29-183:32 ExpBox False + 293 32512 Eval 183:41-183:42 ExpBox False + 294 32512 Eval 183:35-183:42 ExpBox False + 295 32512 Eval 183:50-183:51 ExpBox False + 296 32512 Eval 183:44-183:51 ExpBox False + 297 0 Eval 183:58-183:58 ExpBox False + 298 0 Eval 183:53-183:58 ExpBox False + 299 32512 Eval 183:34-183:59 ExpBox False + 300 32512 Eval 183:16-183:59 ExpBox False + 301 32512 Eval 185:33-185:34 ExpBox False + 302 32512 Eval 185:36-185:37 ExpBox False + 303 32512 Eval 185:39-185:40 ExpBox False + 304 32512 Eval 185:26-185:41 ExpBox False + 305 32512 Eval 185:43-185:44 ExpBox False + 306 32512 Eval 185:46-185:47 ExpBox False + 307 26812 Eval 185:49-185:50 ExpBox False + 308 32512 Eval 185:21-185:50 ExpBox True + 309 0 Eval 186:28-186:80 ExpBox False + 310 0 Eval 187:34-187:36 ExpBox False + 311 0 Eval 187:29-187:36 ExpBox False + 312 0 Eval 186:27-187:37 ExpBox False + 313 0 Eval 186:21-187:37 ExpBox True + 314 32512 Eval 183:11-187:37 ExpBox False + 315 32512 Eval 182:9-187:37 LocalBox ["doPrimOp","call"] + 316 1 Eval 173:19-173:21 ExpBox False + 317 2 Eval 173:23-173:26 ExpBox False + 318 0 Eval 173:37-173:43 ExpBox False + 319 0 Eval 173:29-173:43 ExpBox False + 320 0 Eval 173:53-173:56 ExpBox False + 321 0 Eval 173:45-173:56 ExpBox False + 322 0 Eval 173:66-173:69 ExpBox False + 323 0 Eval 173:58-173:69 ExpBox False + 324 2 Eval 173:28-173:70 ExpBox False + 325 2 Eval 173:10-173:70 ExpBox False + 326 0 Eval 176:34-176:35 ExpBox False + 327 0 Eval 176:37-176:38 ExpBox False + 328 0 Eval 176:40-176:41 ExpBox False + 329 0 Eval 176:27-176:42 ExpBox False + 330 0 Eval 176:44-176:45 ExpBox False + 331 0 Eval 176:47-176:48 ExpBox False + 332 0 Eval 176:50-176:51 ExpBox False + 333 0 Eval 176:22-176:51 ExpBox False + 334 0 Eval 176:16-176:51 LocalBox ["doPrimOp","res"] + 335 0 Eval 178:45-178:47 ExpBox False + 336 0 Eval 178:37-178:48 ExpBox False + 337 0 Eval 178:33-178:49 ExpBox False + 338 0 Eval 178:24-178:50 ExpBox False + 339 0 Eval 178:54-178:56 ExpBox False + 340 0 Eval 178:23-178:57 ExpBox False + 341 0 Eval 175:12-178:57 ExpBox True + 342 2 Eval 179:39-179:42 ExpBox False + 343 2 Eval 179:33-179:43 ExpBox False + 344 2 Eval 179:29-179:44 ExpBox False + 345 2 Eval 179:20-179:45 ExpBox False + 346 1 Eval 179:49-179:51 ExpBox False + 347 2 Eval 179:19-179:52 ExpBox False + 348 2 Eval 179:12-179:52 ExpBox True + 349 2 Eval 173:5-179:52 ExpBox True + 350 118592 Eval 190:23-190:24 ExpBox False + 351 118592 Eval 190:19-190:25 ExpBox False + 352 118592 Eval 190:13-190:26 ExpBox False + 353 118592 Eval 190:30-190:32 ExpBox False + 354 118592 Eval 190:12-190:33 ExpBox False + 355 118592 Eval 190:5-190:33 ExpBox True + 356 32512 Eval 192:24-192:25 ExpBox False + 357 32512 Eval 192:20-192:26 ExpBox False + 358 32512 Eval 192:13-192:27 ExpBox False + 359 32512 Eval 192:31-192:33 ExpBox False + 360 32512 Eval 192:12-192:34 ExpBox False + 361 32512 Eval 192:5-192:34 ExpBox True + 362 0 Eval 194:23-194:25 ExpBox False + 363 0 Eval 194:19-194:26 ExpBox False + 364 0 Eval 194:13-194:27 ExpBox False + 365 0 Eval 194:31-194:33 ExpBox False + 366 0 Eval 194:12-194:34 ExpBox False + 367 0 Eval 194:5-194:34 ExpBox True + 368 53568 Eval 199:23-199:24 ExpBox False + 369 53568 Eval 199:26-199:27 ExpBox False + 370 53568 Eval 199:19-199:28 ExpBox False + 371 53568 Eval 199:13-199:29 ExpBox False + 372 53568 Eval 199:33-199:35 ExpBox False + 373 53568 Eval 199:12-199:36 ExpBox False + 374 53568 Eval 199:5-199:36 ExpBox True + 375 118592 Eval 201:24-201:25 ExpBox False + 376 118592 Eval 201:27-201:28 ExpBox False + 377 118592 Eval 201:20-201:29 ExpBox False + 378 118592 Eval 201:13-201:30 ExpBox False + 379 118592 Eval 201:34-201:36 ExpBox False + 380 118592 Eval 201:12-201:37 ExpBox False + 381 118592 Eval 201:5-201:37 ExpBox True + 382 218155 Eval 203:24-203:25 ExpBox False + 383 218155 Eval 203:27-203:28 ExpBox False + 384 218155 Eval 203:20-203:29 ExpBox False + 385 218155 Eval 203:13-203:30 ExpBox False + 386 218155 Eval 203:34-203:36 ExpBox False + 387 218155 Eval 203:12-203:37 ExpBox False + 388 218155 Eval 203:5-203:37 ExpBox True + 389 53568 Eval 205:24-205:25 ExpBox False + 390 53568 Eval 205:27-205:28 ExpBox False + 391 53568 Eval 205:20-205:29 ExpBox False + 392 53568 Eval 205:13-205:30 ExpBox False + 393 53568 Eval 205:34-205:36 ExpBox False + 394 53568 Eval 205:12-205:37 ExpBox False + 395 53568 Eval 205:5-205:37 ExpBox True + 396 65024 Eval 207:17-207:19 ExpBox False + 397 65024 Eval 207:21-207:21 ExpBox False + 398 65024 Eval 207:13-207:22 ExpBox False + 399 65024 Eval 207:26-207:28 ExpBox False + 400 65024 Eval 207:12-207:29 ExpBox False + 401 65024 Eval 207:5-207:29 ExpBox True + 402 1 Eval 213:26-213:27 ExpBox False + 403 1 Eval 213:29-213:30 ExpBox False + 404 1 Eval 213:22-213:31 ExpBox False + 405 1 Eval 213:13-213:32 ExpBox False + 406 0 Eval 213:36-213:38 ExpBox False + 407 1 Eval 213:12-213:39 ExpBox False + 408 1 Eval 213:5-213:39 ExpBox True + 409 1 Eval 215:25-215:25 ExpBox False + 410 1 Eval 215:27-215:27 ExpBox False + 411 1 Eval 215:29-215:29 ExpBox False + 412 1 Eval 215:24-215:30 ExpBox False + 413 1 Eval 215:39-215:39 ExpBox False + 414 1 Eval 215:41-215:41 ExpBox False + 415 1 Eval 215:43-215:43 ExpBox False + 416 1 Eval 215:32-215:44 ExpBox False + 417 1 Eval 215:20-215:45 ExpBox False + 418 1 Eval 215:13-215:45 ExpBox False + 419 0 Eval 215:49-215:51 ExpBox False + 420 1 Eval 215:12-215:52 ExpBox False + 421 1 Eval 215:5-215:52 ExpBox True + 422 0 Eval 218:25-218:26 ExpBox False + 423 0 Eval 218:28-218:29 ExpBox False + 424 0 Eval 218:31-218:32 ExpBox False + 425 0 Eval 218:24-218:33 ExpBox False + 426 0 Eval 218:36-218:37 ExpBox False + 427 0 Eval 218:39-218:40 ExpBox False + 428 0 Eval 218:42-218:43 ExpBox False + 429 0 Eval 218:35-218:44 ExpBox False + 430 0 Eval 218:53-218:53 ExpBox False + 431 0 Eval 218:55-218:55 ExpBox False + 432 0 Eval 218:57-218:57 ExpBox False + 433 0 Eval 218:46-218:58 ExpBox False + 434 0 Eval 218:60-218:61 ExpBox False + 435 0 Eval 218:63-218:64 ExpBox False + 436 0 Eval 218:20-218:65 ExpBox False + 437 0 Eval 218:13-218:65 ExpBox False + 438 0 Eval 218:69-218:71 ExpBox False + 439 0 Eval 218:12-218:72 ExpBox False + 440 0 Eval 218:5-218:72 ExpBox True + 441 32515 Eval 220:17-220:18 ExpBox False + 442 32515 Eval 220:20-220:21 ExpBox False + 443 32515 Eval 220:23-220:24 ExpBox False + 444 32515 Eval 220:13-220:25 ExpBox False + 445 32513 Eval 220:29-220:31 ExpBox False + 446 32515 Eval 220:12-220:32 ExpBox False + 447 32515 Eval 220:5-220:32 ExpBox True + 448 3 Eval 222:25-222:25 ExpBox False + 449 3 Eval 222:27-222:27 ExpBox False + 450 3 Eval 222:21-222:28 ExpBox False + 451 3 Eval 222:13-222:28 ExpBox False + 452 0 Eval 222:32-222:34 ExpBox False + 453 3 Eval 222:12-222:35 ExpBox False + 454 3 Eval 222:5-222:35 ExpBox True + 455 3 Eval 224:25-224:25 ExpBox False + 456 3 Eval 224:27-224:28 ExpBox False + 457 3 Eval 224:30-224:31 ExpBox False + 458 3 Eval 224:33-224:34 ExpBox False + 459 3 Eval 224:21-224:35 ExpBox False + 460 3 Eval 224:13-224:35 ExpBox False + 461 1 Eval 224:39-224:41 ExpBox False + 462 3 Eval 224:12-224:42 ExpBox False + 463 3 Eval 224:5-224:42 ExpBox True + 464 0 Eval 230:15-230:15 ExpBox False + 465 0 Eval 230:17-230:17 ExpBox False + 466 0 Eval 230:12-230:17 ExpBox False + 467 0 Eval 230:6-230:17 LocalBox ["doPrimOp","res"] + 468 0 Eval 228:5-228:7 ExpBox False + 469 0 Eval 228:23-228:25 ExpBox False + 470 0 Eval 228:29-228:31 ExpBox False + 471 0 Eval 228:22-228:32 ExpBox False + 472 0 Eval 228:15-228:32 ExpBox False + 473 0 Eval 228:5-228:32 ExpBox True + 474 0 Eval 248:29-248:34 ExpBox False + 475 0 Eval 248:15-248:34 ExpBox False + 476 0 Eval 248:7-248:34 LocalBox ["doPrimOp","types"] + 477 0 Eval 244:22-244:26 ExpBox False + 478 0 Eval 244:15-244:26 ExpBox False + 479 0 Eval 244:7-244:26 LocalBox ["doPrimOp","len"] + 480 0 Eval 245:16-245:18 ExpBox False + 481 0 Eval 245:23-245:23 ExpBox False + 482 0 Eval 245:16-245:23 ExpBox False + 483 0 Eval 245:16-245:23 BinBox CondBinBox True + 484 0 Eval 245:16-245:23 BinBox CondBinBox False + 485 0 Eval 245:30-245:32 ExpBox True + 486 0 Eval 245:39-245:40 ExpBox True + 487 0 Eval 245:12-245:41 ExpBox False + 488 0 Eval 245:7-245:41 LocalBox ["doPrimOp","s"] + 489 0 Eval 246:18-246:20 ExpBox False + 490 0 Eval 246:25-246:25 ExpBox False + 491 0 Eval 246:18-246:25 ExpBox False + 492 0 Eval 246:18-246:25 BinBox CondBinBox True + 493 0 Eval 246:18-246:25 BinBox CondBinBox False + 494 0 Eval 246:32-246:36 ExpBox True + 495 0 Eval 246:43-246:46 ExpBox True + 496 0 Eval 246:14-246:47 ExpBox False + 497 0 Eval 246:7-246:47 LocalBox ["doPrimOp","are"] + 498 0 Eval 247:18-247:20 ExpBox False + 499 0 Eval 247:25-247:25 ExpBox False + 500 0 Eval 247:18-247:25 ExpBox False + 501 0 Eval 247:18-247:25 BinBox CondBinBox True + 502 0 Eval 247:18-247:25 BinBox CondBinBox False + 503 0 Eval 247:32-247:33 ExpBox True + 504 0 Eval 247:40-247:45 ExpBox True + 505 0 Eval 247:14-247:46 ExpBox False + 506 0 Eval 247:7-247:46 LocalBox ["doPrimOp","the"] + 507 0 Eval 233:10-233:73 ExpBox False + 508 0 Eval 234:16-234:17 ExpBox False + 509 0 Eval 234:11-234:17 ExpBox False + 510 0 Eval 234:22-234:31 ExpBox False + 511 0 Eval 235:16-235:17 ExpBox False + 512 0 Eval 235:11-235:17 ExpBox False + 513 0 Eval 235:22-235:30 ExpBox False + 514 0 Eval 235:48-235:52 ExpBox False + 515 0 Eval 235:40-235:53 ExpBox False + 516 0 Eval 235:35-235:53 ExpBox False + 517 0 Eval 235:58-235:68 ExpBox False + 518 0 Eval 235:73-235:73 ExpBox False + 519 0 Eval 236:23-236:29 ExpBox False + 520 0 Eval 236:34-236:36 ExpBox False + 521 0 Eval 236:41-236:47 ExpBox False + 522 0 Eval 236:52-236:52 ExpBox False + 523 0 Eval 236:57-236:64 ExpBox False + 524 0 Eval 237:11-237:18 ExpBox False + 525 0 Eval 237:49-237:53 ExpBox False + 526 0 Eval 237:38-237:39 ExpBox False + 527 0 Eval 237:33-237:39 ExpBox False + 528 0 Eval 237:31-237:55 ExpBox False + 529 0 Eval 237:23-237:55 ExpBox False + 530 0 Eval 237:61-237:68 ExpBox False + 531 0 Eval 238:11-238:45 ExpBox False + 532 0 Eval 238:50-238:50 ExpBox False + 533 0 Eval 238:55-238:70 ExpBox False + 534 0 Eval 239:19-239:21 ExpBox False + 535 0 Eval 239:26-239:34 ExpBox False + 536 0 Eval 241:51-241:55 ExpBox False + 537 0 Eval 241:43-241:56 ExpBox False + 538 0 Eval 241:58-241:61 ExpBox False + 539 0 Eval 241:37-241:62 ExpBox False + 540 0 Eval 241:29-241:62 ExpBox False + 541 0 Eval 240:21-240:23 ExpBox False + 542 0 Eval 240:33-240:35 ExpBox False + 543 0 Eval 240:28-240:35 ExpBox False + 544 0 Eval 240:40-240:42 ExpBox False + 545 0 Eval 240:28-240:42 ExpBox False + 546 0 Eval 240:21-240:42 ExpBox False + 547 0 Eval 240:19-241:64 ExpBox False + 548 0 Eval 240:11-241:64 ExpBox False + 549 0 Eval 241:70-241:78 ExpBox False + 550 0 Eval 242:14-242:63 ExpBox False + 551 0 Eval 241:70-242:63 ExpBox False + 552 0 Eval 240:11-242:63 ExpBox False + 553 0 Eval 239:26-242:63 ExpBox False + 554 0 Eval 239:19-242:63 ExpBox False + 555 0 Eval 238:55-242:63 ExpBox False + 556 0 Eval 238:50-242:63 ExpBox False + 557 0 Eval 238:11-242:63 ExpBox False + 558 0 Eval 237:61-242:63 ExpBox False + 559 0 Eval 237:23-242:63 ExpBox False + 560 0 Eval 237:11-242:63 ExpBox False + 561 0 Eval 236:57-242:63 ExpBox False + 562 0 Eval 236:52-242:63 ExpBox False + 563 0 Eval 236:41-242:63 ExpBox False + 564 0 Eval 236:34-242:63 ExpBox False + 565 0 Eval 236:23-242:63 ExpBox False + 566 0 Eval 235:73-242:63 ExpBox False + 567 0 Eval 235:58-242:63 ExpBox False + 568 0 Eval 235:35-242:63 ExpBox False + 569 0 Eval 235:22-242:63 ExpBox False + 570 0 Eval 235:11-242:63 ExpBox False + 571 0 Eval 234:22-242:63 ExpBox False + 572 0 Eval 234:11-242:63 ExpBox False + 573 0 Eval 233:9-242:64 ExpBox False + 574 0 Eval 233:5-242:64 ExpBox True + 575 746104 Eval 164:1-248:34 TopLevelBox ["doPrimOp"] + 576 0 Eval 153:9-153:81 ExpBox False + 577 0 Eval 153:5-153:81 ExpBox True + 578 746091 Eval 154:35-154:40 ExpBox False + 579 0 Eval 154:42-154:43 ExpBox False + 580 746091 Eval 154:45-154:47 ExpBox False + 581 746091 Eval 154:26-154:47 ExpBox True + 582 746091 Eval 152:1-154:47 TopLevelBox ["doPureOp"] + 583 1 Eval 263:50-263:52 ExpBox False + 584 1 Eval 263:44-263:52 ExpBox False + 585 1 Eval 263:18-263:22 ExpBox False + 586 1 Eval 263:16-263:54 ExpBox False + 587 1 Eval 263:7-263:54 LocalBox ["doAllOp","lights"] + 588 1 Eval 259:24-259:24 ExpBox False + 589 1 Eval 259:26-259:26 ExpBox False + 590 1 Eval 259:28-259:28 ExpBox False + 591 1 Eval 259:17-259:29 ExpBox False + 592 1 Eval 259:31-259:36 ExpBox False + 593 1 Eval 259:38-259:40 ExpBox False + 594 1 Eval 259:42-259:44 ExpBox False + 595 1 Eval 259:47-259:49 ExpBox False + 596 1 Eval 259:54-259:55 ExpBox False + 597 1 Eval 259:59-259:63 ExpBox False + 598 1 Eval 259:53-259:64 ExpBox False + 599 1 Eval 259:46-259:65 ExpBox False + 600 1 Eval 259:67-259:69 ExpBox False + 601 1 Eval 259:71-259:72 ExpBox False + 602 0 Eval 259:74-259:76 ExpBox False + 603 1 Eval 259:10-259:76 ExpBox False + 604 0 Eval 260:17-260:19 ExpBox False + 605 1 Eval 260:10-260:19 ExpBox False + 606 1 Eval 259:5-261:8 ExpBox True + 607 13 Eval 265:34-265:39 ExpBox False + 608 0 Eval 265:41-265:42 ExpBox False + 609 13 Eval 265:44-265:46 ExpBox False + 610 13 Eval 265:25-265:46 ExpBox True + 611 14 Eval 255:1-265:46 TopLevelBox ["doAllOp"] + 612 0 Eval 21:17-21:18 ExpBox False + 613 1 Eval 21:10-21:18 ExpBox False + 614 1 Eval 21:3-21:18 TopLevelBox ["tick"] + 615 0 Eval 23:34-23:37 TopLevelBox ["showsPrec"] + 616 0 Eval 23:34-23:37 TopLevelBox ["showList"] + 617 0 Eval 45:28-45:31 TopLevelBox ["showsPrec"] + 618 0 Eval 45:28-45:31 TopLevelBox ["showList"] + 619 1 Eval 297:10-297:16 ExpBox False + 620 1 Eval 297:3-297:16 TopLevelBox ["doOp"] + 621 17 Eval 299:25-299:25 ExpBox False + 622 17 Eval 299:30-299:30 ExpBox False + 623 17 Eval 299:25-299:30 ExpBox False + 624 0 Eval 299:25-299:30 BinBox CondBinBox True + 625 17 Eval 299:25-299:30 BinBox CondBinBox False + 626 0 Eval 300:35-300:51 ExpBox False + 627 0 Eval 300:27-300:51 ExpBox True + 628 0 Eval 301:36-301:37 ExpBox False + 629 17 Eval 301:40-301:40 ExpBox False + 630 17 Eval 301:42-301:42 ExpBox False + 631 17 Eval 301:39-301:43 ExpBox False + 632 17 Eval 301:27-301:43 ExpBox True + 633 17 Eval 299:22-301:43 ExpBox False + 634 1 Eval 299:14-301:44 ExpBox False + 635 1 Eval 299:10-301:44 ExpBox False + 636 1 Eval 299:3-301:44 TopLevelBox ["tick"] + 637 1 Eval 298:10-298:13 ExpBox False + 638 1 Eval 298:3-298:13 TopLevelBox ["err"] + 639 50 Eval 290:42-290:42 ExpBox False + 640 54 Eval 290:39-290:42 ExpBox False + 641 31 Eval 291:63-291:63 ExpBox False + 642 48 Eval 291:60-291:64 ExpBox False + 643 46 Eval 291:66-291:67 ExpBox False + 644 48 Eval 291:53-291:67 ExpBox True + 645 0 Eval 292:61-292:61 ExpBox False + 646 6 Eval 292:53-292:61 ExpBox True + 647 54 Eval 290:34-292:61 ExpBox False + 648 54 Eval 290:26-292:62 ExpBox False + 649 54 Eval 290:22-292:62 ExpBox False + 650 54 Eval 290:5-292:62 TopLevelBox [">>="] + 651 31 Eval 293:41-293:41 ExpBox False + 652 31 Eval 293:43-293:43 ExpBox False + 653 31 Eval 293:32-293:43 ExpBox False + 654 15 Eval 293:24-293:44 ExpBox False + 655 15 Eval 293:20-293:44 ExpBox False + 656 15 Eval 293:5-293:44 TopLevelBox ["return"] + 657 0 Eval 294:40-294:40 ExpBox False + 658 2 Eval 294:32-294:40 ExpBox False + 659 2 Eval 294:24-294:41 ExpBox False + 660 2 Eval 294:20-294:41 ExpBox False + 661 2 Eval 294:5-294:41 TopLevelBox ["fail"] + 662 14 Eval 37:36-37:39 ExpBox False + 663 1 Eval 37:41-37:42 ExpBox False + 664 14 Eval 37:44-37:46 ExpBox False + 665 14 Eval 37:27-37:46 ExpBox False + 666 14 Eval 35:22-38:25 ExpBox False + 667 14 Eval 35:3-38:25 TopLevelBox ["doOp"] + 668 0 Eval 39:18-39:18 ExpBox False + 669 0 Eval 39:12-39:18 ExpBox False + 670 0 Eval 39:3-39:18 TopLevelBox ["err"] + 671 1 Eval 31:12-31:19 ExpBox False + 672 1 Eval 31:3-31:19 TopLevelBox ["doOp"] + 673 0 Eval 32:18-32:18 ExpBox False + 674 0 Eval 32:12-32:18 ExpBox False + 675 0 Eval 32:3-32:18 TopLevelBox ["err"] + 676 7362839 Eval 26:22-26:22 ExpBox False + 677 10417773 Eval 26:20-26:22 ExpBox False + 678 10417773 Eval 26:5-26:22 TopLevelBox [">>="] + 679 1 Eval 27:20-27:23 ExpBox False + 680 1 Eval 27:5-27:23 TopLevelBox ["return"] + 681 0 Eval 28:26-28:26 ExpBox False + 682 0 Eval 28:20-28:26 ExpBox False + 683 0 Eval 28:5-28:26 TopLevelBox ["fail"] + 0 0 Data 407:46-407:46 ExpBox False + 1 0 Data 407:49-407:49 ExpBox False + 2 0 Data 407:53-407:53 ExpBox False + 3 0 Data 407:48-407:54 ExpBox False + 4 0 Data 407:56-407:56 ExpBox False + 5 0 Data 407:44-407:56 ExpBox False + 6 0 Data 407:33-407:57 ExpBox False + 7 0 Data 407:27-407:58 ExpBox False + 8 0 Data 407:20-407:58 ExpBox True + 9 0 Data 408:20-408:20 ExpBox False + 10 0 Data 408:13-408:20 ExpBox True + 11 0 Data 407:1-408:20 TopLevelBox ["sphere'"] + 12 0 Data 398:46-398:47 ExpBox False + 13 0 Data 398:49-398:50 ExpBox False + 14 0 Data 398:52-398:54 ExpBox False + 15 0 Data 398:65-398:70 ExpBox False + 16 0 Data 398:56-398:71 ExpBox False + 17 0 Data 398:73-398:75 ExpBox False + 18 0 Data 398:36-398:75 ExpBox False + 19 0 Data 398:1-398:75 TopLevelBox ["mySpotlight"] + 20 0 Data 394:13-394:13 ExpBox False + 21 0 Data 394:17-394:17 ExpBox False + 22 0 Data 394:13-394:17 ExpBox False + 23 0 Data 394:13-394:17 BinBox GuardBinBox True + 24 0 Data 394:13-394:17 BinBox GuardBinBox False + 25 0 Data 394:31-394:72 ExpBox False + 26 0 Data 394:25-394:72 ExpBox True + 27 0 Data 395:13-395:21 ExpBox False + 28 0 Data 395:13-395:21 BinBox GuardBinBox True + 29 0 Data 395:13-395:21 BinBox GuardBinBox False + 30 0 Data 395:30-395:30 ExpBox False + 31 0 Data 395:25-395:30 ExpBox True + 32 0 Data 394:1-395:30 TopLevelBox ["ourSqrt"] + 33 0 Data 390:20-390:55 ExpBox False + 34 0 Data 390:14-390:55 ExpBox True + 35 53568 Data 391:14-391:14 ExpBox False + 36 53568 Data 391:22-391:22 ExpBox False + 37 53568 Data 391:14-391:22 ExpBox True + 38 53568 Data 390:1-391:22 TopLevelBox ["ourRem"] + 39 0 Data 386:21-386:56 ExpBox False + 40 0 Data 386:15-386:56 ExpBox True + 41 0 Data 387:15-387:15 ExpBox False + 42 0 Data 387:24-387:24 ExpBox False + 43 0 Data 387:15-387:24 ExpBox True + 44 0 Data 386:1-387:24 TopLevelBox ["ourQuot"] + 45 65024 Data 379:22-379:24 ExpBox False + 46 65024 Data 379:14-379:25 ExpBox False + 47 65024 Data 379:27-379:27 ExpBox False + 48 65024 Data 379:6-379:27 ExpBox False + 49 65024 Data 379:6-379:27 BinBox GuardBinBox True + 50 0 Data 379:6-379:27 BinBox GuardBinBox False + 51 65024 Data 379:31-379:33 ExpBox False + 52 65024 Data 379:37-379:37 ExpBox False + 53 65024 Data 379:31-379:37 ExpBox True + 54 0 Data 380:6-380:14 ExpBox False + 55 0 Data 380:6-380:14 BinBox GuardBinBox True + 56 0 Data 380:6-380:14 BinBox GuardBinBox False + 57 0 Data 380:25-380:57 ExpBox False + 58 0 Data 381:30-381:30 ExpBox False + 59 0 Data 381:25-381:30 ExpBox False + 60 0 Data 382:25-382:52 ExpBox False + 61 0 Data 383:43-383:45 ExpBox False + 62 0 Data 383:35-383:46 ExpBox False + 63 0 Data 383:30-383:47 ExpBox False + 64 0 Data 383:25-383:47 ExpBox False + 65 0 Data 383:52-383:54 ExpBox False + 66 0 Data 383:25-383:54 ExpBox False + 67 0 Data 382:25-383:54 ExpBox False + 68 0 Data 381:25-383:54 ExpBox False + 69 0 Data 380:24-383:55 ExpBox False + 70 0 Data 380:18-383:55 ExpBox True + 71 65024 Data 378:1-383:55 TopLevelBox ["ixGet"] + 72 0 Data 374:22-374:22 ExpBox False + 73 0 Data 374:26-374:30 ExpBox False + 74 0 Data 374:39-374:39 ExpBox False + 75 0 Data 374:34-374:39 ExpBox False + 76 0 Data 374:44-374:47 ExpBox False + 77 0 Data 374:34-374:47 ExpBox False + 78 0 Data 374:26-374:47 ExpBox False + 79 0 Data 374:21-374:48 ExpBox False + 80 0 Data 374:50-374:50 ExpBox False + 81 0 Data 374:15-374:50 ExpBox False + 82 0 Data 374:1-374:50 TopLevelBox ["mytrace"] + 83 0 Data 342:38-342:42 ExpBox False + 84 0 Data 342:37-342:43 ExpBox True + 85 0 Data 343:38-343:43 ExpBox False + 86 0 Data 343:37-343:44 ExpBox True + 87 0 Data 344:38-344:44 ExpBox False + 88 0 Data 344:37-344:45 ExpBox True + 89 0 Data 345:38-345:43 ExpBox False + 90 0 Data 345:37-345:44 ExpBox True + 91 0 Data 346:38-346:43 ExpBox False + 92 0 Data 346:37-346:44 ExpBox True + 93 0 Data 347:38-347:42 ExpBox False + 94 0 Data 347:37-347:43 ExpBox True + 95 0 Data 348:38-348:44 ExpBox False + 96 0 Data 348:37-348:45 ExpBox True + 97 0 Data 349:38-349:42 ExpBox False + 98 0 Data 349:44-349:48 ExpBox False + 99 0 Data 349:37-349:49 ExpBox True + 100 0 Data 350:38-350:42 ExpBox False + 101 0 Data 350:44-350:48 ExpBox False + 102 0 Data 350:37-350:49 ExpBox True + 103 0 Data 351:38-351:43 ExpBox False + 104 0 Data 351:45-351:50 ExpBox False + 105 0 Data 351:37-351:51 ExpBox True + 106 0 Data 352:38-352:43 ExpBox False + 107 0 Data 352:45-352:50 ExpBox False + 108 0 Data 352:37-352:51 ExpBox True + 109 0 Data 353:38-353:44 ExpBox False + 110 0 Data 353:46-353:50 ExpBox False + 111 0 Data 353:37-353:51 ExpBox True + 112 0 Data 354:45-354:52 ExpBox False + 113 0 Data 354:54-354:61 ExpBox False + 114 0 Data 354:44-354:62 ExpBox True + 115 0 Data 355:45-355:51 ExpBox False + 116 0 Data 355:53-355:59 ExpBox False + 117 0 Data 355:44-355:60 ExpBox True + 118 0 Data 356:45-356:50 ExpBox False + 119 0 Data 356:52-356:57 ExpBox False + 120 0 Data 356:59-356:64 ExpBox False + 121 0 Data 356:44-356:65 ExpBox True + 122 0 Data 357:45-357:52 ExpBox False + 123 0 Data 357:54-357:59 ExpBox False + 124 0 Data 357:44-357:60 ExpBox True + 125 0 Data 358:45-358:52 ExpBox False + 126 0 Data 358:54-358:59 ExpBox False + 127 0 Data 358:61-358:66 ExpBox False + 128 0 Data 358:68-358:73 ExpBox False + 129 0 Data 358:44-358:74 ExpBox True + 130 0 Data 359:45-359:51 ExpBox False + 131 0 Data 359:53-359:60 ExpBox False + 132 0 Data 359:44-359:61 ExpBox True + 133 0 Data 361:45-361:51 ExpBox False + 134 0 Data 361:53-361:59 ExpBox False + 135 0 Data 361:61-361:67 ExpBox False + 136 0 Data 361:69-361:74 ExpBox False + 137 0 Data 361:76-361:81 ExpBox False + 138 0 Data 361:44-361:82 ExpBox True + 139 0 Data 362:45-362:51 ExpBox False + 140 0 Data 363:45-363:51 ExpBox False + 141 0 Data 364:45-364:52 ExpBox False + 142 0 Data 365:45-365:49 ExpBox False + 143 0 Data 366:45-366:50 ExpBox False + 144 0 Data 367:45-367:50 ExpBox False + 145 0 Data 368:45-368:50 ExpBox False + 146 0 Data 369:45-369:52 ExpBox False + 147 0 Data 362:44-369:53 ExpBox True + 148 0 Data 342:1-369:53 TopLevelBox ["getPrimOpType"] + 149 0 Data 323:7-323:12 ExpBox False + 150 0 Data 323:17-323:22 ExpBox False + 151 0 Data 323:5-323:23 ExpBox False + 152 0 Data 324:7-324:11 ExpBox False + 153 0 Data 324:17-324:21 ExpBox False + 154 0 Data 324:5-324:22 ExpBox False + 155 0 Data 325:7-325:12 ExpBox False + 156 0 Data 325:17-325:22 ExpBox False + 157 0 Data 325:5-325:23 ExpBox False + 158 0 Data 326:7-326:14 ExpBox False + 159 0 Data 326:17-326:24 ExpBox False + 160 0 Data 326:5-326:25 ExpBox False + 161 0 Data 327:7-327:12 ExpBox False + 162 0 Data 327:17-327:22 ExpBox False + 163 0 Data 327:5-327:23 ExpBox False + 164 0 Data 328:7-328:13 ExpBox False + 165 0 Data 328:17-328:23 ExpBox False + 166 0 Data 328:5-328:24 ExpBox False + 167 0 Data 329:7-329:13 ExpBox False + 168 0 Data 329:17-329:23 ExpBox False + 169 0 Data 329:5-329:24 ExpBox False + 170 0 Data 330:7-330:14 ExpBox False + 171 0 Data 330:17-330:24 ExpBox False + 172 0 Data 330:5-330:25 ExpBox False + 173 0 Data 331:7-331:13 ExpBox False + 174 0 Data 331:17-331:23 ExpBox False + 175 0 Data 331:5-331:24 ExpBox False + 176 0 Data 332:7-332:13 ExpBox False + 177 0 Data 332:17-332:28 ExpBox False + 178 0 Data 332:5-332:29 ExpBox False + 179 0 Data 333:7-333:14 ExpBox False + 180 0 Data 333:17-333:23 ExpBox False + 181 0 Data 333:5-333:24 ExpBox False + 182 0 Data 323:3-334:3 ExpBox False + 183 0 Data 322:1-334:3 TopLevelBox ["typeTable"] + 184 0 Data 336:20-336:27 ExpBox False + 185 0 Data 336:29-336:36 ExpBox False + 186 0 Data 336:19-336:37 ExpBox False + 187 0 Data 336:39-336:47 ExpBox False + 188 0 Data 336:13-336:47 ExpBox False + 189 0 Data 336:1-336:47 TopLevelBox ["typeNames"] + 190 1 Data 213:5-213:11 ExpBox False + 191 1 Data 213:19-213:24 ExpBox False + 192 0 Data 213:47-213:70 ExpBox False + 193 0 Data 213:41-213:70 ExpBox False + 194 1 Data 213:4-213:71 ExpBox False + 195 1 Data 214:5-214:8 ExpBox False + 196 1 Data 214:19-214:21 ExpBox False + 197 0 Data 214:47-214:67 ExpBox False + 198 0 Data 214:41-214:67 ExpBox False + 199 1 Data 214:4-214:68 ExpBox False + 200 1 Data 215:5-215:11 ExpBox False + 201 0 Data 215:25-215:29 ExpBox False + 202 1 Data 215:19-215:29 ExpBox False + 203 0 Data 215:47-215:70 ExpBox False + 204 0 Data 215:41-215:70 ExpBox False + 205 1 Data 215:4-215:71 ExpBox False + 206 1 Data 216:5-216:10 ExpBox False + 207 0 Data 216:25-216:28 ExpBox False + 208 1 Data 216:19-216:28 ExpBox False + 209 0 Data 216:47-216:69 ExpBox False + 210 0 Data 216:41-216:69 ExpBox False + 211 1 Data 216:4-216:70 ExpBox False + 212 1 Data 213:2-217:2 ExpBox False + 213 49 Data 217:26-217:26 ExpBox False + 214 49 Data 217:32-217:32 ExpBox False + 215 49 Data 217:28-217:32 ExpBox False + 216 20 Data 217:34-217:34 ExpBox False + 217 49 Data 217:25-217:35 ExpBox False + 218 1 Data 217:11-217:36 ExpBox False + 219 1 Data 220:5-220:10 ExpBox False + 220 1 Data 220:19-220:25 ExpBox False + 221 0 Data 220:45-220:51 ExpBox False + 222 0 Data 220:55-220:58 ExpBox False + 223 0 Data 220:44-220:59 ExpBox False + 224 0 Data 220:34-220:59 ExpBox False + 225 1 Data 220:4-220:60 ExpBox False + 226 1 Data 221:5-221:10 ExpBox False + 227 1 Data 221:19-221:25 ExpBox False + 228 0 Data 221:46-221:48 ExpBox False + 229 0 Data 221:34-221:48 ExpBox False + 230 1 Data 221:4-221:49 ExpBox False + 231 1 Data 222:5-222:10 ExpBox False + 232 1 Data 222:19-222:25 ExpBox False + 233 1 Data 222:49-222:51 ExpBox False + 234 1 Data 222:34-222:51 ExpBox False + 235 1 Data 222:4-222:52 ExpBox False + 236 1 Data 223:5-223:10 ExpBox False + 237 1 Data 223:19-223:25 ExpBox False + 238 0 Data 223:45-223:51 ExpBox False + 239 0 Data 223:55-223:58 ExpBox False + 240 0 Data 223:44-223:59 ExpBox False + 241 0 Data 223:34-223:59 ExpBox False + 242 1 Data 223:4-223:60 ExpBox False + 243 1 Data 224:5-224:12 ExpBox False + 244 1 Data 224:19-224:27 ExpBox False + 245 0 Data 224:44-224:49 ExpBox False + 246 0 Data 224:34-224:49 ExpBox False + 247 1 Data 224:4-224:50 ExpBox False + 248 1 Data 225:5-225:10 ExpBox False + 249 1 Data 225:19-225:25 ExpBox False + 250 0 Data 225:46-225:49 ExpBox False + 251 0 Data 225:34-225:49 ExpBox False + 252 1 Data 225:4-225:50 ExpBox False + 253 1 Data 226:5-226:9 ExpBox False + 254 1 Data 226:19-226:24 ExpBox False + 255 0 Data 226:45-226:47 ExpBox False + 256 0 Data 226:51-226:57 ExpBox False + 257 0 Data 226:44-226:58 ExpBox False + 258 0 Data 226:34-226:58 ExpBox False + 259 1 Data 226:4-226:59 ExpBox False + 260 1 Data 227:5-227:10 ExpBox False + 261 1 Data 227:19-227:25 ExpBox False + 262 1 Data 227:46-227:49 ExpBox False + 263 1 Data 227:34-227:49 ExpBox False + 264 1 Data 227:4-227:50 ExpBox False + 265 1 Data 228:5-228:14 ExpBox False + 266 1 Data 228:19-228:29 ExpBox False + 267 0 Data 228:46-228:53 ExpBox False + 268 0 Data 228:34-228:53 ExpBox False + 269 1 Data 228:4-228:54 ExpBox False + 270 1 Data 229:5-229:16 ExpBox False + 271 1 Data 229:19-229:31 ExpBox False + 272 0 Data 229:46-229:55 ExpBox False + 273 0 Data 229:34-229:55 ExpBox False + 274 1 Data 229:4-229:56 ExpBox False + 275 1 Data 230:5-230:10 ExpBox False + 276 1 Data 230:19-230:25 ExpBox False + 277 0 Data 230:46-230:54 ExpBox False + 278 0 Data 230:34-230:54 ExpBox False + 279 1 Data 230:4-230:55 ExpBox False + 280 1 Data 231:5-231:10 ExpBox False + 281 1 Data 231:19-231:25 ExpBox False + 282 1 Data 231:49-231:51 ExpBox False + 283 1 Data 231:34-231:51 ExpBox False + 284 1 Data 231:4-231:52 ExpBox False + 285 1 Data 232:5-232:9 ExpBox False + 286 1 Data 232:19-232:24 ExpBox False + 287 1 Data 232:47-232:50 ExpBox False + 288 1 Data 232:34-232:50 ExpBox False + 289 1 Data 232:4-232:51 ExpBox False + 290 1 Data 233:5-233:9 ExpBox False + 291 1 Data 233:19-233:24 ExpBox False + 292 0 Data 233:49-233:52 ExpBox False + 293 0 Data 233:34-233:52 ExpBox False + 294 1 Data 233:4-233:53 ExpBox False + 295 1 Data 234:5-234:11 ExpBox False + 296 1 Data 234:19-234:26 ExpBox False + 297 1 Data 234:43-234:47 ExpBox False + 298 1 Data 234:34-234:47 ExpBox False + 299 1 Data 234:4-234:48 ExpBox False + 300 1 Data 235:5-235:10 ExpBox False + 301 1 Data 235:19-235:25 ExpBox False + 302 1 Data 235:45-235:47 ExpBox False + 303 1 Data 235:51-235:64 ExpBox False + 304 1 Data 235:44-235:65 ExpBox False + 305 1 Data 235:34-235:65 ExpBox False + 306 1 Data 235:4-235:66 ExpBox False + 307 1 Data 236:5-236:9 ExpBox False + 308 1 Data 236:19-236:24 ExpBox False + 309 1 Data 236:48-236:52 ExpBox False + 310 1 Data 236:34-236:52 ExpBox False + 311 1 Data 236:4-236:53 ExpBox False + 312 1 Data 237:5-237:10 ExpBox False + 313 1 Data 237:19-237:25 ExpBox False + 314 0 Data 237:57-237:57 ExpBox False + 315 0 Data 237:45-237:58 ExpBox False + 316 0 Data 237:34-237:58 ExpBox False + 317 1 Data 237:4-237:59 ExpBox False + 318 1 Data 238:5-238:10 ExpBox False + 319 1 Data 238:19-238:25 ExpBox False + 320 0 Data 238:57-238:57 ExpBox False + 321 0 Data 238:45-238:58 ExpBox False + 322 0 Data 238:34-238:58 ExpBox False + 323 1 Data 238:4-238:59 ExpBox False + 324 1 Data 239:5-239:10 ExpBox False + 325 1 Data 239:19-239:25 ExpBox False + 326 0 Data 239:57-239:57 ExpBox False + 327 0 Data 239:45-239:58 ExpBox False + 328 0 Data 239:34-239:58 ExpBox False + 329 1 Data 239:4-239:59 ExpBox False + 330 1 Data 240:5-240:15 ExpBox False + 331 1 Data 240:19-240:30 ExpBox False + 332 0 Data 240:46-240:54 ExpBox False + 333 0 Data 240:34-240:54 ExpBox False + 334 1 Data 240:4-240:55 ExpBox False + 335 1 Data 241:5-241:12 ExpBox False + 336 1 Data 241:19-241:27 ExpBox False + 337 0 Data 241:43-241:46 ExpBox False + 338 0 Data 241:50-241:52 ExpBox False + 339 0 Data 241:56-241:61 ExpBox False + 340 0 Data 241:50-241:61 ExpBox False + 341 0 Data 241:42-241:62 ExpBox False + 342 0 Data 241:34-241:62 ExpBox False + 343 1 Data 241:4-241:63 ExpBox False + 344 1 Data 242:5-242:11 ExpBox False + 345 1 Data 242:19-242:26 ExpBox False + 346 0 Data 242:47-242:49 ExpBox False + 347 0 Data 242:34-242:49 ExpBox False + 348 1 Data 242:4-242:50 ExpBox False + 349 1 Data 243:5-243:11 ExpBox False + 350 1 Data 243:19-243:26 ExpBox False + 351 1 Data 243:49-243:51 ExpBox False + 352 1 Data 243:34-243:51 ExpBox False + 353 1 Data 243:4-243:52 ExpBox False + 354 1 Data 244:5-244:11 ExpBox False + 355 1 Data 244:19-244:26 ExpBox False + 356 1 Data 244:52-244:56 ExpBox False + 357 1 Data 244:34-244:56 ExpBox False + 358 1 Data 244:4-244:57 ExpBox False + 359 1 Data 245:5-245:10 ExpBox False + 360 1 Data 245:19-245:25 ExpBox False + 361 1 Data 245:46-245:53 ExpBox False + 362 1 Data 245:34-245:53 ExpBox False + 363 1 Data 245:4-245:54 ExpBox False + 364 1 Data 246:5-246:10 ExpBox False + 365 1 Data 246:19-246:25 ExpBox False + 366 0 Data 246:46-246:48 ExpBox False + 367 0 Data 246:34-246:48 ExpBox False + 368 1 Data 246:4-246:49 ExpBox False + 369 1 Data 247:5-247:10 ExpBox False + 370 1 Data 247:19-247:25 ExpBox False + 371 1 Data 247:49-247:51 ExpBox False + 372 1 Data 247:34-247:51 ExpBox False + 373 1 Data 247:4-247:52 ExpBox False + 374 1 Data 248:5-248:10 ExpBox False + 375 1 Data 248:19-248:25 ExpBox False + 376 0 Data 248:42-248:47 ExpBox False + 377 0 Data 248:34-248:47 ExpBox False + 378 1 Data 248:4-248:48 ExpBox False + 379 1 Data 249:5-249:10 ExpBox False + 380 1 Data 249:19-249:25 ExpBox False + 381 0 Data 249:44-249:49 ExpBox False + 382 0 Data 249:34-249:49 ExpBox False + 383 1 Data 249:4-249:50 ExpBox False + 384 1 Data 250:5-250:11 ExpBox False + 385 1 Data 250:19-250:26 ExpBox False + 386 1 Data 250:46-250:50 ExpBox False + 387 1 Data 250:34-250:50 ExpBox False + 388 1 Data 250:4-250:51 ExpBox False + 389 1 Data 251:5-251:11 ExpBox False + 390 1 Data 251:19-251:26 ExpBox False + 391 1 Data 251:55-251:60 ExpBox False + 392 1 Data 251:34-251:60 ExpBox False + 393 1 Data 251:4-251:61 ExpBox False + 394 1 Data 252:5-252:16 ExpBox False + 395 1 Data 252:19-252:31 ExpBox False + 396 0 Data 252:52-252:61 ExpBox False + 397 0 Data 252:34-252:61 ExpBox False + 398 1 Data 252:4-252:62 ExpBox False + 399 1 Data 253:5-253:10 ExpBox False + 400 1 Data 253:19-253:25 ExpBox False + 401 1 Data 253:43-253:54 ExpBox False + 402 1 Data 253:34-253:54 ExpBox False + 403 1 Data 253:4-253:55 ExpBox False + 404 1 Data 254:5-254:12 ExpBox False + 405 1 Data 254:19-254:27 ExpBox False + 406 1 Data 254:34-254:39 ExpBox False + 407 1 Data 254:50-254:52 ExpBox False + 408 1 Data 254:43-254:52 ExpBox False + 409 1 Data 254:34-254:52 ExpBox False + 410 1 Data 254:4-254:53 ExpBox False + 411 1 Data 255:5-255:13 ExpBox False + 412 1 Data 255:19-255:28 ExpBox False + 413 1 Data 255:74-255:74 ExpBox False + 414 1 Data 255:65-255:75 ExpBox False + 415 1 Data 255:77-255:77 ExpBox False + 416 1 Data 255:57-255:77 ExpBox False + 417 1 Data 255:47-255:78 ExpBox False + 418 1 Data 255:34-255:78 ExpBox False + 419 1 Data 255:4-255:79 ExpBox False + 420 1 Data 256:5-256:13 ExpBox False + 421 1 Data 256:19-256:28 ExpBox False + 422 1 Data 256:74-256:74 ExpBox False + 423 1 Data 256:65-256:75 ExpBox False + 424 1 Data 256:77-256:77 ExpBox False + 425 1 Data 256:57-256:77 ExpBox False + 426 1 Data 256:47-256:78 ExpBox False + 427 1 Data 256:34-256:78 ExpBox False + 428 1 Data 256:4-256:79 ExpBox False + 429 1 Data 257:5-257:13 ExpBox False + 430 1 Data 257:19-257:28 ExpBox False + 431 0 Data 257:74-257:74 ExpBox False + 432 0 Data 257:65-257:75 ExpBox False + 433 0 Data 257:77-257:77 ExpBox False + 434 0 Data 257:57-257:77 ExpBox False + 435 0 Data 257:47-257:78 ExpBox False + 436 0 Data 257:34-257:78 ExpBox False + 437 1 Data 257:4-257:79 ExpBox False + 438 1 Data 258:5-258:11 ExpBox False + 439 1 Data 258:19-258:26 ExpBox False + 440 0 Data 258:78-258:78 ExpBox False + 441 0 Data 258:80-258:80 ExpBox False + 442 0 Data 258:82-258:82 ExpBox False + 443 0 Data 258:77-258:83 ExpBox False + 444 0 Data 258:85-258:85 ExpBox False + 445 0 Data 258:71-258:85 ExpBox False + 446 0 Data 258:57-258:86 ExpBox False + 447 0 Data 258:34-258:86 ExpBox False + 448 1 Data 258:4-258:87 ExpBox False + 449 1 Data 259:5-259:9 ExpBox False + 450 1 Data 259:19-259:24 ExpBox False + 451 0 Data 259:45-259:47 ExpBox False + 452 0 Data 259:51-259:57 ExpBox False + 453 0 Data 259:44-259:58 ExpBox False + 454 0 Data 259:34-259:58 ExpBox False + 455 1 Data 259:4-259:59 ExpBox False + 456 1 Data 260:5-260:12 ExpBox False + 457 1 Data 260:19-260:27 ExpBox False + 458 0 Data 260:46-260:52 ExpBox False + 459 0 Data 260:34-260:52 ExpBox False + 460 1 Data 260:4-260:53 ExpBox False + 461 1 Data 261:5-261:15 ExpBox False + 462 1 Data 261:19-261:30 ExpBox False + 463 0 Data 261:68-261:78 ExpBox False + 464 0 Data 261:34-261:78 ExpBox False + 465 1 Data 261:4-261:79 ExpBox False + 466 1 Data 262:5-262:10 ExpBox False + 467 1 Data 262:19-262:25 ExpBox False + 468 0 Data 262:44-262:50 ExpBox False + 469 0 Data 262:34-262:50 ExpBox False + 470 1 Data 262:4-262:51 ExpBox False + 471 1 Data 263:5-263:10 ExpBox False + 472 1 Data 263:19-263:25 ExpBox False + 473 0 Data 263:46-263:48 ExpBox False + 474 0 Data 263:34-263:48 ExpBox False + 475 1 Data 263:4-263:49 ExpBox False + 476 1 Data 264:5-264:10 ExpBox False + 477 1 Data 264:19-264:25 ExpBox False + 478 0 Data 264:49-264:51 ExpBox False + 479 0 Data 264:34-264:51 ExpBox False + 480 1 Data 264:4-264:52 ExpBox False + 481 1 Data 265:5-265:11 ExpBox False + 482 1 Data 265:19-265:26 ExpBox False + 483 0 Data 265:53-265:59 ExpBox False + 484 0 Data 265:34-265:59 ExpBox False + 485 1 Data 265:4-265:60 ExpBox False + 486 1 Data 266:5-266:15 ExpBox False + 487 1 Data 266:19-266:30 ExpBox False + 488 3 Data 266:82-266:82 ExpBox False + 489 3 Data 266:84-266:84 ExpBox False + 490 3 Data 266:86-266:86 ExpBox False + 491 3 Data 266:81-266:87 ExpBox False + 492 3 Data 266:89-266:89 ExpBox False + 493 3 Data 266:71-266:89 ExpBox False + 494 1 Data 266:57-266:90 ExpBox False + 495 1 Data 266:34-266:90 ExpBox False + 496 1 Data 266:4-266:91 ExpBox False + 497 1 Data 267:5-267:11 ExpBox False + 498 1 Data 267:19-267:26 ExpBox False + 499 1 Data 267:46-267:50 ExpBox False + 500 1 Data 267:34-267:50 ExpBox False + 501 1 Data 267:4-267:51 ExpBox False + 502 1 Data 268:5-268:12 ExpBox False + 503 1 Data 268:19-268:27 ExpBox False + 504 1 Data 268:64-268:64 ExpBox False + 505 1 Data 268:66-268:66 ExpBox False + 506 1 Data 268:57-268:66 ExpBox False + 507 1 Data 268:47-268:67 ExpBox False + 508 1 Data 268:34-268:67 ExpBox False + 509 1 Data 268:4-268:68 ExpBox False + 510 1 Data 220:2-269:2 ExpBox False + 511 1 Data 217:7-269:2 ExpBox False + 512 1 Data 213:2-269:2 ExpBox False + 513 1 Data 212:1-269:2 TopLevelBox ["opcodes"] + 514 0 Data 206:15-206:55 ExpBox False + 515 0 Data 206:9-206:55 ExpBox False + 516 0 Data 206:1-206:55 TopLevelBox ["image"] + 517 0 Data 205:15-205:34 ExpBox False + 518 0 Data 205:9-205:34 ExpBox False + 519 0 Data 205:1-205:34 TopLevelBox ["undef"] + 520 0 Data 202:22-202:29 ExpBox False + 521 0 Data 202:31-202:38 ExpBox False + 522 0 Data 202:21-202:39 ExpBox False + 523 0 Data 203:52-203:58 ExpBox False + 524 0 Data 203:22-203:23 ExpBox False + 525 0 Data 203:25-203:28 ExpBox False + 526 0 Data 203:21-203:29 ExpBox False + 527 0 Data 203:19-203:60 ExpBox False + 528 0 Data 202:15-203:60 ExpBox False + 529 0 Data 202:1-203:60 TopLevelBox ["opNameTable"] + 530 1 Data 199:38-199:44 ExpBox False + 531 53 Data 199:14-199:16 ExpBox False + 532 22 Data 199:18-199:19 ExpBox False + 533 53 Data 199:13-199:20 ExpBox False + 534 1 Data 199:11-199:46 ExpBox False + 535 1 Data 199:1-199:46 TopLevelBox ["opTable"] + 536 0 Data 195:33-195:39 ExpBox False + 537 0 Data 195:14-195:16 ExpBox False + 538 0 Data 195:12-195:41 ExpBox False + 539 0 Data 195:1-195:41 TopLevelBox ["keyWords"] + 540 711560 Data 123:30-123:30 ExpBox False + 541 711560 Data 123:32-123:32 ExpBox False + 542 711560 Data 123:23-123:32 ExpBox False + 543 711560 Data 123:1-123:32 TopLevelBox ["lookupEnv"] + 544 441868 Data 120:31-120:31 ExpBox False + 545 409350 Data 120:34-120:34 ExpBox False + 546 441868 Data 120:30-120:35 ExpBox False + 547 371112 Data 120:37-120:37 ExpBox False + 548 441868 Data 120:29-120:38 ExpBox False + 549 441868 Data 120:25-120:38 ExpBox False + 550 441868 Data 120:1-120:38 TopLevelBox ["extendEnv"] + 551 0 Data 117:16-117:17 ExpBox False + 552 0 Data 117:12-117:17 ExpBox False + 553 0 Data 117:1-117:17 TopLevelBox ["emptyEnv"] + 554 0 Data 97:34-97:34 ExpBox False + 555 0 Data 97:29-97:34 ExpBox False + 556 0 Data 97:39-97:48 ExpBox False + 557 0 Data 97:29-97:48 ExpBox True + 558 0 Data 98:34-98:34 ExpBox False + 559 0 Data 98:29-98:34 ExpBox False + 560 0 Data 98:39-98:47 ExpBox False + 561 0 Data 98:29-98:47 ExpBox True + 562 0 Data 99:34-99:34 ExpBox False + 563 0 Data 99:29-99:34 ExpBox False + 564 0 Data 99:39-99:48 ExpBox False + 565 0 Data 99:29-99:48 ExpBox True + 566 0 Data 100:34-100:34 ExpBox False + 567 0 Data 100:29-100:34 ExpBox False + 568 0 Data 100:39-100:50 ExpBox False + 569 0 Data 100:29-100:50 ExpBox True + 570 0 Data 101:29-101:50 ExpBox True + 571 0 Data 103:8-103:17 ExpBox False + 572 0 Data 103:47-103:49 ExpBox False + 573 0 Data 103:39-103:50 ExpBox False + 574 0 Data 103:34-103:51 ExpBox False + 575 0 Data 103:28-103:52 ExpBox False + 576 0 Data 103:23-103:52 ExpBox False + 577 0 Data 103:57-103:78 ExpBox False + 578 0 Data 103:23-103:78 ExpBox False + 579 0 Data 103:8-103:78 ExpBox True + 580 0 Data 104:29-104:31 ExpBox False + 581 0 Data 104:41-104:41 ExpBox False + 582 0 Data 104:36-104:41 ExpBox False + 583 0 Data 105:29-105:31 ExpBox False + 584 0 Data 105:41-105:41 ExpBox False + 585 0 Data 105:36-105:41 ExpBox False + 586 0 Data 106:29-106:31 ExpBox False + 587 0 Data 106:41-106:41 ExpBox False + 588 0 Data 106:36-106:41 ExpBox False + 589 0 Data 107:29-107:40 ExpBox False + 590 0 Data 106:36-107:40 ExpBox False + 591 0 Data 106:29-107:40 ExpBox False + 592 0 Data 105:36-107:40 ExpBox False + 593 0 Data 105:29-107:40 ExpBox False + 594 0 Data 104:36-107:40 ExpBox False + 595 0 Data 104:29-107:40 ExpBox True + 596 0 Data 108:29-108:48 ExpBox True + 597 0 Data 109:29-109:47 ExpBox True + 598 0 Data 110:29-110:33 ExpBox False + 599 0 Data 110:43-110:46 ExpBox False + 600 0 Data 110:38-110:46 ExpBox False + 601 0 Data 110:51-110:64 ExpBox False + 602 0 Data 110:38-110:64 ExpBox False + 603 0 Data 110:29-110:64 ExpBox True + 604 0 Data 97:1-110:64 TopLevelBox ["showStkEle"] + 605 0 Data 91:17-91:20 TopLevelBox ["showsPrec"] + 606 0 Data 91:17-91:20 TopLevelBox ["showList"] + 607 0 Data 180:15-180:16 TopLevelBox ["=="] + 608 0 Data 180:15-180:16 TopLevelBox ["/="] + 609 0 Data 180:18-180:20 TopLevelBox ["compare"] + 610 0 Data 180:18-180:20 TopLevelBox ["<"] + 611 0 Data 180:18-180:20 TopLevelBox [">="] + 612 0 Data 180:18-180:20 TopLevelBox [">"] + 613 0 Data 180:18-180:20 TopLevelBox ["<="] + 614 0 Data 180:22-180:23 TopLevelBox ["range"] + 615 746155 Data 180:22-180:23 TopLevelBox ["unsafeIndex"] + 616 746155 Data 180:22-180:23 TopLevelBox ["inRange"] + 617 1 Data 180:25-180:31 TopLevelBox ["minBound"] + 618 1 Data 180:25-180:31 TopLevelBox ["maxBound"] + 619 0 Data 114:47-114:50 TopLevelBox ["showsPrec"] + 620 0 Data 114:47-114:50 TopLevelBox ["showList"] + 621 0 Data 320:17-320:18 TopLevelBox ["=="] + 622 0 Data 320:17-320:18 TopLevelBox ["/="] + 623 0 Data 320:20-320:22 TopLevelBox ["compare"] + 624 0 Data 320:20-320:22 TopLevelBox ["<"] + 625 0 Data 320:20-320:22 TopLevelBox [">="] + 626 0 Data 320:20-320:22 TopLevelBox [">"] + 627 0 Data 320:20-320:22 TopLevelBox ["<="] + 628 0 Data 320:24-320:25 TopLevelBox ["range"] + 629 0 Data 320:24-320:25 TopLevelBox ["unsafeIndex"] + 630 0 Data 320:24-320:25 TopLevelBox ["inRange"] + 631 0 Data 320:27-320:33 TopLevelBox ["minBound"] + 632 0 Data 320:27-320:33 TopLevelBox ["maxBound"] + 633 0 Data 339:33-339:41 ExpBox False + 634 0 Data 339:45-339:46 ExpBox False + 635 0 Data 339:32-339:47 ExpBox False + 636 0 Data 339:21-339:47 ExpBox False + 637 0 Data 339:4-339:47 TopLevelBox ["showsPrec"] + 638 0 Data 183:33-183:43 ExpBox False + 639 0 Data 183:47-183:48 ExpBox False + 640 0 Data 183:32-183:49 ExpBox False + 641 0 Data 183:21-183:49 ExpBox False + 642 0 Data 183:4-183:49 TopLevelBox ["showsPrec"] + 643 0 Data 94:47-94:51 ExpBox False + 644 0 Data 94:35-94:52 ExpBox False + 645 0 Data 94:24-94:52 ExpBox False + 646 0 Data 94:4-94:52 TopLevelBox ["showsPrec"] + 647 0 Data 42:37-42:38 ExpBox False + 648 0 Data 42:31-42:38 ExpBox True + 649 0 Data 43:42-43:43 ExpBox False + 650 0 Data 43:31-43:43 ExpBox True + 651 0 Data 44:43-44:45 ExpBox False + 652 0 Data 44:49-44:50 ExpBox False + 653 0 Data 44:42-44:51 ExpBox False + 654 0 Data 44:31-44:51 ExpBox True + 655 0 Data 45:37-45:40 ExpBox False + 656 0 Data 45:31-45:40 ExpBox True + 657 0 Data 46:37-46:37 ExpBox False + 658 0 Data 46:31-46:37 ExpBox True + 659 0 Data 47:37-47:37 ExpBox False + 660 0 Data 47:31-47:37 ExpBox True + 661 0 Data 48:37-48:37 ExpBox False + 662 0 Data 48:31-48:37 ExpBox True + 663 0 Data 49:37-49:40 ExpBox False + 664 0 Data 49:31-49:40 ExpBox True + 665 0 Data 50:43-50:46 ExpBox False + 666 0 Data 50:32-50:46 ExpBox False + 667 0 Data 51:47-51:47 ExpBox False + 668 0 Data 51:60-51:62 ExpBox False + 669 0 Data 51:51-51:62 ExpBox False + 670 0 Data 51:66-51:66 ExpBox False + 671 0 Data 51:51-51:66 ExpBox False + 672 0 Data 51:47-51:66 ExpBox False + 673 0 Data 51:37-51:67 ExpBox False + 674 0 Data 51:69-51:70 ExpBox False + 675 0 Data 51:77-51:81 ExpBox False + 676 0 Data 51:83-51:86 ExpBox False + 677 0 Data 51:72-51:87 ExpBox False + 678 0 Data 51:31-51:87 ExpBox False + 679 0 Data 52:42-52:44 ExpBox False + 680 0 Data 52:31-52:44 ExpBox False + 681 0 Data 51:31-52:44 ExpBox False + 682 0 Data 50:32-52:44 ExpBox True + 683 0 Data 53:42-53:48 ExpBox False + 684 0 Data 53:31-53:48 ExpBox True + 685 0 Data 54:42-54:45 ExpBox False + 686 0 Data 54:31-54:45 ExpBox True + 687 0 Data 42:4-54:45 TopLevelBox ["showsPrec"] + 688 0 Data 56:32-56:35 ExpBox False + 689 0 Data 56:21-56:35 ExpBox False + 690 0 Data 57:37-57:37 ExpBox False + 691 0 Data 57:50-57:52 ExpBox False + 692 0 Data 57:41-57:52 ExpBox False + 693 0 Data 57:56-57:56 ExpBox False + 694 0 Data 57:41-57:56 ExpBox False + 695 0 Data 57:37-57:56 ExpBox False + 696 0 Data 57:27-57:57 ExpBox False + 697 0 Data 57:59-57:60 ExpBox False + 698 0 Data 57:67-57:71 ExpBox False + 699 0 Data 57:73-57:76 ExpBox False + 700 0 Data 57:62-57:77 ExpBox False + 701 0 Data 57:21-57:77 ExpBox False + 702 0 Data 58:32-58:34 ExpBox False + 703 0 Data 58:21-58:34 ExpBox False + 704 0 Data 57:21-58:34 ExpBox False + 705 0 Data 56:21-58:34 ExpBox False + 706 0 Data 56:4-58:34 TopLevelBox ["showList"] + 0 180000 Geometry 311:12-311:12 ExpBox False + 1 180000 Geometry 311:16-311:16 ExpBox False + 2 180000 Geometry 311:12-311:16 ExpBox False + 3 0 Geometry 311:12-311:16 BinBox GuardBinBox True + 4 180000 Geometry 311:12-311:16 BinBox GuardBinBox False + 5 0 Geometry 311:20-311:20 ExpBox True + 6 180000 Geometry 312:12-312:12 ExpBox False + 7 180000 Geometry 312:16-312:16 ExpBox False + 8 180000 Geometry 312:12-312:16 ExpBox False + 9 4582 Geometry 312:12-312:16 BinBox GuardBinBox True + 10 175418 Geometry 312:12-312:16 BinBox GuardBinBox False + 11 4582 Geometry 312:20-312:20 ExpBox True + 12 175418 Geometry 313:12-313:15 ExpBox False + 13 175418 Geometry 313:12-313:15 BinBox GuardBinBox True + 14 0 Geometry 313:12-313:15 BinBox GuardBinBox False + 15 175418 Geometry 313:20-313:20 ExpBox True + 16 180000 Geometry 311:1-313:20 TopLevelBox ["clampf"] + 17 1 Geometry 299:7-299:12 ExpBox False + 18 1 Geometry 299:1-299:12 TopLevelBox ["inf"] + 19 1 Geometry 298:11-298:17 ExpBox False + 20 1 Geometry 298:1-298:17 TopLevelBox ["epsilon"] + 21 3 Geometry 302:13-302:13 ExpBox False + 22 3 Geometry 302:17-302:23 ExpBox False + 23 3 Geometry 302:13-302:23 ExpBox False + 24 3 Geometry 302:13-302:23 BinBox GuardBinBox True + 25 0 Geometry 302:13-302:23 BinBox GuardBinBox False + 26 3 Geometry 302:28-302:28 ExpBox True + 27 0 Geometry 303:13-303:13 ExpBox False + 28 0 Geometry 303:18-303:24 ExpBox False + 29 0 Geometry 303:17-303:24 ExpBox False + 30 0 Geometry 303:13-303:24 ExpBox False + 31 0 Geometry 303:13-303:24 BinBox GuardBinBox True + 32 0 Geometry 303:13-303:24 BinBox GuardBinBox False + 33 0 Geometry 303:28-303:28 ExpBox True + 34 0 Geometry 304:13-304:21 ExpBox False + 35 0 Geometry 304:13-304:21 BinBox GuardBinBox True + 36 0 Geometry 304:13-304:21 BinBox GuardBinBox False + 37 0 Geometry 304:28-304:34 ExpBox True + 38 3 Geometry 302:1-304:34 TopLevelBox ["nonZero"] + 39 376778 Geometry 307:18-307:18 ExpBox False + 40 376778 Geometry 307:20-307:20 ExpBox False + 41 376778 Geometry 307:17-307:21 ExpBox False + 42 376778 Geometry 307:13-307:21 ExpBox False + 43 376778 Geometry 307:25-307:31 ExpBox False + 44 376778 Geometry 307:13-307:31 ExpBox False + 45 376778 Geometry 307:1-307:31 TopLevelBox ["eqEps"] + 46 1 Geometry 308:8-308:12 ExpBox False + 47 1 Geometry 308:1-308:12 TopLevelBox ["near"] + 48 32512 Geometry 290:29-290:29 ExpBox False + 49 32512 Geometry 290:38-290:38 ExpBox False + 50 32512 Geometry 290:29-290:38 ExpBox False + 51 5785 Geometry 290:43-290:43 ExpBox False + 52 5785 Geometry 290:52-290:52 ExpBox False + 53 5785 Geometry 290:43-290:52 ExpBox False + 54 5785 Geometry 290:57-290:57 ExpBox False + 55 5785 Geometry 290:66-290:66 ExpBox False + 56 5785 Geometry 290:57-290:66 ExpBox False + 57 5785 Geometry 290:43-290:66 ExpBox False + 58 32512 Geometry 290:29-290:66 ExpBox False + 59 32512 Geometry 290:1-290:66 TopLevelBox ["nearC"] + 60 183672 Geometry 287:31-287:31 ExpBox False + 61 183672 Geometry 287:33-287:33 ExpBox False + 62 183672 Geometry 287:30-287:34 ExpBox False + 63 183672 Geometry 287:37-287:37 ExpBox False + 64 183672 Geometry 287:39-287:39 ExpBox False + 65 183672 Geometry 287:36-287:40 ExpBox False + 66 183672 Geometry 287:43-287:43 ExpBox False + 67 183672 Geometry 287:45-287:45 ExpBox False + 68 183672 Geometry 287:42-287:46 ExpBox False + 69 183672 Geometry 287:28-287:46 ExpBox False + 70 183672 Geometry 287:1-287:46 TopLevelBox ["multSC"] + 71 112863 Geometry 284:33-284:33 ExpBox False + 72 112863 Geometry 284:35-284:35 ExpBox False + 73 112863 Geometry 284:32-284:36 ExpBox False + 74 112863 Geometry 284:39-284:39 ExpBox False + 75 112863 Geometry 284:41-284:41 ExpBox False + 76 112863 Geometry 284:38-284:42 ExpBox False + 77 112863 Geometry 284:45-284:45 ExpBox False + 78 112863 Geometry 284:47-284:47 ExpBox False + 79 112863 Geometry 284:44-284:48 ExpBox False + 80 112863 Geometry 284:30-284:48 ExpBox False + 81 112863 Geometry 284:1-284:48 TopLevelBox ["multCC"] + 82 0 Geometry 278:32-278:32 ExpBox False + 83 0 Geometry 278:34-278:34 ExpBox False + 84 0 Geometry 278:31-278:35 ExpBox False + 85 0 Geometry 278:38-278:38 ExpBox False + 86 0 Geometry 278:40-278:40 ExpBox False + 87 0 Geometry 278:37-278:41 ExpBox False + 88 0 Geometry 278:44-278:44 ExpBox False + 89 0 Geometry 278:46-278:46 ExpBox False + 90 0 Geometry 278:43-278:47 ExpBox False + 91 0 Geometry 278:29-278:47 ExpBox False + 92 0 Geometry 278:1-278:47 TopLevelBox ["subCC"] + 93 151160 Geometry 275:32-275:32 ExpBox False + 94 151160 Geometry 275:34-275:34 ExpBox False + 95 151160 Geometry 275:31-275:35 ExpBox False + 96 151160 Geometry 275:38-275:38 ExpBox False + 97 151160 Geometry 275:40-275:40 ExpBox False + 98 151160 Geometry 275:37-275:41 ExpBox False + 99 151160 Geometry 275:44-275:44 ExpBox False + 100 151160 Geometry 275:46-275:46 ExpBox False + 101 151160 Geometry 275:43-275:47 ExpBox False + 102 151160 Geometry 275:29-275:47 ExpBox False + 103 151160 Geometry 275:1-275:47 TopLevelBox ["addCC"] + 104 1 Geometry 272:11-272:11 ExpBox False + 105 1 Geometry 272:13-272:13 ExpBox False + 106 1 Geometry 272:15-272:15 ExpBox False + 107 1 Geometry 272:9-272:15 ExpBox False + 108 1 Geometry 272:1-272:15 TopLevelBox ["black"] + 109 1 Geometry 281:15-281:19 ExpBox False + 110 1 Geometry 281:21-281:25 ExpBox False + 111 1 Geometry 281:9-281:25 ExpBox False + 112 1 Geometry 281:1-281:25 TopLevelBox ["sumCC"] + 113 0 Geometry 270:11-270:11 ExpBox False + 114 0 Geometry 270:13-270:13 ExpBox False + 115 0 Geometry 270:15-270:15 ExpBox False + 116 0 Geometry 270:9-270:15 ExpBox False + 117 0 Geometry 270:1-270:15 TopLevelBox ["white"] + 118 12 Geometry 239:47-239:49 ExpBox False + 119 12 Geometry 239:52-239:54 ExpBox False + 120 12 Geometry 239:57-239:59 ExpBox False + 121 12 Geometry 239:62-239:64 ExpBox False + 122 12 Geometry 239:44-239:65 ExpBox False + 123 12 Geometry 240:47-240:49 ExpBox False + 124 12 Geometry 240:52-240:54 ExpBox False + 125 12 Geometry 240:57-240:59 ExpBox False + 126 12 Geometry 240:62-240:64 ExpBox False + 127 12 Geometry 240:44-240:65 ExpBox False + 128 12 Geometry 241:47-241:49 ExpBox False + 129 12 Geometry 241:52-241:54 ExpBox False + 130 12 Geometry 241:57-241:59 ExpBox False + 131 12 Geometry 241:62-241:64 ExpBox False + 132 12 Geometry 241:44-241:65 ExpBox False + 133 12 Geometry 242:47-242:49 ExpBox False + 134 12 Geometry 242:52-242:54 ExpBox False + 135 12 Geometry 242:57-242:59 ExpBox False + 136 12 Geometry 242:62-242:64 ExpBox False + 137 12 Geometry 242:44-242:65 ExpBox False + 138 12 Geometry 239:41-242:66 ExpBox False + 139 12 Geometry 236:1-242:66 TopLevelBox ["transposeM"] + 140 229838 Geometry 222:25-222:25 ExpBox False + 141 229838 Geometry 222:27-222:27 ExpBox False + 142 229838 Geometry 222:24-222:28 ExpBox False + 143 229838 Geometry 222:31-222:31 ExpBox False + 144 229838 Geometry 222:33-222:33 ExpBox False + 145 229838 Geometry 222:30-222:34 ExpBox False + 146 229838 Geometry 222:37-222:37 ExpBox False + 147 229838 Geometry 222:39-222:39 ExpBox False + 148 229838 Geometry 222:36-222:40 ExpBox False + 149 229838 Geometry 222:22-222:40 ExpBox False + 150 229838 Geometry 222:1-222:40 TopLevelBox ["multSV"] + 151 419283 Geometry 210:8-210:8 ExpBox False + 152 419283 Geometry 210:12-210:12 ExpBox False + 153 419283 Geometry 210:8-210:12 ExpBox False + 154 419283 Geometry 210:1-210:12 TopLevelBox ["sq"] + 155 0 Geometry 214:28-214:28 ExpBox False + 156 0 Geometry 214:25-214:28 ExpBox False + 157 0 Geometry 214:35-214:35 ExpBox False + 158 0 Geometry 214:32-214:35 ExpBox False + 159 0 Geometry 214:25-214:35 ExpBox False + 160 0 Geometry 214:42-214:42 ExpBox False + 161 0 Geometry 214:39-214:42 ExpBox False + 162 0 Geometry 214:25-214:42 ExpBox False + 163 0 Geometry 214:1-214:42 TopLevelBox ["distFrom0Sq"] + 164 0 Geometry 218:33-218:33 ExpBox False + 165 0 Geometry 218:20-218:34 ExpBox False + 166 0 Geometry 218:15-218:34 ExpBox False + 167 0 Geometry 218:1-218:34 TopLevelBox ["distFrom0"] + 168 139761 Geometry 200:27-200:27 ExpBox False + 169 139761 Geometry 200:24-200:27 ExpBox False + 170 139761 Geometry 200:34-200:34 ExpBox False + 171 139761 Geometry 200:31-200:34 ExpBox False + 172 139761 Geometry 200:24-200:34 ExpBox False + 173 139761 Geometry 200:41-200:41 ExpBox False + 174 139761 Geometry 200:38-200:41 ExpBox False + 175 139761 Geometry 200:23-200:42 ExpBox False + 176 139761 Geometry 200:18-200:42 ExpBox False + 177 139761 Geometry 200:11-200:42 LocalBox ["normalize","norm"] + 178 139761 Geometry 198:16-198:19 ExpBox False + 179 139761 Geometry 198:24-198:24 ExpBox False + 180 139761 Geometry 198:16-198:24 ExpBox False + 181 139761 Geometry 198:16-198:24 BinBox GuardBinBox True + 182 0 Geometry 198:16-198:24 BinBox GuardBinBox False + 183 139761 Geometry 198:36-198:36 ExpBox False + 184 139761 Geometry 198:38-198:41 ExpBox False + 185 139761 Geometry 198:35-198:42 ExpBox False + 186 139761 Geometry 198:44-198:44 ExpBox False + 187 139761 Geometry 198:28-198:44 ExpBox True + 188 0 Geometry 199:16-199:24 ExpBox False + 189 0 Geometry 199:16-199:24 BinBox GuardBinBox True + 190 0 Geometry 199:16-199:24 BinBox GuardBinBox False + 191 0 Geometry 199:34-199:51 ExpBox False + 192 0 Geometry 199:28-199:51 ExpBox True + 193 139761 Geometry 197:1-200:42 TopLevelBox ["normalize"] + 194 0 Geometry 192:27-192:27 ExpBox False + 195 0 Geometry 192:24-192:27 ExpBox False + 196 0 Geometry 192:34-192:34 ExpBox False + 197 0 Geometry 192:31-192:34 ExpBox False + 198 0 Geometry 192:24-192:34 ExpBox False + 199 0 Geometry 192:41-192:41 ExpBox False + 200 0 Geometry 192:38-192:41 ExpBox False + 201 0 Geometry 192:23-192:42 ExpBox False + 202 0 Geometry 192:18-192:42 ExpBox False + 203 0 Geometry 192:1-192:42 TopLevelBox ["norm"] + 204 0 Geometry 188:10-188:11 ExpBox False + 205 0 Geometry 188:15-188:16 ExpBox False + 206 0 Geometry 188:9-188:17 ExpBox False + 207 0 Geometry 188:20-188:21 ExpBox False + 208 0 Geometry 188:25-188:26 ExpBox False + 209 0 Geometry 188:19-188:27 ExpBox False + 210 0 Geometry 188:30-188:31 ExpBox False + 211 0 Geometry 188:35-188:36 ExpBox False + 212 0 Geometry 188:29-188:37 ExpBox False + 213 0 Geometry 188:7-188:37 ExpBox False + 214 0 Geometry 187:1-188:37 TopLevelBox ["subPP"] + 215 0 Geometry 206:26-206:27 ExpBox False + 216 0 Geometry 206:29-206:30 ExpBox False + 217 0 Geometry 206:20-206:30 ExpBox False + 218 0 Geometry 204:18-204:18 ExpBox False + 219 0 Geometry 204:15-204:18 ExpBox False + 220 0 Geometry 204:25-204:25 ExpBox False + 221 0 Geometry 204:22-204:25 ExpBox False + 222 0 Geometry 204:15-204:25 ExpBox False + 223 0 Geometry 204:32-204:32 ExpBox False + 224 0 Geometry 204:29-204:32 ExpBox False + 225 0 Geometry 204:15-204:32 ExpBox False + 226 0 Geometry 204:1-206:30 TopLevelBox ["dist2"] + 227 0 Geometry 184:11-184:12 ExpBox False + 228 0 Geometry 184:9-184:13 ExpBox False + 229 0 Geometry 184:17-184:18 ExpBox False + 230 0 Geometry 184:15-184:19 ExpBox False + 231 0 Geometry 184:23-184:24 ExpBox False + 232 0 Geometry 184:21-184:25 ExpBox False + 233 0 Geometry 184:7-184:25 ExpBox False + 234 0 Geometry 183:1-184:25 TopLevelBox ["negV"] + 235 53539 Geometry 180:10-180:11 ExpBox False + 236 53539 Geometry 180:15-180:16 ExpBox False + 237 53539 Geometry 180:9-180:17 ExpBox False + 238 53539 Geometry 180:20-180:21 ExpBox False + 239 53539 Geometry 180:25-180:26 ExpBox False + 240 53539 Geometry 180:19-180:27 ExpBox False + 241 53539 Geometry 180:30-180:31 ExpBox False + 242 53539 Geometry 180:35-180:36 ExpBox False + 243 53539 Geometry 180:29-180:37 ExpBox False + 244 53539 Geometry 180:7-180:37 ExpBox False + 245 53539 Geometry 179:1-180:37 TopLevelBox ["subVV"] + 246 63350 Geometry 176:10-176:11 ExpBox False + 247 63350 Geometry 176:15-176:16 ExpBox False + 248 63350 Geometry 176:9-176:17 ExpBox False + 249 63350 Geometry 176:20-176:21 ExpBox False + 250 63350 Geometry 176:25-176:26 ExpBox False + 251 63350 Geometry 176:19-176:27 ExpBox False + 252 63350 Geometry 176:30-176:31 ExpBox False + 253 63350 Geometry 176:35-176:36 ExpBox False + 254 63350 Geometry 176:29-176:37 ExpBox False + 255 63350 Geometry 176:7-176:37 ExpBox False + 256 63350 Geometry 175:1-176:37 TopLevelBox ["addPV"] + 257 34539 Geometry 293:25-293:25 ExpBox False + 258 34539 Geometry 293:36-293:36 ExpBox False + 259 34539 Geometry 293:47-293:47 ExpBox False + 260 34539 Geometry 293:35-293:48 ExpBox False + 261 34539 Geometry 293:25-293:48 ExpBox False + 262 34539 Geometry 293:1-293:48 TopLevelBox ["offsetToPoint"] + 263 0 Geometry 172:10-172:11 ExpBox False + 264 0 Geometry 172:15-172:16 ExpBox False + 265 0 Geometry 172:9-172:17 ExpBox False + 266 0 Geometry 172:20-172:21 ExpBox False + 267 0 Geometry 172:25-172:26 ExpBox False + 268 0 Geometry 172:19-172:27 ExpBox False + 269 0 Geometry 172:30-172:31 ExpBox False + 270 0 Geometry 172:35-172:36 ExpBox False + 271 0 Geometry 172:29-172:37 ExpBox False + 272 0 Geometry 172:7-172:37 ExpBox False + 273 0 Geometry 171:1-172:37 TopLevelBox ["addVV"] + 274 1323260 Geometry 168:40-168:41 ExpBox False + 275 1323260 Geometry 168:45-168:46 ExpBox False + 276 1323260 Geometry 168:40-168:46 ExpBox False + 277 1323260 Geometry 168:50-168:51 ExpBox False + 278 1323260 Geometry 168:55-168:56 ExpBox False + 279 1323260 Geometry 168:50-168:56 ExpBox False + 280 1323260 Geometry 168:40-168:56 ExpBox False + 281 1323260 Geometry 168:60-168:61 ExpBox False + 282 1323260 Geometry 168:65-168:66 ExpBox False + 283 1323260 Geometry 168:60-168:66 ExpBox False + 284 1323260 Geometry 168:40-168:66 ExpBox False + 285 1323260 Geometry 168:70-168:71 ExpBox False + 286 1323260 Geometry 168:75-168:76 ExpBox False + 287 1323260 Geometry 168:70-168:76 ExpBox False + 288 1323260 Geometry 168:40-168:76 ExpBox False + 289 1323260 Geometry 168:1-168:76 TopLevelBox ["dot4"] + 290 330815 Geometry 260:18-260:18 ExpBox False + 291 330815 Geometry 260:20-260:21 ExpBox False + 292 330815 Geometry 260:12-260:22 ExpBox False + 293 330815 Geometry 261:18-261:18 ExpBox False + 294 330815 Geometry 261:20-261:21 ExpBox False + 295 330815 Geometry 261:12-261:22 ExpBox False + 296 330815 Geometry 262:18-262:18 ExpBox False + 297 330815 Geometry 262:20-262:21 ExpBox False + 298 330815 Geometry 262:12-262:22 ExpBox False + 299 330815 Geometry 263:18-263:18 ExpBox False + 300 330815 Geometry 263:20-263:21 ExpBox False + 301 330815 Geometry 263:12-263:22 ExpBox False + 302 330815 Geometry 260:10-263:22 ExpBox False + 303 330815 Geometry 259:1-263:22 TopLevelBox ["multMQ"] + 304 12 Geometry 232:23-232:24 ExpBox False + 305 12 Geometry 232:12-232:24 ExpBox False + 306 12 Geometry 232:6-232:24 LocalBox ["multMM","m2'"] + 307 12 Geometry 227:18-227:20 ExpBox False + 308 12 Geometry 227:22-227:23 ExpBox False + 309 12 Geometry 227:10-227:24 ExpBox False + 310 12 Geometry 228:18-228:20 ExpBox False + 311 12 Geometry 228:22-228:23 ExpBox False + 312 12 Geometry 228:10-228:24 ExpBox False + 313 12 Geometry 229:18-229:20 ExpBox False + 314 12 Geometry 229:22-229:23 ExpBox False + 315 12 Geometry 229:10-229:24 ExpBox False + 316 12 Geometry 230:18-230:20 ExpBox False + 317 12 Geometry 230:22-230:23 ExpBox False + 318 12 Geometry 230:10-230:24 ExpBox False + 319 12 Geometry 227:8-230:24 ExpBox False + 320 12 Geometry 226:1-232:24 TopLevelBox ["multMM"] + 321 32512 Geometry 157:8-157:9 ExpBox False + 322 32512 Geometry 157:13-157:14 ExpBox False + 323 32512 Geometry 157:8-157:14 ExpBox False + 324 32512 Geometry 157:18-157:19 ExpBox False + 325 32512 Geometry 157:23-157:24 ExpBox False + 326 32512 Geometry 157:18-157:24 ExpBox False + 327 32512 Geometry 157:7-157:25 ExpBox False + 328 32512 Geometry 157:28-157:29 ExpBox False + 329 32512 Geometry 157:33-157:34 ExpBox False + 330 32512 Geometry 157:28-157:34 ExpBox False + 331 32512 Geometry 157:38-157:39 ExpBox False + 332 32512 Geometry 157:43-157:44 ExpBox False + 333 32512 Geometry 157:38-157:44 ExpBox False + 334 32512 Geometry 157:27-157:45 ExpBox False + 335 32512 Geometry 157:48-157:49 ExpBox False + 336 32512 Geometry 157:53-157:54 ExpBox False + 337 32512 Geometry 157:48-157:54 ExpBox False + 338 32512 Geometry 157:58-157:59 ExpBox False + 339 32512 Geometry 157:63-157:64 ExpBox False + 340 32512 Geometry 157:58-157:64 ExpBox False + 341 32512 Geometry 157:47-157:65 ExpBox False + 342 32512 Geometry 157:5-157:65 ExpBox False + 343 32512 Geometry 156:1-157:65 TopLevelBox ["cross"] + 344 112863 Geometry 153:33-153:34 ExpBox False + 345 112863 Geometry 153:38-153:39 ExpBox False + 346 112863 Geometry 153:33-153:39 ExpBox False + 347 112863 Geometry 153:43-153:44 ExpBox False + 348 112863 Geometry 153:48-153:49 ExpBox False + 349 112863 Geometry 153:43-153:49 ExpBox False + 350 112863 Geometry 153:33-153:49 ExpBox False + 351 112863 Geometry 153:53-153:54 ExpBox False + 352 112863 Geometry 153:58-153:59 ExpBox False + 353 112863 Geometry 153:53-153:59 ExpBox False + 354 112863 Geometry 153:33-153:59 ExpBox False + 355 112863 Geometry 153:1-153:59 TopLevelBox ["dot"] + 356 197872 Geometry 149:32-149:32 ExpBox False + 357 197872 Geometry 149:34-149:34 ExpBox False + 358 197872 Geometry 149:36-149:36 ExpBox False + 359 197872 Geometry 149:30-149:36 ExpBox False + 360 197872 Geometry 149:1-149:36 TopLevelBox ["quad_to_vector"] + 361 132895 Geometry 145:31-145:31 ExpBox False + 362 132895 Geometry 145:33-145:33 ExpBox False + 363 132895 Geometry 145:35-145:35 ExpBox False + 364 132895 Geometry 145:29-145:35 ExpBox False + 365 132895 Geometry 145:1-145:35 TopLevelBox ["quad_to_point"] + 366 132895 Geometry 141:29-141:29 ExpBox False + 367 132895 Geometry 141:31-141:31 ExpBox False + 368 132895 Geometry 141:33-141:33 ExpBox False + 369 132895 Geometry 141:35-141:35 ExpBox False + 370 132895 Geometry 141:27-141:35 ExpBox False + 371 132895 Geometry 141:1-141:35 TopLevelBox ["point_to_quad"] + 372 132895 Geometry 253:36-253:36 ExpBox False + 373 132895 Geometry 253:53-253:53 ExpBox False + 374 132895 Geometry 253:38-253:54 ExpBox False + 375 132895 Geometry 253:28-253:55 ExpBox False + 376 132895 Geometry 253:14-253:55 ExpBox False + 377 132895 Geometry 253:1-253:55 TopLevelBox ["multMP"] + 378 197872 Geometry 137:30-137:30 ExpBox False + 379 197872 Geometry 137:32-137:32 ExpBox False + 380 197872 Geometry 137:34-137:34 ExpBox False + 381 197872 Geometry 137:36-137:36 ExpBox False + 382 197872 Geometry 137:28-137:36 ExpBox False + 383 197872 Geometry 137:1-137:36 TopLevelBox ["vector_to_quad"] + 384 197872 Geometry 249:37-249:37 ExpBox False + 385 197872 Geometry 249:55-249:55 ExpBox False + 386 197872 Geometry 249:39-249:56 ExpBox False + 387 197872 Geometry 249:29-249:57 ExpBox False + 388 197872 Geometry 249:14-249:57 ExpBox False + 389 197872 Geometry 249:1-249:57 TopLevelBox ["multMV"] + 390 132847 Geometry 267:27-267:27 ExpBox False + 391 132847 Geometry 267:29-267:29 ExpBox False + 392 132847 Geometry 267:20-267:29 ExpBox False + 393 132847 Geometry 267:39-267:39 ExpBox False + 394 132847 Geometry 267:41-267:41 ExpBox False + 395 132847 Geometry 267:32-267:41 ExpBox False + 396 132847 Geometry 267:19-267:42 ExpBox False + 397 132847 Geometry 267:1-267:42 TopLevelBox ["multMR"] + 398 0 Geometry 133:32-133:32 ExpBox False + 399 0 Geometry 133:34-133:34 ExpBox False + 400 0 Geometry 133:36-133:36 ExpBox False + 401 0 Geometry 133:30-133:36 ExpBox False + 402 0 Geometry 133:1-133:36 TopLevelBox ["vector_to_point"] + 403 0 Geometry 130:31-130:31 ExpBox False + 404 0 Geometry 130:33-130:33 ExpBox False + 405 0 Geometry 130:35-130:35 ExpBox False + 406 0 Geometry 130:29-130:35 ExpBox False + 407 0 Geometry 130:1-130:35 TopLevelBox ["point_to_vector"] + 408 0 Geometry 127:29-127:29 ExpBox False + 409 0 Geometry 127:38-127:38 ExpBox False + 410 0 Geometry 127:29-127:38 ExpBox False + 411 0 Geometry 127:43-127:43 ExpBox False + 412 0 Geometry 127:52-127:52 ExpBox False + 413 0 Geometry 127:43-127:52 ExpBox False + 414 0 Geometry 127:57-127:57 ExpBox False + 415 0 Geometry 127:66-127:66 ExpBox False + 416 0 Geometry 127:57-127:66 ExpBox False + 417 0 Geometry 127:43-127:66 ExpBox False + 418 0 Geometry 127:29-127:66 ExpBox False + 419 0 Geometry 127:1-127:66 TopLevelBox ["nearV"] + 420 60006 Geometry 124:18-124:18 ExpBox False + 421 60006 Geometry 124:20-124:20 ExpBox False + 422 60006 Geometry 124:22-124:22 ExpBox False + 423 60006 Geometry 124:16-124:22 ExpBox False + 424 60006 Geometry 124:1-124:22 TopLevelBox ["vector"] + 425 0 Geometry 163:14-163:14 ExpBox False + 426 0 Geometry 163:19-163:19 ExpBox False + 427 0 Geometry 163:14-163:19 ExpBox False + 428 0 Geometry 163:14-163:19 BinBox GuardBinBox True + 429 0 Geometry 163:14-163:19 BinBox GuardBinBox False + 430 0 Geometry 163:44-163:44 ExpBox False + 431 0 Geometry 163:46-163:46 ExpBox False + 432 0 Geometry 163:50-163:50 ExpBox False + 433 0 Geometry 163:48-163:51 ExpBox False + 434 0 Geometry 163:36-163:52 ExpBox False + 435 0 Geometry 163:26-163:52 ExpBox True + 436 0 Geometry 164:14-164:22 ExpBox False + 437 0 Geometry 164:14-164:22 BinBox GuardBinBox True + 438 0 Geometry 164:14-164:22 BinBox GuardBinBox False + 439 0 Geometry 164:46-164:46 ExpBox False + 440 0 Geometry 164:44-164:47 ExpBox False + 441 0 Geometry 164:49-164:49 ExpBox False + 442 0 Geometry 164:51-164:51 ExpBox False + 443 0 Geometry 164:36-164:52 ExpBox False + 444 0 Geometry 164:26-164:52 ExpBox True + 445 0 Geometry 163:9-164:52 LocalBox ["tangents","v1"] + 446 0 Geometry 162:6-162:7 ExpBox False + 447 0 Geometry 162:10-162:10 ExpBox False + 448 0 Geometry 162:20-162:21 ExpBox False + 449 0 Geometry 162:10-162:21 ExpBox False + 450 0 Geometry 162:5-162:22 ExpBox False + 451 0 Geometry 161:1-164:52 TopLevelBox ["tangents"] + 452 26833 Geometry 121:17-121:17 ExpBox False + 453 26833 Geometry 121:19-121:19 ExpBox False + 454 26833 Geometry 121:21-121:21 ExpBox False + 455 26833 Geometry 121:15-121:21 ExpBox False + 456 26833 Geometry 121:1-121:21 TopLevelBox ["point"] + 457 159631 Geometry 118:24-118:24 ExpBox False + 458 159631 Geometry 118:1-118:24 TopLevelBox ["zComponent"] + 459 248385 Geometry 116:24-116:24 ExpBox False + 460 248385 Geometry 116:1-116:24 TopLevelBox ["yComponent"] + 461 159631 Geometry 114:24-114:24 ExpBox False + 462 159631 Geometry 114:1-114:24 TopLevelBox ["xComponent"] + 463 188590 Geometry 111:20-111:20 ExpBox False + 464 188590 Geometry 111:1-111:20 TopLevelBox ["zCoord"] + 465 253212 Geometry 109:20-109:20 ExpBox False + 466 253212 Geometry 109:1-109:20 TopLevelBox ["yCoord"] + 467 187913 Geometry 107:20-107:20 ExpBox False + 468 187913 Geometry 107:1-107:20 TopLevelBox ["xCoord"] + 469 60000 Geometry 104:22-104:22 ExpBox False + 470 60000 Geometry 104:24-104:24 ExpBox False + 471 60000 Geometry 104:26-104:26 ExpBox False + 472 60000 Geometry 104:21-104:27 ExpBox False + 473 60000 Geometry 104:1-104:27 TopLevelBox ["uncolor"] + 474 32514 Geometry 102:17-102:17 ExpBox False + 475 32514 Geometry 102:19-102:19 ExpBox False + 476 32514 Geometry 102:21-102:21 ExpBox False + 477 32514 Geometry 102:15-102:21 ExpBox False + 478 32514 Geometry 102:1-102:21 TopLevelBox ["color"] + 479 0 Geometry 100:16-100:16 ExpBox False + 480 0 Geometry 100:19-100:19 ExpBox False + 481 0 Geometry 100:22-100:22 ExpBox False + 482 0 Geometry 100:15-100:23 ExpBox False + 483 0 Geometry 100:1-100:23 TopLevelBox ["coord"] + 484 13 Geometry 95:10-95:12 ExpBox False + 485 13 Geometry 95:14-95:16 ExpBox False + 486 13 Geometry 95:18-95:20 ExpBox False + 487 13 Geometry 95:22-95:24 ExpBox False + 488 13 Geometry 95:7-95:25 ExpBox False + 489 13 Geometry 96:10-96:12 ExpBox False + 490 13 Geometry 96:14-96:16 ExpBox False + 491 13 Geometry 96:18-96:20 ExpBox False + 492 13 Geometry 96:22-96:24 ExpBox False + 493 13 Geometry 96:7-96:25 ExpBox False + 494 13 Geometry 97:10-97:12 ExpBox False + 495 13 Geometry 97:14-97:16 ExpBox False + 496 13 Geometry 97:18-97:20 ExpBox False + 497 13 Geometry 97:22-97:24 ExpBox False + 498 13 Geometry 97:7-97:25 ExpBox False + 499 13 Geometry 98:10-98:12 ExpBox False + 500 13 Geometry 98:14-98:16 ExpBox False + 501 13 Geometry 98:18-98:20 ExpBox False + 502 13 Geometry 98:22-98:24 ExpBox False + 503 13 Geometry 98:7-98:25 ExpBox False + 504 13 Geometry 95:5-98:25 ExpBox False + 505 13 Geometry 91:1-98:25 TopLevelBox ["matrix"] + 506 0 Geometry 70:15-70:18 TopLevelBox ["showsPrec"] + 507 0 Geometry 70:15-70:18 TopLevelBox ["showList"] + 508 0 Geometry 72:15-72:18 TopLevelBox ["showsPrec"] + 509 0 Geometry 72:15-72:18 TopLevelBox ["showList"] + 510 0 Geometry 72:21-72:22 TopLevelBox ["=="] + 511 0 Geometry 72:21-72:22 TopLevelBox ["/="] + 512 0 Geometry 77:15-77:18 TopLevelBox ["showsPrec"] + 513 0 Geometry 77:15-77:18 TopLevelBox ["showList"] + 514 0 Geometry 77:21-77:22 TopLevelBox ["=="] + 515 0 Geometry 77:21-77:22 TopLevelBox ["/="] + 516 0 Geometry 80:15-80:18 TopLevelBox ["showsPrec"] + 517 0 Geometry 80:15-80:18 TopLevelBox ["showList"] + 518 0 Geometry 83:15-83:18 TopLevelBox ["showsPrec"] + 519 0 Geometry 83:15-83:18 TopLevelBox ["showList"] + 520 0 Geometry 74:15-74:18 TopLevelBox ["showsPrec"] + 521 0 Geometry 74:15-74:18 TopLevelBox ["showList"] + 0 0 Surface 115:21-115:21 ExpBox False + 1 0 Surface 115:25-115:25 ExpBox False + 2 0 Surface 115:21-115:25 ExpBox False + 3 0 Surface 115:21-115:25 BinBox CondBinBox True + 4 0 Surface 115:21-115:25 BinBox CondBinBox False + 5 0 Surface 115:32-115:32 ExpBox True + 6 0 Surface 115:39-115:39 ExpBox False + 7 0 Surface 115:43-115:43 ExpBox False + 8 0 Surface 115:47-115:48 ExpBox False + 9 0 Surface 115:43-115:48 ExpBox False + 10 0 Surface 115:39-115:48 ExpBox True + 11 0 Surface 115:18-115:48 ExpBox False + 12 0 Surface 115:1-115:48 TopLevelBox ["adjustRadian"] + 13 28863 Surface 110:20-110:21 ExpBox False + 14 28863 Surface 110:13-110:21 ExpBox False + 15 28863 Surface 110:9-110:21 LocalBox ["planarUV","z"] + 16 4731 Surface 109:20-109:21 ExpBox False + 17 4731 Surface 109:13-109:21 ExpBox False + 18 4731 Surface 109:9-109:21 LocalBox ["planarUV","y"] + 19 31430 Surface 108:20-108:21 ExpBox False + 20 31430 Surface 108:13-108:21 ExpBox False + 21 31430 Surface 108:9-108:21 LocalBox ["planarUV","x"] + 22 32512 Surface 94:10-94:13 ExpBox False + 23 0 Surface 95:24-95:24 ExpBox False + 24 26784 Surface 95:27-95:27 ExpBox False + 25 26784 Surface 95:30-95:30 ExpBox False + 26 26784 Surface 95:23-95:31 ExpBox True + 27 0 Surface 97:24-97:24 ExpBox False + 28 3649 Surface 97:27-97:27 ExpBox False + 29 3649 Surface 97:30-97:30 ExpBox False + 30 3649 Surface 97:23-97:31 ExpBox True + 31 0 Surface 98:24-98:24 ExpBox False + 32 0 Surface 98:27-98:27 ExpBox False + 33 0 Surface 98:30-98:30 ExpBox False + 34 0 Surface 98:23-98:31 ExpBox True + 35 0 Surface 99:24-99:24 ExpBox False + 36 1082 Surface 99:27-99:27 ExpBox False + 37 1082 Surface 99:30-99:30 ExpBox False + 38 1082 Surface 99:23-99:31 ExpBox True + 39 0 Surface 100:24-100:24 ExpBox False + 40 0 Surface 100:27-100:27 ExpBox False + 41 0 Surface 100:30-100:30 ExpBox False + 42 0 Surface 100:23-100:31 ExpBox True + 43 0 Surface 101:24-101:24 ExpBox False + 44 945 Surface 101:27-101:27 ExpBox False + 45 945 Surface 101:30-101:30 ExpBox False + 46 945 Surface 101:23-101:31 ExpBox True + 47 0 Surface 102:24-102:24 ExpBox False + 48 52 Surface 102:27-102:27 ExpBox False + 49 52 Surface 102:30-102:30 ExpBox False + 50 52 Surface 102:23-102:31 ExpBox True + 51 0 Surface 104:24-104:24 ExpBox False + 52 0 Surface 104:28-104:28 ExpBox False + 53 0 Surface 104:32-104:32 ExpBox False + 54 0 Surface 104:27-104:33 ExpBox False + 55 0 Surface 104:37-104:37 ExpBox False + 56 0 Surface 104:27-104:37 ExpBox False + 57 0 Surface 104:41-104:41 ExpBox False + 58 0 Surface 104:45-104:45 ExpBox False + 59 0 Surface 104:40-104:46 ExpBox False + 60 0 Surface 104:50-104:50 ExpBox False + 61 0 Surface 104:40-104:50 ExpBox False + 62 0 Surface 104:23-104:51 ExpBox True + 63 0 Surface 105:24-105:24 ExpBox False + 64 0 Surface 105:28-105:28 ExpBox False + 65 0 Surface 105:32-105:32 ExpBox False + 66 0 Surface 105:27-105:33 ExpBox False + 67 0 Surface 105:37-105:37 ExpBox False + 68 0 Surface 105:27-105:37 ExpBox False + 69 0 Surface 105:41-105:41 ExpBox False + 70 0 Surface 105:45-105:45 ExpBox False + 71 0 Surface 105:40-105:46 ExpBox False + 72 0 Surface 105:50-105:50 ExpBox False + 73 0 Surface 105:40-105:50 ExpBox False + 74 0 Surface 105:23-105:51 ExpBox True + 75 0 Surface 107:24-107:24 ExpBox False + 76 0 Surface 107:28-107:28 ExpBox False + 77 0 Surface 107:32-107:32 ExpBox False + 78 0 Surface 107:27-107:33 ExpBox False + 79 0 Surface 107:37-107:37 ExpBox False + 80 0 Surface 107:27-107:37 ExpBox False + 81 0 Surface 107:41-107:41 ExpBox False + 82 0 Surface 107:45-107:45 ExpBox False + 83 0 Surface 107:40-107:46 ExpBox False + 84 0 Surface 107:50-107:50 ExpBox False + 85 0 Surface 107:40-107:50 ExpBox False + 86 0 Surface 107:23-107:51 ExpBox True + 87 32512 Surface 94:5-107:51 ExpBox False + 88 32512 Surface 93:1-110:21 TopLevelBox ["planarUV"] + 89 0 Surface 45:36-45:36 ExpBox False + 90 0 Surface 45:26-45:36 ExpBox True + 91 32512 Surface 46:26-46:26 ExpBox True + 92 32512 Surface 45:1-46:26 TopLevelBox ["evalSurface"] + 93 32512 Surface 56:31-56:31 ExpBox False + 94 32512 Surface 56:33-56:34 ExpBox False + 95 32512 Surface 56:22-56:34 ExpBox False + 96 32512 Surface 55:16-55:24 ExpBox False + 97 32512 Surface 55:34-55:35 ExpBox False + 98 32512 Surface 55:37-55:38 ExpBox False + 99 32512 Surface 55:28-55:38 ExpBox False + 100 32512 Surface 55:16-55:38 ExpBox False + 101 32512 Surface 55:9-55:38 LocalBox ["surface","norm"] + 102 32512 Surface 54:6-54:9 ExpBox False + 103 32512 Surface 54:24-54:25 ExpBox False + 104 0 Surface 54:27-54:28 ExpBox False + 105 32512 Surface 54:30-54:30 ExpBox False + 106 32512 Surface 54:32-54:32 ExpBox False + 107 32512 Surface 54:12-54:32 ExpBox False + 108 32512 Surface 54:5-54:33 ExpBox True + 109 0 Surface 69:16-69:24 ExpBox False + 110 0 Surface 69:34-69:35 ExpBox False + 111 0 Surface 69:37-69:38 ExpBox False + 112 0 Surface 69:28-69:38 ExpBox False + 113 0 Surface 69:16-69:38 ExpBox False + 114 0 Surface 69:9-69:38 LocalBox ["surface","norm"] + 115 0 Surface 62:20-62:21 ExpBox False + 116 0 Surface 62:13-62:21 ExpBox False + 117 0 Surface 62:9-62:21 LocalBox ["surface","z"] + 118 0 Surface 61:20-61:21 ExpBox False + 119 0 Surface 61:13-61:21 ExpBox False + 120 0 Surface 61:9-61:21 LocalBox ["surface","y"] + 121 0 Surface 63:19-63:19 ExpBox False + 122 0 Surface 63:26-63:26 ExpBox False + 123 0 Surface 63:23-63:26 ExpBox False + 124 0 Surface 63:18-63:27 ExpBox False + 125 0 Surface 63:13-63:27 ExpBox False + 126 0 Surface 63:9-63:27 LocalBox ["surface","k"] + 127 0 Surface 68:28-68:28 ExpBox False + 128 0 Surface 68:32-68:32 ExpBox False + 129 0 Surface 68:27-68:33 ExpBox False + 130 0 Surface 68:37-68:37 ExpBox False + 131 0 Surface 68:26-68:38 ExpBox False + 132 0 Surface 68:19-68:38 ExpBox False + 133 0 Surface 68:9-68:38 LocalBox ["surface","v"] + 134 0 Surface 60:20-60:21 ExpBox False + 135 0 Surface 60:13-60:21 ExpBox False + 136 0 Surface 60:9-60:21 LocalBox ["surface","x"] + 137 0 Surface 64:38-64:38 ExpBox False + 138 0 Surface 64:42-64:42 ExpBox False + 139 0 Surface 64:37-64:43 ExpBox False + 140 0 Surface 64:46-64:46 ExpBox False + 141 0 Surface 64:50-64:50 ExpBox False + 142 0 Surface 64:45-64:51 ExpBox False + 143 0 Surface 64:30-64:52 ExpBox False + 144 0 Surface 64:17-64:52 ExpBox False + 145 0 Surface 64:9-64:52 LocalBox ["surface","theta"] + 146 0 Surface 67:13-67:15 ExpBox False + 147 0 Surface 67:27-67:31 ExpBox False + 148 0 Surface 67:36-67:36 ExpBox False + 149 0 Surface 67:40-67:41 ExpBox False + 150 0 Surface 67:35-67:42 ExpBox False + 151 0 Surface 67:26-67:43 ExpBox False + 152 0 Surface 67:19-67:43 ExpBox False + 153 0 Surface 67:13-67:43 ExpBox False + 154 0 Surface 67:9-67:43 LocalBox ["surface","u"] + 155 0 Surface 59:6-59:9 ExpBox False + 156 0 Surface 59:24-59:25 ExpBox False + 157 0 Surface 59:27-59:27 ExpBox False + 158 0 Surface 59:29-59:29 ExpBox False + 159 0 Surface 59:31-59:31 ExpBox False + 160 0 Surface 59:12-59:31 ExpBox False + 161 0 Surface 59:5-59:32 ExpBox True + 162 0 Surface 80:16-80:24 ExpBox False + 163 0 Surface 80:34-80:35 ExpBox False + 164 0 Surface 80:37-80:38 ExpBox False + 165 0 Surface 80:28-80:38 ExpBox False + 166 0 Surface 80:16-80:38 ExpBox False + 167 0 Surface 80:9-80:38 LocalBox ["surface","norm"] + 168 0 Surface 77:20-77:21 ExpBox False + 169 0 Surface 77:13-77:21 ExpBox False + 170 0 Surface 77:9-77:21 LocalBox ["surface","z"] + 171 0 Surface 76:20-76:21 ExpBox False + 172 0 Surface 76:13-76:21 ExpBox False + 173 0 Surface 76:9-76:21 LocalBox ["surface","y"] + 174 0 Surface 79:13-79:13 ExpBox False + 175 0 Surface 79:9-79:13 LocalBox ["surface","v"] + 176 0 Surface 75:20-75:21 ExpBox False + 177 0 Surface 75:13-75:21 ExpBox False + 178 0 Surface 75:9-75:21 LocalBox ["surface","x"] + 179 0 Surface 78:13-78:18 ExpBox False + 180 0 Surface 78:42-78:42 ExpBox False + 181 0 Surface 78:44-78:44 ExpBox False + 182 0 Surface 78:35-78:45 ExpBox False + 183 0 Surface 78:22-78:45 ExpBox False + 184 0 Surface 78:50-78:50 ExpBox False + 185 0 Surface 78:54-78:55 ExpBox False + 186 0 Surface 78:49-78:56 ExpBox False + 187 0 Surface 78:22-78:56 ExpBox False + 188 0 Surface 78:13-78:56 ExpBox False + 189 0 Surface 78:9-78:56 LocalBox ["surface","u"] + 190 0 Surface 74:6-74:9 ExpBox False + 191 0 Surface 74:24-74:25 ExpBox False + 192 0 Surface 74:27-74:27 ExpBox False + 193 0 Surface 74:29-74:29 ExpBox False + 194 0 Surface 74:31-74:31 ExpBox False + 195 0 Surface 74:12-74:31 ExpBox False + 196 0 Surface 74:5-74:32 ExpBox True + 197 0 Surface 91:16-91:24 ExpBox False + 198 0 Surface 91:34-91:35 ExpBox False + 199 0 Surface 91:37-91:38 ExpBox False + 200 0 Surface 91:28-91:38 ExpBox False + 201 0 Surface 91:16-91:38 ExpBox False + 202 0 Surface 91:9-91:38 LocalBox ["surface","norm"] + 203 0 Surface 88:20-88:21 ExpBox False + 204 0 Surface 88:13-88:21 ExpBox False + 205 0 Surface 88:9-88:21 LocalBox ["surface","z"] + 206 0 Surface 87:20-87:21 ExpBox False + 207 0 Surface 87:13-87:21 ExpBox False + 208 0 Surface 87:9-87:21 LocalBox ["surface","y"] + 209 0 Surface 90:13-90:13 ExpBox False + 210 0 Surface 90:9-90:13 LocalBox ["surface","v"] + 211 0 Surface 86:20-86:21 ExpBox False + 212 0 Surface 86:13-86:21 ExpBox False + 213 0 Surface 86:9-86:21 LocalBox ["surface","x"] + 214 0 Surface 89:13-89:18 ExpBox False + 215 0 Surface 89:43-89:43 ExpBox False + 216 0 Surface 89:47-89:47 ExpBox False + 217 0 Surface 89:42-89:48 ExpBox False + 218 0 Surface 89:51-89:51 ExpBox False + 219 0 Surface 89:55-89:55 ExpBox False + 220 0 Surface 89:50-89:56 ExpBox False + 221 0 Surface 89:35-89:57 ExpBox False + 222 0 Surface 89:22-89:57 ExpBox False + 223 0 Surface 89:62-89:62 ExpBox False + 224 0 Surface 89:66-89:67 ExpBox False + 225 0 Surface 89:61-89:68 ExpBox False + 226 0 Surface 89:22-89:68 ExpBox False + 227 0 Surface 89:13-89:68 ExpBox False + 228 0 Surface 89:9-89:68 LocalBox ["surface","u"] + 229 0 Surface 85:6-85:9 ExpBox False + 230 0 Surface 85:24-85:25 ExpBox False + 231 0 Surface 85:27-85:27 ExpBox False + 232 0 Surface 85:29-85:29 ExpBox False + 233 0 Surface 85:31-85:31 ExpBox False + 234 0 Surface 85:12-85:31 ExpBox False + 235 0 Surface 85:5-85:32 ExpBox True + 236 32512 Surface 53:1-91:38 TopLevelBox ["surface"] + 237 0 Surface 37:28-37:28 ExpBox False + 238 0 Surface 37:31-37:31 ExpBox False + 239 0 Surface 37:34-37:34 ExpBox False + 240 0 Surface 37:37-37:37 ExpBox False + 241 0 Surface 37:27-37:38 ExpBox False + 242 0 Surface 37:1-37:38 TopLevelBox ["chgColor"] + 243 0 Surface 34:10-34:14 ExpBox False + 244 0 Surface 34:17-34:19 ExpBox False + 245 0 Surface 34:22-34:24 ExpBox False + 246 0 Surface 34:27-34:29 ExpBox False + 247 0 Surface 34:9-34:30 ExpBox False + 248 0 Surface 34:1-34:30 TopLevelBox ["shiny"] + 249 0 Surface 33:10-33:14 ExpBox False + 250 0 Surface 33:17-33:19 ExpBox False + 251 0 Surface 33:22-33:24 ExpBox False + 252 0 Surface 33:27-33:29 ExpBox False + 253 0 Surface 33:9-33:30 ExpBox False + 254 0 Surface 33:1-33:30 TopLevelBox ["matte"] + 255 32512 Surface 31:17-31:17 ExpBox False + 256 32512 Surface 31:20-31:20 ExpBox False + 257 32512 Surface 31:23-31:23 ExpBox False + 258 26812 Surface 31:26-31:26 ExpBox False + 259 32512 Surface 31:16-31:27 ExpBox False + 260 32512 Surface 31:1-31:27 TopLevelBox ["prop"] + 261 0 Surface 27:10-27:15 ExpBox False + 262 0 Surface 27:1-27:15 TopLevelBox ["sconst"] + 263 0 Surface 25:8-25:11 ExpBox False + 264 0 Surface 25:1-25:11 TopLevelBox ["sfun"] + 265 0 Surface 40:21-40:38 ExpBox True + 266 0 Surface 42:21-42:38 ExpBox True + 267 0 Surface 40:3-42:38 TopLevelBox ["show"] + 0 0 Illumination 226:33-226:35 ExpBox False + 1 0 Illumination 226:37-226:37 ExpBox False + 2 0 Illumination 226:10-226:37 ExpBox False + 3 0 Illumination 227:38-227:42 ExpBox True + 4 0 Illumination 228:38-228:42 ExpBox True + 5 0 Illumination 229:38-229:42 ExpBox True + 6 0 Illumination 230:38-230:42 ExpBox True + 7 0 Illumination 231:38-231:38 ExpBox False + 8 0 Illumination 231:42-231:44 ExpBox False + 9 0 Illumination 231:38-231:44 ExpBox True + 10 0 Illumination 226:5-231:44 ExpBox False + 11 0 Illumination 225:1-231:44 TopLevelBox ["intersectWithin"] + 12 28811 Illumination 217:33-217:35 ExpBox False + 13 28811 Illumination 217:37-217:37 ExpBox False + 14 28811 Illumination 217:10-217:37 ExpBox False + 15 0 Illumination 218:38-218:42 ExpBox True + 16 26812 Illumination 219:38-219:42 ExpBox True + 17 0 Illumination 220:38-220:42 ExpBox True + 18 0 Illumination 221:38-221:42 ExpBox True + 19 1999 Illumination 222:38-222:41 ExpBox True + 20 28811 Illumination 217:5-222:41 ExpBox False + 21 28811 Illumination 216:1-222:41 TopLevelBox ["intersects"] + 22 86727 Illumination 207:33-207:35 ExpBox False + 23 86727 Illumination 207:37-207:37 ExpBox False + 24 86727 Illumination 207:10-207:37 ExpBox False + 25 0 Illumination 208:41-208:47 ExpBox True + 26 1 Illumination 209:41-209:47 ExpBox True + 27 0 Illumination 210:41-210:47 ExpBox True + 28 0 Illumination 211:41-211:47 ExpBox True + 29 32512 Illumination 213:33-213:33 ExpBox False + 30 32512 Illumination 213:35-213:36 ExpBox False + 31 32512 Illumination 213:25-213:36 ExpBox False + 32 28811 Illumination 214:33-214:35 ExpBox False + 33 28811 Illumination 214:37-214:37 ExpBox False + 34 28811 Illumination 214:19-214:37 ExpBox False + 35 32512 Illumination 214:40-214:40 ExpBox False + 36 32512 Illumination 214:43-214:46 ExpBox False + 37 32512 Illumination 214:18-214:47 ExpBox False + 38 32512 Illumination 213:9-214:47 ExpBox True + 39 86727 Illumination 207:5-214:47 ExpBox False + 40 86727 Illumination 206:1-214:47 TopLevelBox ["castRay"] + 41 0 Illumination 202:24-202:26 ExpBox False + 42 0 Illumination 202:31-202:32 ExpBox False + 43 0 Illumination 202:45-202:47 ExpBox False + 44 0 Illumination 202:39-202:48 ExpBox False + 45 0 Illumination 202:36-202:48 ExpBox False + 46 0 Illumination 202:30-202:49 ExpBox False + 47 0 Illumination 202:23-202:50 ExpBox False + 48 0 Illumination 202:61-202:65 ExpBox False + 49 0 Illumination 202:23-202:65 ExpBox False + 50 0 Illumination 202:1-202:65 TopLevelBox ["attenuate"] + 51 32512 Illumination 179:5-179:7 ExpBox False + 52 32512 Illumination 179:15-179:19 ExpBox False + 53 32512 Illumination 179:5-179:19 ExpBox False + 54 32512 Illumination 179:23-179:23 ExpBox False + 55 32512 Illumination 179:5-179:23 ExpBox False + 56 3701 Illumination 179:5-179:23 BinBox GuardBinBox True + 57 28811 Illumination 179:5-179:23 BinBox GuardBinBox False + 58 1 Illumination 179:27-179:33 ExpBox True + 59 28811 Illumination 180:17-180:19 ExpBox False + 60 28811 Illumination 180:30-180:35 ExpBox False + 61 28811 Illumination 180:46-180:48 ExpBox False + 62 28811 Illumination 180:29-180:49 ExpBox False + 63 28811 Illumination 180:17-180:49 ExpBox False + 64 28811 Illumination 180:51-180:53 ExpBox False + 65 28811 Illumination 180:16-180:54 ExpBox False + 66 28811 Illumination 180:56-180:58 ExpBox False + 67 28811 Illumination 180:5-180:58 ExpBox False + 68 1999 Illumination 180:5-180:58 BinBox GuardBinBox True + 69 26812 Illumination 180:5-180:58 BinBox GuardBinBox False + 70 1 Illumination 180:62-180:68 ExpBox True + 71 26812 Illumination 181:5-181:13 ExpBox False + 72 26812 Illumination 181:5-181:13 BinBox GuardBinBox True + 73 0 Illumination 181:5-181:13 BinBox GuardBinBox False + 74 26812 Illumination 181:37-181:39 ExpBox False + 75 26812 Illumination 181:41-181:45 ExpBox False + 76 26812 Illumination 181:36-181:46 ExpBox False + 77 26812 Illumination 181:31-181:46 ExpBox True + 78 0 Illumination 186:19-186:20 ExpBox False + 79 0 Illumination 186:30-186:32 ExpBox False + 80 0 Illumination 186:19-186:32 ExpBox False + 81 0 Illumination 186:13-186:32 LocalBox ["unobscure","vec"] + 82 0 Illumination 187:29-187:31 ExpBox False + 83 0 Illumination 187:33-187:37 ExpBox False + 84 0 Illumination 187:19-187:37 ExpBox False + 85 0 Illumination 187:13-187:37 LocalBox ["unobscure","is"] + 86 0 Illumination 183:5-183:7 ExpBox False + 87 0 Illumination 183:15-183:19 ExpBox False + 88 0 Illumination 183:5-183:19 ExpBox False + 89 0 Illumination 183:23-183:23 ExpBox False + 90 0 Illumination 183:5-183:23 ExpBox False + 91 0 Illumination 183:5-183:23 BinBox GuardBinBox True + 92 0 Illumination 183:5-183:23 BinBox GuardBinBox False + 93 0 Illumination 183:31-183:37 ExpBox True + 94 0 Illumination 184:22-184:24 ExpBox False + 95 0 Illumination 184:35-184:40 ExpBox False + 96 0 Illumination 184:62-184:64 ExpBox False + 97 0 Illumination 184:51-184:65 ExpBox False + 98 0 Illumination 184:34-184:66 ExpBox False + 99 0 Illumination 184:22-184:66 ExpBox False + 100 0 Illumination 184:69-184:71 ExpBox False + 101 0 Illumination 184:21-184:72 ExpBox False + 102 0 Illumination 184:74-184:76 ExpBox False + 103 0 Illumination 184:5-184:76 ExpBox False + 104 0 Illumination 184:5-184:76 BinBox GuardBinBox True + 105 0 Illumination 184:5-184:76 BinBox GuardBinBox False + 106 0 Illumination 184:80-184:86 ExpBox True + 107 0 Illumination 185:5-185:13 ExpBox False + 108 0 Illumination 185:5-185:13 BinBox GuardBinBox True + 109 0 Illumination 185:5-185:13 BinBox GuardBinBox False + 110 0 Illumination 185:37-185:39 ExpBox False + 111 0 Illumination 185:41-185:42 ExpBox False + 112 0 Illumination 185:36-185:43 ExpBox False + 113 0 Illumination 185:31-185:43 ExpBox True + 114 0 Illumination 198:32-198:34 ExpBox False + 115 0 Illumination 198:44-198:46 ExpBox False + 116 0 Illumination 198:31-198:47 ExpBox False + 117 0 Illumination 198:21-198:47 ExpBox False + 118 0 Illumination 198:13-198:47 LocalBox ["unobscure","qsp"] + 119 0 Illumination 197:32-197:33 ExpBox False + 120 0 Illumination 197:43-197:45 ExpBox False + 121 0 Illumination 197:31-197:46 ExpBox False + 122 0 Illumination 197:21-197:46 ExpBox False + 123 0 Illumination 197:13-197:46 LocalBox ["unobscure","asp"] + 124 0 Illumination 194:21-194:23 ExpBox False + 125 0 Illumination 194:33-194:34 ExpBox False + 126 0 Illumination 194:21-194:34 ExpBox False + 127 0 Illumination 194:13-194:34 LocalBox ["unobscure","vec'"] + 128 0 Illumination 193:21-193:23 ExpBox False + 129 0 Illumination 193:33-193:35 ExpBox False + 130 0 Illumination 193:21-193:35 ExpBox False + 131 0 Illumination 193:13-193:35 LocalBox ["unobscure","vec"] + 132 0 Illumination 195:37-195:39 ExpBox False + 133 0 Illumination 195:27-195:39 ExpBox False + 134 0 Illumination 195:58-195:61 ExpBox False + 135 0 Illumination 195:47-195:62 ExpBox False + 136 0 Illumination 195:26-195:63 ExpBox False + 137 0 Illumination 195:21-195:63 ExpBox False + 138 0 Illumination 195:13-195:63 LocalBox ["unobscure","angle"] + 139 0 Illumination 199:31-199:33 ExpBox False + 140 0 Illumination 199:38-199:40 ExpBox False + 141 0 Illumination 199:48-199:50 ExpBox False + 142 0 Illumination 199:37-199:51 ExpBox False + 143 0 Illumination 199:56-199:58 ExpBox False + 144 0 Illumination 199:36-199:59 ExpBox False + 145 0 Illumination 199:70-199:74 ExpBox False + 146 0 Illumination 199:35-199:75 ExpBox False + 147 0 Illumination 199:21-199:75 ExpBox False + 148 0 Illumination 199:13-199:75 LocalBox ["unobscure","is"] + 149 0 Illumination 189:5-189:7 ExpBox False + 150 0 Illumination 189:15-189:19 ExpBox False + 151 0 Illumination 189:5-189:19 ExpBox False + 152 0 Illumination 189:23-189:23 ExpBox False + 153 0 Illumination 189:5-189:23 ExpBox False + 154 0 Illumination 189:5-189:23 BinBox GuardBinBox True + 155 0 Illumination 189:5-189:23 BinBox GuardBinBox False + 156 0 Illumination 189:75-189:81 ExpBox True + 157 0 Illumination 190:22-190:24 ExpBox False + 158 0 Illumination 190:35-190:40 ExpBox False + 159 0 Illumination 190:62-190:64 ExpBox False + 160 0 Illumination 190:51-190:65 ExpBox False + 161 0 Illumination 190:34-190:66 ExpBox False + 162 0 Illumination 190:22-190:66 ExpBox False + 163 0 Illumination 190:69-190:71 ExpBox False + 164 0 Illumination 190:21-190:72 ExpBox False + 165 0 Illumination 190:74-190:76 ExpBox False + 166 0 Illumination 190:5-190:76 ExpBox False + 167 0 Illumination 190:5-190:76 BinBox GuardBinBox True + 168 0 Illumination 190:5-190:76 BinBox GuardBinBox False + 169 0 Illumination 190:80-190:86 ExpBox True + 170 0 Illumination 191:5-191:9 ExpBox False + 171 0 Illumination 191:13-191:18 ExpBox False + 172 0 Illumination 191:5-191:18 ExpBox False + 173 0 Illumination 191:5-191:18 BinBox GuardBinBox True + 174 0 Illumination 191:5-191:18 BinBox GuardBinBox False + 175 0 Illumination 191:75-191:81 ExpBox True + 176 0 Illumination 192:5-192:13 ExpBox False + 177 0 Illumination 192:5-192:13 BinBox GuardBinBox True + 178 0 Illumination 192:5-192:13 BinBox GuardBinBox False + 179 0 Illumination 192:81-192:83 ExpBox False + 180 0 Illumination 192:86-192:87 ExpBox False + 181 0 Illumination 192:80-192:88 ExpBox False + 182 0 Illumination 192:75-192:88 ExpBox True + 183 32512 Illumination 177:1-199:75 TopLevelBox ["unobscure"] + 184 28811 Illumination 174:61-174:63 ExpBox False + 185 28811 Illumination 174:65-174:67 ExpBox False + 186 32512 Illumination 174:69-174:73 ExpBox False + 187 32512 Illumination 174:50-174:74 ExpBox False + 188 32512 Illumination 174:76-174:81 ExpBox False + 189 32512 Illumination 174:45-174:82 ExpBox False + 190 32512 Illumination 174:35-174:82 ExpBox False + 191 32512 Illumination 174:1-174:82 TopLevelBox ["unobscured"] + 192 1 Illumination 169:46-169:46 ExpBox False + 193 1 Illumination 169:48-169:48 ExpBox False + 194 1 Illumination 169:38-169:49 ExpBox False + 195 1 Illumination 169:51-169:51 ExpBox False + 196 1 Illumination 169:32-169:51 ExpBox True + 197 0 Illumination 170:56-170:56 ExpBox False + 198 0 Illumination 170:58-170:58 ExpBox False + 199 0 Illumination 170:48-170:59 ExpBox False + 200 0 Illumination 170:61-170:61 ExpBox False + 201 0 Illumination 170:37-170:61 ExpBox True + 202 0 Illumination 171:60-171:60 ExpBox False + 203 0 Illumination 171:62-171:62 ExpBox False + 204 0 Illumination 171:52-171:63 ExpBox False + 205 0 Illumination 171:73-171:73 ExpBox False + 206 0 Illumination 171:75-171:75 ExpBox False + 207 0 Illumination 171:65-171:76 ExpBox False + 208 0 Illumination 171:78-171:78 ExpBox False + 209 0 Illumination 171:80-171:80 ExpBox False + 210 0 Illumination 171:82-171:82 ExpBox False + 211 0 Illumination 171:42-171:82 ExpBox True + 212 1 Illumination 169:1-171:82 TopLevelBox ["transformLight"] + 213 0 Illumination 167:20-167:20 ExpBox False + 214 0 Illumination 167:22-167:22 ExpBox False + 215 0 Illumination 167:24-167:24 ExpBox False + 216 0 Illumination 167:13-167:25 ExpBox False + 217 0 Illumination 167:34-167:34 ExpBox False + 218 0 Illumination 167:36-167:36 ExpBox False + 219 0 Illumination 167:38-167:38 ExpBox False + 220 0 Illumination 167:27-167:39 ExpBox False + 221 0 Illumination 167:41-167:43 ExpBox False + 222 0 Illumination 167:45-167:50 ExpBox False + 223 0 Illumination 167:52-167:54 ExpBox False + 224 0 Illumination 167:3-167:54 ExpBox False + 225 0 Illumination 166:1-167:54 TopLevelBox ["spotlight"] + 226 0 Illumination 165:21-165:21 ExpBox False + 227 0 Illumination 165:23-165:23 ExpBox False + 228 0 Illumination 165:25-165:25 ExpBox False + 229 0 Illumination 165:14-165:26 ExpBox False + 230 0 Illumination 165:28-165:32 ExpBox False + 231 0 Illumination 165:3-165:32 ExpBox False + 232 0 Illumination 164:1-165:32 TopLevelBox ["pointlight"] + 233 1 Illumination 163:30-163:30 ExpBox False + 234 1 Illumination 163:28-163:31 ExpBox False + 235 1 Illumination 163:35-163:35 ExpBox False + 236 1 Illumination 163:33-163:36 ExpBox False + 237 1 Illumination 163:40-163:40 ExpBox False + 238 1 Illumination 163:38-163:41 ExpBox False + 239 1 Illumination 163:20-163:42 ExpBox False + 240 1 Illumination 163:9-163:43 ExpBox False + 241 1 Illumination 163:45-163:49 ExpBox False + 242 1 Illumination 163:3-163:49 ExpBox False + 243 1 Illumination 162:1-163:49 TopLevelBox ["light"] + 244 180000 Illumination 152:31-152:31 ExpBox False + 245 180000 Illumination 152:24-152:31 ExpBox False + 246 180000 Illumination 152:35-152:37 ExpBox False + 247 180000 Illumination 152:23-152:38 ExpBox False + 248 180000 Illumination 152:17-152:38 ExpBox False + 249 180000 Illumination 152:1-152:38 TopLevelBox ["scalePixel'"] + 250 0 Illumination 148:14-148:28 ExpBox False + 251 0 Illumination 148:38-148:40 ExpBox False + 252 0 Illumination 148:33-148:40 ExpBox False + 253 0 Illumination 148:45-148:47 ExpBox False + 254 0 Illumination 148:57-148:58 ExpBox False + 255 0 Illumination 148:52-148:58 ExpBox False + 256 0 Illumination 148:63-148:71 ExpBox False + 257 0 Illumination 148:52-148:71 ExpBox False + 258 0 Illumination 148:45-148:71 ExpBox False + 259 0 Illumination 148:33-148:71 ExpBox False + 260 0 Illumination 148:14-148:71 ExpBox False + 261 0 Illumination 148:5-148:71 LocalBox ["showBitmap'","header"] + 262 1 Illumination 146:20-146:22 ExpBox False + 263 1 Illumination 145:38-145:44 ExpBox False + 264 200 Illumination 145:46-145:47 ExpBox False + 265 200 Illumination 145:34-145:47 ExpBox False + 266 60000 Illumination 144:37-144:37 ExpBox False + 267 60000 Illumination 144:25-144:37 ExpBox False + 268 60000 Illumination 144:51-144:51 ExpBox False + 269 60000 Illumination 144:39-144:51 ExpBox False + 270 60000 Illumination 144:65-144:65 ExpBox False + 271 60000 Illumination 144:53-144:65 ExpBox False + 272 60000 Illumination 144:24-144:66 ExpBox False + 273 200 Illumination 144:21-145:48 ExpBox False + 274 200 Illumination 144:14-145:48 ExpBox False + 275 1 Illumination 144:12-146:24 ExpBox False + 276 1 Illumination 144:5-146:24 ExpBox True + 277 0 Illumination 149:27-149:61 ExpBox False + 278 0 Illumination 149:21-149:61 ExpBox True + 279 1 Illumination 142:1-149:61 TopLevelBox ["showBitmap'"] + 280 0 Illumination 139:35-139:35 ExpBox False + 281 0 Illumination 139:28-139:35 ExpBox False + 282 0 Illumination 139:39-139:41 ExpBox False + 283 0 Illumination 139:27-139:42 ExpBox False + 284 0 Illumination 139:20-139:43 ExpBox False + 285 0 Illumination 139:16-139:43 ExpBox False + 286 0 Illumination 139:1-139:43 TopLevelBox ["scalePixel"] + 287 0 Illumination 135:14-135:28 ExpBox False + 288 0 Illumination 135:38-135:40 ExpBox False + 289 0 Illumination 135:33-135:40 ExpBox False + 290 0 Illumination 135:45-135:47 ExpBox False + 291 0 Illumination 135:57-135:58 ExpBox False + 292 0 Illumination 135:52-135:58 ExpBox False + 293 0 Illumination 135:63-135:71 ExpBox False + 294 0 Illumination 135:52-135:71 ExpBox False + 295 0 Illumination 135:45-135:71 ExpBox False + 296 0 Illumination 135:33-135:71 ExpBox False + 297 0 Illumination 135:14-135:71 ExpBox False + 298 0 Illumination 135:5-135:71 LocalBox ["showBitmap","header"] + 299 0 Illumination 132:5-132:10 ExpBox False + 300 0 Illumination 133:31-133:33 ExpBox False + 301 0 Illumination 133:51-133:57 ExpBox False + 302 0 Illumination 133:59-133:60 ExpBox False + 303 0 Illumination 133:47-133:60 ExpBox False + 304 0 Illumination 132:35-132:35 ExpBox False + 305 0 Illumination 132:24-132:35 ExpBox False + 306 0 Illumination 132:48-132:48 ExpBox False + 307 0 Illumination 132:37-132:48 ExpBox False + 308 0 Illumination 132:61-132:61 ExpBox False + 309 0 Illumination 132:50-132:61 ExpBox False + 310 0 Illumination 132:23-132:62 ExpBox False + 311 0 Illumination 132:22-133:61 ExpBox False + 312 0 Illumination 132:15-133:61 ExpBox False + 313 0 Illumination 132:5-133:61 ExpBox True + 314 0 Illumination 136:26-136:60 ExpBox False + 315 0 Illumination 136:20-136:60 ExpBox True + 316 0 Illumination 130:1-136:60 TopLevelBox ["showBitmap"] + 317 0 Illumination 127:14-127:28 ExpBox False + 318 0 Illumination 127:38-127:40 ExpBox False + 319 0 Illumination 127:33-127:40 ExpBox False + 320 0 Illumination 127:45-127:47 ExpBox False + 321 0 Illumination 127:57-127:58 ExpBox False + 322 0 Illumination 127:52-127:58 ExpBox False + 323 0 Illumination 127:63-127:71 ExpBox False + 324 0 Illumination 127:52-127:71 ExpBox False + 325 0 Illumination 127:45-127:71 ExpBox False + 326 0 Illumination 127:33-127:71 ExpBox False + 327 0 Illumination 127:14-127:71 ExpBox False + 328 0 Illumination 127:5-127:71 LocalBox ["showBitmapA","header"] + 329 0 Illumination 126:36-126:38 ExpBox False + 330 0 Illumination 126:28-126:38 ExpBox False + 331 0 Illumination 125:34-125:34 ExpBox False + 332 0 Illumination 125:23-125:34 ExpBox False + 333 0 Illumination 125:48-125:48 ExpBox False + 334 0 Illumination 125:37-125:48 ExpBox False + 335 0 Illumination 125:62-125:62 ExpBox False + 336 0 Illumination 125:51-125:62 ExpBox False + 337 0 Illumination 125:22-125:63 ExpBox False + 338 0 Illumination 125:5-126:38 LocalBox ["showBitmapA","scaleColor"] + 339 0 Illumination 123:5-123:10 ExpBox False + 340 0 Illumination 123:25-123:34 ExpBox False + 341 0 Illumination 123:43-123:45 ExpBox False + 342 0 Illumination 123:36-123:46 ExpBox False + 343 0 Illumination 123:15-123:46 ExpBox False + 344 0 Illumination 123:5-123:46 ExpBox False + 345 0 Illumination 122:1-127:71 TopLevelBox ["showBitmapA"] + 346 32512 Illumination 118:23-118:24 ExpBox False + 347 32512 Illumination 118:26-118:28 ExpBox False + 348 32512 Illumination 118:16-118:28 ExpBox False + 349 32512 Illumination 118:5-118:28 LocalBox ["illum","recCoeff"] + 350 26727 Illumination 105:18-105:18 ExpBox False + 351 26727 Illumination 105:29-105:29 ExpBox False + 352 26727 Illumination 105:37-105:41 ExpBox False + 353 26727 Illumination 105:43-105:43 ExpBox False + 354 26727 Illumination 105:33-105:43 ExpBox False + 355 26727 Illumination 105:28-105:44 ExpBox False + 356 26727 Illumination 105:46-105:50 ExpBox False + 357 26727 Illumination 105:20-105:51 ExpBox False + 358 26727 Illumination 105:12-105:51 ExpBox False + 359 26727 Illumination 105:5-105:51 LocalBox ["illum","newV"] + 360 26727 Illumination 119:29-119:31 ExpBox False + 361 26727 Illumination 119:34-119:36 ExpBox False + 362 26727 Illumination 119:38-119:41 ExpBox False + 363 26727 Illumination 119:33-119:42 ExpBox False + 364 26727 Illumination 119:16-119:42 ExpBox False + 365 26727 Illumination 119:5-119:42 LocalBox ["illum","recRay"] + 366 32512 Illumination 117:19-117:26 ExpBox False + 367 32512 Illumination 117:36-117:40 ExpBox False + 368 32512 Illumination 117:19-117:40 ExpBox False + 369 5785 Illumination 117:19-117:40 BinBox CondBinBox True + 370 26727 Illumination 117:19-117:40 BinBox CondBinBox False + 371 5785 Illumination 117:47-117:51 ExpBox True + 372 26727 Illumination 117:65-117:72 ExpBox False + 373 26727 Illumination 117:74-117:79 ExpBox False + 374 26727 Illumination 117:58-117:79 ExpBox True + 375 32512 Illumination 117:16-117:79 ExpBox False + 376 32512 Illumination 117:5-117:79 LocalBox ["illum","recTerm"] + 377 32512 Illumination 104:19-104:21 ExpBox False + 378 32512 Illumination 104:11-104:21 ExpBox False + 379 32512 Illumination 104:5-104:21 LocalBox ["illum","amb"] + 380 32512 Illumination 107:22-107:23 ExpBox False + 381 32512 Illumination 107:33-107:35 ExpBox False + 382 32512 Illumination 107:37-107:39 ExpBox False + 383 32512 Illumination 107:25-107:40 ExpBox False + 384 32512 Illumination 107:15-107:40 ExpBox False + 385 32512 Illumination 107:5-107:40 LocalBox ["illum","ambTerm"] + 386 0 Illumination 103:15-103:17 ExpBox False + 387 0 Illumination 103:9-103:17 ExpBox False + 388 0 Illumination 103:5-103:17 LocalBox ["illum","d"] + 389 28811 Illumination 102:32-102:34 ExpBox False + 390 28811 Illumination 102:44-102:46 ExpBox False + 391 28811 Illumination 102:36-102:47 ExpBox False + 392 32512 Illumination 102:57-102:59 ExpBox False + 393 32512 Illumination 102:49-102:60 ExpBox False + 394 32512 Illumination 102:62-102:66 ExpBox False + 395 32512 Illumination 102:21-102:66 ExpBox False + 396 32512 Illumination 102:5-102:66 LocalBox ["illum","visibleLights"] + 397 32512 Illumination 108:22-108:23 ExpBox False + 398 32512 Illumination 109:36-109:48 ExpBox False + 399 26812 Illumination 110:35-110:57 ExpBox False + 400 26812 Illumination 110:25-110:57 ExpBox False + 401 26812 Illumination 110:20-110:57 LocalBox ["illum","difTerm","lj"] + 402 26812 Illumination 108:45-108:49 ExpBox False + 403 26812 Illumination 108:51-108:52 ExpBox False + 404 26812 Illumination 108:40-108:53 ExpBox False + 405 26812 Illumination 108:63-108:71 ExpBox False + 406 26812 Illumination 108:73-108:75 ExpBox False + 407 26812 Illumination 108:55-108:76 ExpBox False + 408 26812 Illumination 108:33-108:76 ExpBox False + 409 32512 Illumination 108:32-110:58 ExpBox False + 410 32512 Illumination 108:25-110:59 ExpBox False + 411 32512 Illumination 108:15-110:59 ExpBox False + 412 32512 Illumination 108:5-110:59 LocalBox ["illum","difTerm"] + 413 32512 Illumination 112:22-112:23 ExpBox False + 414 32512 Illumination 113:36-113:48 ExpBox False + 415 26812 Illumination 115:53-115:55 ExpBox False + 416 26812 Illumination 115:43-115:55 ExpBox False + 417 26812 Illumination 115:20-115:55 LocalBox ["illum","spcTerm","lj"] + 418 26812 Illumination 116:36-116:37 ExpBox False + 419 26812 Illumination 116:57-116:57 ExpBox False + 420 26812 Illumination 116:47-116:57 ExpBox False + 421 26812 Illumination 116:35-116:58 ExpBox False + 422 26812 Illumination 116:25-116:58 ExpBox False + 423 26812 Illumination 116:20-116:58 LocalBox ["illum","spcTerm","hj"] + 424 26812 Illumination 112:46-112:50 ExpBox False + 425 26812 Illumination 112:52-112:53 ExpBox False + 426 26812 Illumination 112:41-112:54 ExpBox False + 427 26812 Illumination 112:59-112:59 ExpBox False + 428 26812 Illumination 112:40-112:61 ExpBox False + 429 26812 Illumination 112:71-112:79 ExpBox False + 430 26812 Illumination 112:81-112:83 ExpBox False + 431 26812 Illumination 112:63-112:84 ExpBox False + 432 26812 Illumination 112:33-112:84 ExpBox False + 433 32512 Illumination 112:32-116:59 ExpBox False + 434 32512 Illumination 112:25-116:60 ExpBox False + 435 32512 Illumination 112:15-116:60 ExpBox False + 436 32512 Illumination 112:5-116:60 LocalBox ["illum","spcTerm"] + 437 32512 Illumination 100:5-100:11 ExpBox False + 438 32512 Illumination 100:21-100:27 ExpBox False + 439 32512 Illumination 100:5-100:27 ExpBox False + 440 32512 Illumination 100:37-100:43 ExpBox False + 441 32512 Illumination 100:5-100:43 ExpBox False + 442 32512 Illumination 100:53-100:59 ExpBox False + 443 32512 Illumination 100:5-100:59 ExpBox False + 444 32512 Illumination 99:1-119:42 TopLevelBox ["illum"] + 445 86727 Illumination 93:11-93:13 ExpBox False + 446 86727 Illumination 93:5-93:13 ExpBox False + 447 86727 Illumination 93:18-93:18 ExpBox False + 448 86727 Illumination 93:5-93:18 ExpBox False + 449 0 Illumination 93:5-93:18 BinBox GuardBinBox True + 450 86727 Illumination 93:5-93:18 BinBox GuardBinBox False + 451 0 Illumination 93:22-93:26 ExpBox True + 452 86727 Illumination 94:5-94:13 ExpBox False + 453 86727 Illumination 94:5-94:13 BinBox GuardBinBox True + 454 0 Illumination 94:5-94:13 BinBox GuardBinBox False + 455 86727 Illumination 94:35-94:35 ExpBox False + 456 86727 Illumination 94:37-94:37 ExpBox False + 457 86727 Illumination 94:34-94:38 ExpBox False + 458 86727 Illumination 94:48-94:50 ExpBox False + 459 86727 Illumination 94:40-94:51 ExpBox False + 460 86727 Illumination 94:26-94:51 ExpBox False + 461 54215 Illumination 95:34-95:38 ExpBox True + 462 32512 Illumination 96:43-96:45 ExpBox False + 463 26727 Illumination 96:60-96:62 ExpBox False + 464 26727 Illumination 96:53-96:63 ExpBox False + 465 26727 Illumination 96:65-96:65 ExpBox False + 466 26727 Illumination 96:53-96:65 ExpBox False + 467 32512 Illumination 96:42-96:67 ExpBox False + 468 32512 Illumination 96:69-96:72 ExpBox False + 469 28808 Illumination 96:74-96:74 ExpBox False + 470 32512 Illumination 96:36-96:74 ExpBox True + 471 86727 Illumination 94:21-96:74 ExpBox True + 472 86727 Illumination 92:1-96:74 TopLevelBox ["illumination"] + 473 0 Illumination 88:36-88:38 ExpBox False + 474 0 Illumination 88:28-88:38 ExpBox False + 475 0 Illumination 86:28-86:28 ExpBox False + 476 0 Illumination 86:23-86:29 ExpBox False + 477 0 Illumination 86:33-86:36 ExpBox False + 478 0 Illumination 86:23-86:36 ExpBox False + 479 0 Illumination 86:46-86:46 ExpBox False + 480 0 Illumination 86:41-86:47 ExpBox False + 481 0 Illumination 86:52-86:54 ExpBox False + 482 0 Illumination 86:41-86:54 ExpBox False + 483 0 Illumination 86:64-86:64 ExpBox False + 484 0 Illumination 86:59-86:65 ExpBox False + 485 0 Illumination 86:69-86:71 ExpBox False + 486 0 Illumination 86:59-86:71 ExpBox False + 487 0 Illumination 86:41-86:71 ExpBox False + 488 0 Illumination 86:23-86:71 ExpBox False + 489 0 Illumination 86:9-88:38 LocalBox ["contrast","diffMax"] + 490 0 Illumination 85:15-85:17 ExpBox False + 491 0 Illumination 85:22-85:22 ExpBox False + 492 0 Illumination 85:25-85:25 ExpBox False + 493 0 Illumination 85:21-85:26 ExpBox False + 494 0 Illumination 85:15-85:26 ExpBox False + 495 0 Illumination 85:9-85:26 LocalBox ["contrast","cur"] + 496 0 Illumination 82:27-82:33 ExpBox False + 497 0 Illumination 83:45-83:45 ExpBox False + 498 0 Illumination 83:44-83:45 ExpBox False + 499 0 Illumination 83:48-83:48 ExpBox False + 500 0 Illumination 83:43-83:49 ExpBox False + 501 0 Illumination 83:60-83:60 ExpBox False + 502 0 Illumination 83:59-83:60 ExpBox False + 503 0 Illumination 83:63-83:63 ExpBox False + 504 0 Illumination 83:58-83:64 ExpBox False + 505 0 Illumination 82:43-82:45 ExpBox False + 506 0 Illumination 82:48-82:50 ExpBox False + 507 0 Illumination 82:55-82:55 ExpBox False + 508 0 Illumination 82:59-82:60 ExpBox False + 509 0 Illumination 82:55-82:60 ExpBox False + 510 0 Illumination 82:63-82:63 ExpBox False + 511 0 Illumination 82:67-82:68 ExpBox False + 512 0 Illumination 82:63-82:68 ExpBox False + 513 0 Illumination 82:54-82:69 ExpBox False + 514 0 Illumination 82:47-82:70 ExpBox False + 515 0 Illumination 82:37-82:70 ExpBox False + 516 0 Illumination 82:35-84:35 ExpBox False + 517 0 Illumination 82:23-84:35 ExpBox False + 518 0 Illumination 82:1-88:38 TopLevelBox ["contrast"] + 519 0 Illumination 79:33-79:33 ExpBox False + 520 0 Illumination 79:37-79:37 ExpBox False + 521 0 Illumination 79:32-79:38 ExpBox False + 522 0 Illumination 79:41-79:41 ExpBox False + 523 0 Illumination 79:45-79:45 ExpBox False + 524 0 Illumination 79:40-79:46 ExpBox False + 525 0 Illumination 79:49-79:49 ExpBox False + 526 0 Illumination 79:53-79:53 ExpBox False + 527 0 Illumination 79:48-79:54 ExpBox False + 528 0 Illumination 79:26-79:54 ExpBox False + 529 0 Illumination 79:9-79:54 LocalBox ["avg","divN"] + 530 0 Illumination 78:37-78:38 ExpBox False + 531 0 Illumination 78:29-78:39 ExpBox False + 532 0 Illumination 78:15-78:40 ExpBox False + 533 0 Illumination 78:58-78:59 ExpBox False + 534 0 Illumination 78:51-78:60 ExpBox False + 535 0 Illumination 78:42-78:61 ExpBox False + 536 0 Illumination 78:10-78:61 ExpBox False + 537 0 Illumination 78:1-79:54 TopLevelBox ["avg"] + 538 1 Illumination 68:27-68:28 ExpBox False + 539 1 Illumination 68:14-68:28 ExpBox False + 540 1 Illumination 68:45-68:47 ExpBox False + 541 1 Illumination 68:32-68:47 ExpBox False + 542 1 Illumination 68:14-68:47 ExpBox False + 543 1 Illumination 68:5-68:47 LocalBox ["render","aspect"] + 544 1 Illumination 66:14-66:14 ExpBox False + 545 1 Illumination 66:23-66:25 ExpBox False + 546 1 Illumination 66:27-66:27 ExpBox False + 547 1 Illumination 66:22-66:28 ExpBox False + 548 1 Illumination 66:18-66:28 ExpBox False + 549 1 Illumination 66:14-66:28 ExpBox False + 550 1 Illumination 66:5-66:28 LocalBox ["render","width"] + 551 1 Illumination 67:14-67:18 ExpBox False + 552 1 Illumination 67:35-67:37 ExpBox False + 553 1 Illumination 67:22-67:37 ExpBox False + 554 1 Illumination 67:14-67:37 ExpBox False + 555 1 Illumination 67:5-67:37 LocalBox ["render","delta"] + 556 1 Illumination 69:16-69:20 ExpBox False + 557 1 Illumination 69:24-69:24 ExpBox False + 558 1 Illumination 69:16-69:24 ExpBox False + 559 1 Illumination 69:14-69:24 ExpBox False + 560 1 Illumination 69:5-69:24 LocalBox ["render","left"] + 561 1 Illumination 70:16-70:19 ExpBox False + 562 1 Illumination 70:23-70:28 ExpBox False + 563 1 Illumination 70:16-70:28 ExpBox False + 564 1 Illumination 70:14-70:28 ExpBox False + 565 1 Illumination 70:5-70:28 LocalBox ["render","top"] + 566 60000 Illumination 71:25-71:28 ExpBox False + 567 60000 Illumination 71:32-71:32 ExpBox False + 568 60000 Illumination 71:34-71:38 ExpBox False + 569 60000 Illumination 71:32-71:38 ExpBox False + 570 60000 Illumination 71:24-71:39 ExpBox False + 571 60000 Illumination 71:42-71:44 ExpBox False + 572 60000 Illumination 71:48-71:48 ExpBox False + 573 60000 Illumination 71:50-71:54 ExpBox False + 574 60000 Illumination 71:48-71:54 ExpBox False + 575 60000 Illumination 71:41-71:55 ExpBox False + 576 60000 Illumination 71:57-71:57 ExpBox False + 577 60000 Illumination 71:17-71:57 ExpBox False + 578 60000 Illumination 71:5-71:57 LocalBox ["render","pixel"] + 579 1 Illumination 65:21-65:21 ExpBox False + 580 1 Illumination 65:23-65:23 ExpBox False + 581 1 Illumination 65:27-65:27 ExpBox False + 582 1 Illumination 65:25-65:28 ExpBox False + 583 1 Illumination 65:14-65:28 ExpBox False + 584 1 Illumination 65:5-65:28 LocalBox ["render","start"] + 585 1 Illumination 51:41-51:42 ExpBox False + 586 1 Illumination 51:29-51:30 ExpBox False + 587 1 Illumination 51:32-51:32 ExpBox False + 588 1 Illumination 51:14-51:32 ExpBox False + 589 1 Illumination 51:12-51:44 ExpBox False + 590 1 Illumination 51:5-51:44 LocalBox ["render","ls'"] + 591 1 Illumination 50:23-50:24 ExpBox False + 592 1 Illumination 50:26-50:26 ExpBox False + 593 1 Illumination 50:22-50:27 ExpBox False + 594 1 Illumination 50:29-50:31 ExpBox False + 595 1 Illumination 50:12-50:31 ExpBox False + 596 1 Illumination 50:5-50:31 LocalBox ["render","obj'"] + 597 1 Illumination 64:27-64:29 ExpBox False + 598 1 Illumination 64:39-64:41 ExpBox False + 599 1 Illumination 64:52-64:55 ExpBox False + 600 1 Illumination 64:64-64:66 ExpBox False + 601 1 Illumination 64:14-64:67 ExpBox False + 602 1 Illumination 64:5-64:67 LocalBox ["render","cxt"] + 603 0 Illumination 52:26-52:26 ExpBox False + 604 0 Illumination 52:28-52:28 ExpBox False + 605 0 Illumination 52:25-52:29 ExpBox False + 606 0 Illumination 52:33-52:34 ExpBox False + 607 0 Illumination 52:36-52:38 ExpBox False + 608 0 Illumination 52:32-52:39 ExpBox False + 609 0 Illumination 52:24-52:40 ExpBox False + 610 0 Illumination 54:36-54:37 ExpBox False + 611 0 Illumination 54:41-54:43 ExpBox False + 612 0 Illumination 54:40-54:46 ExpBox False + 613 0 Illumination 54:31-54:46 ExpBox False + 614 0 Illumination 55:36-55:38 ExpBox False + 615 0 Illumination 55:41-55:43 ExpBox False + 616 0 Illumination 55:40-55:46 ExpBox False + 617 0 Illumination 55:31-55:46 ExpBox False + 618 0 Illumination 53:39-53:41 ExpBox False + 619 0 Illumination 53:44-53:48 ExpBox False + 620 0 Illumination 53:56-53:56 ExpBox False + 621 0 Illumination 53:58-53:58 ExpBox False + 622 0 Illumination 53:50-53:58 ExpBox False + 623 0 Illumination 53:43-53:59 ExpBox False + 624 0 Illumination 53:26-53:59 ExpBox False + 625 0 Illumination 53:24-55:48 ExpBox False + 626 0 Illumination 52:14-55:48 ExpBox False + 627 0 Illumination 52:5-55:48 LocalBox ["render","pixelA"] + 628 1 Illumination 62:26-62:27 ExpBox False + 629 1 Illumination 62:30-62:32 ExpBox False + 630 1 Illumination 62:29-62:35 ExpBox False + 631 1 Illumination 62:21-62:35 ExpBox False + 632 200 Illumination 61:64-61:66 ExpBox False + 633 1 Illumination 61:69-61:71 ExpBox False + 634 1 Illumination 61:68-61:74 ExpBox False + 635 200 Illumination 61:59-61:74 ExpBox False + 636 60000 Illumination 61:31-61:33 ExpBox False + 637 60000 Illumination 61:36-61:40 ExpBox False + 638 60000 Illumination 61:48-61:48 ExpBox False + 639 60000 Illumination 61:50-61:50 ExpBox False + 640 60000 Illumination 61:42-61:50 ExpBox False + 641 60000 Illumination 61:35-61:51 ExpBox False + 642 60000 Illumination 61:18-61:51 ExpBox False + 643 200 Illumination 61:16-61:76 ExpBox False + 644 1 Illumination 61:14-63:14 ExpBox False + 645 1 Illumination 61:5-63:14 LocalBox ["render","pixels"] + 646 0 Illumination 73:30-73:32 ExpBox False + 647 0 Illumination 73:36-73:38 ExpBox False + 648 0 Illumination 75:24-75:28 ExpBox False + 649 0 Illumination 75:23-75:28 ExpBox False + 650 0 Illumination 75:31-75:33 ExpBox False + 651 0 Illumination 75:22-75:34 ExpBox False + 652 0 Illumination 75:38-75:42 ExpBox False + 653 0 Illumination 75:45-75:47 ExpBox False + 654 0 Illumination 75:37-75:48 ExpBox False + 655 0 Illumination 75:52-75:54 ExpBox False + 656 0 Illumination 75:58-75:62 ExpBox False + 657 0 Illumination 75:57-75:62 ExpBox False + 658 0 Illumination 75:51-75:63 ExpBox False + 659 0 Illumination 75:67-75:69 ExpBox False + 660 0 Illumination 75:72-75:76 ExpBox False + 661 0 Illumination 75:66-75:77 ExpBox False + 662 0 Illumination 75:21-75:78 ExpBox False + 663 0 Illumination 74:22-74:24 ExpBox False + 664 0 Illumination 74:27-74:31 ExpBox False + 665 0 Illumination 74:54-74:54 ExpBox False + 666 0 Illumination 74:41-74:54 ExpBox False + 667 0 Illumination 74:58-74:60 ExpBox False + 668 0 Illumination 74:41-74:60 ExpBox False + 669 0 Illumination 74:64-74:65 ExpBox False + 670 0 Illumination 74:40-74:66 ExpBox False + 671 0 Illumination 74:82-74:82 ExpBox False + 672 0 Illumination 74:69-74:82 ExpBox False + 673 0 Illumination 74:86-74:88 ExpBox False + 674 0 Illumination 74:69-74:88 ExpBox False + 675 0 Illumination 74:92-74:93 ExpBox False + 676 0 Illumination 74:68-74:94 ExpBox False + 677 0 Illumination 74:34-74:94 ExpBox False + 678 0 Illumination 74:26-74:95 ExpBox False + 679 0 Illumination 74:9-74:95 ExpBox False + 680 0 Illumination 74:7-76:7 ExpBox False + 681 0 Illumination 73:36-76:7 ExpBox False + 682 0 Illumination 73:30-76:7 ExpBox False + 683 0 Illumination 73:5-76:7 LocalBox ["render","superSample"] + 684 0 Illumination 56:14-56:19 ExpBox False + 685 0 Illumination 58:22-58:22 ExpBox False + 686 0 Illumination 58:27-58:28 ExpBox False + 687 0 Illumination 58:32-58:32 ExpBox False + 688 0 Illumination 58:27-58:32 ExpBox False + 689 0 Illumination 58:21-58:33 ExpBox False + 690 0 Illumination 58:42-58:42 ExpBox False + 691 0 Illumination 58:47-58:49 ExpBox False + 692 0 Illumination 58:53-58:53 ExpBox False + 693 0 Illumination 58:47-58:53 ExpBox False + 694 0 Illumination 58:41-58:54 ExpBox False + 695 0 Illumination 59:26-59:26 ExpBox False + 696 0 Illumination 59:29-59:29 ExpBox False + 697 0 Illumination 59:25-59:30 ExpBox False + 698 0 Illumination 59:20-59:30 LocalBox ["render","antiA","ix"] + 699 0 Illumination 60:25-60:26 ExpBox False + 700 0 Illumination 60:28-60:33 ExpBox False + 701 0 Illumination 60:16-60:33 ExpBox False + 702 0 Illumination 60:16-60:33 BinBox QualBinBox True + 703 0 Illumination 60:16-60:33 BinBox QualBinBox False + 704 0 Illumination 57:17-57:18 ExpBox False + 705 0 Illumination 57:33-57:34 ExpBox False + 706 0 Illumination 57:37-57:42 ExpBox False + 707 0 Illumination 57:46-57:47 ExpBox False + 708 0 Illumination 57:36-57:48 ExpBox False + 709 0 Illumination 57:21-57:48 ExpBox False + 710 0 Illumination 57:16-57:49 ExpBox False + 711 0 Illumination 57:14-60:35 ExpBox False + 712 0 Illumination 56:14-60:35 ExpBox False + 713 0 Illumination 56:5-60:35 LocalBox ["render","antiA"] + 714 0 Illumination 44:24-44:25 ExpBox False + 715 1 Illumination 44:17-44:25 ExpBox False + 716 1 Illumination 44:5-44:25 LocalBox ["render","debugging"] + 717 1 Illumination 32:10-32:18 ExpBox False + 718 1 Illumination 33:26-33:40 ExpBox False + 719 1 Illumination 33:17-33:40 ExpBox False + 720 1 Illumination 34:26-34:28 ExpBox False + 721 1 Illumination 34:21-34:28 ExpBox False + 722 1 Illumination 34:14-34:28 LocalBox ["render","vals"] + 723 0 Illumination 35:36-35:38 ExpBox False + 724 0 Illumination 35:40-35:41 ExpBox False + 725 1 Illumination 35:43-35:48 ExpBox False + 726 1 Illumination 35:24-35:48 ExpBox False + 727 1 Illumination 35:14-35:48 LocalBox ["render","rt_vals"] + 728 1 Illumination 36:20-36:23 ExpBox False + 729 1 Illumination 36:13-36:23 ExpBox False + 730 1 Illumination 36:35-36:41 ExpBox False + 731 1 Illumination 36:28-36:41 ExpBox False + 732 1 Illumination 36:13-36:41 ExpBox False + 733 0 Illumination 36:13-36:41 BinBox CondBinBox True + 734 1 Illumination 36:13-36:41 BinBox CondBinBox False + 735 0 Illumination 37:24-37:35 ExpBox False + 736 0 Illumination 37:44-37:47 ExpBox False + 737 0 Illumination 37:37-37:47 ExpBox False + 738 0 Illumination 37:56-37:62 ExpBox False + 739 0 Illumination 37:49-37:62 ExpBox False + 740 0 Illumination 37:23-37:63 ExpBox False + 741 0 Illumination 37:17-37:63 ExpBox True + 742 180000 Illumination 39:59-39:59 ExpBox False + 743 180000 Illumination 39:63-39:63 ExpBox False + 744 180000 Illumination 39:58-39:64 ExpBox False + 745 180000 Illumination 39:54-39:64 ExpBox False + 746 180000 Illumination 39:73-39:73 ExpBox False + 747 180000 Illumination 39:77-39:77 ExpBox False + 748 180000 Illumination 39:72-39:78 ExpBox False + 749 180000 Illumination 39:68-39:78 ExpBox False + 750 180000 Illumination 39:54-39:78 ExpBox False + 751 1 Illumination 39:44-39:79 ExpBox False + 752 1 Illumination 39:81-39:84 ExpBox False + 753 1 Illumination 39:86-39:92 ExpBox False + 754 1 Illumination 39:35-39:93 ExpBox False + 755 1 Illumination 39:32-39:93 ExpBox False + 756 1 Illumination 39:26-39:93 LocalBox ["render","cmp"] + 757 1 Illumination 40:22-40:26 ExpBox False + 758 1 Illumination 40:33-40:35 ExpBox False + 759 1 Illumination 40:48-40:51 ExpBox False + 760 1 Illumination 40:41-40:51 ExpBox False + 761 1 Illumination 40:55-40:56 ExpBox False + 762 1 Illumination 40:40-40:57 ExpBox False + 763 1 Illumination 40:33-40:57 ExpBox False + 764 1 Illumination 40:33-40:57 BinBox CondBinBox True + 765 0 Illumination 40:33-40:57 BinBox CondBinBox False + 766 1 Illumination 40:64-40:77 ExpBox True + 767 0 Illumination 40:85-40:96 ExpBox False + 768 0 Illumination 40:106-40:108 ExpBox False + 769 0 Illumination 40:101-40:108 ExpBox False + 770 0 Illumination 40:84-40:109 ExpBox True + 771 1 Illumination 40:30-40:109 ExpBox False + 772 1 Illumination 40:22-40:109 ExpBox False + 773 1 Illumination 38:17-41:20 ExpBox True + 774 1 Illumination 36:10-41:20 ExpBox False + 775 1 Illumination 32:5-41:21 ExpBox False + 776 1 Illumination 31:1-76:7 TopLevelBox ["render"] + 777 0 Illumination 159:13-159:16 TopLevelBox ["showsPrec"] + 778 0 Illumination 159:13-159:16 TopLevelBox ["showList"] + 779 0 Illumination 27:18-27:21 TopLevelBox ["showsPrec"] + 780 0 Illumination 27:18-27:21 TopLevelBox ["showList"] + 0 0 Primitives 24:16-24:16 ExpBox False + 1 0 Primitives 24:11-24:16 ExpBox False + 2 0 Primitives 24:20-24:22 ExpBox False + 3 0 Primitives 24:11-24:22 ExpBox False + 4 0 Primitives 24:26-24:27 ExpBox False + 5 0 Primitives 24:11-24:27 ExpBox False + 6 0 Primitives 24:1-24:27 TopLevelBox ["asinD"] + 7 0 Primitives 21:16-21:16 ExpBox False + 8 0 Primitives 21:11-21:16 ExpBox False + 9 0 Primitives 21:20-21:22 ExpBox False + 10 0 Primitives 21:11-21:22 ExpBox False + 11 0 Primitives 21:26-21:27 ExpBox False + 12 0 Primitives 21:11-21:27 ExpBox False + 13 0 Primitives 21:1-21:27 TopLevelBox ["acosD"] + 14 0 Primitives 18:8-18:10 ExpBox False + 15 0 Primitives 18:1-18:10 TopLevelBox ["addf"] + 16 0 Primitives 15:8-15:10 ExpBox False + 17 0 Primitives 15:1-15:10 TopLevelBox ["addi"] + 18 2 Primitives 12:13-12:13 ExpBox False + 19 2 Primitives 12:17-12:18 ExpBox False + 20 2 Primitives 12:13-12:18 ExpBox False + 21 2 Primitives 12:22-12:24 ExpBox False + 22 2 Primitives 12:13-12:24 ExpBox False + 23 2 Primitives 12:1-12:24 TopLevelBox ["deg2rad"] + 24 0 Primitives 9:13-9:13 ExpBox False + 25 0 Primitives 9:17-9:19 ExpBox False + 26 0 Primitives 9:13-9:19 ExpBox False + 27 0 Primitives 9:23-9:24 ExpBox False + 28 0 Primitives 9:13-9:24 ExpBox False + 29 0 Primitives 9:1-9:24 TopLevelBox ["rad2deg"] + 0 0 Misc 10:20-10:20 ExpBox False + 1 0 Misc 10:24-10:28 ExpBox False + 2 0 Misc 10:37-10:37 ExpBox False + 3 0 Misc 10:32-10:37 ExpBox False + 4 0 Misc 10:42-10:45 ExpBox False + 5 0 Misc 10:32-10:45 ExpBox False + 6 0 Misc 10:24-10:45 ExpBox False + 7 0 Misc 10:19-10:46 ExpBox False + 8 0 Misc 10:48-10:48 ExpBox False + 9 0 Misc 10:13-10:48 ExpBox False + 10 0 Misc 10:1-10:48 TopLevelBox ["debug"] + 0 6 Construct 258:23-258:24 ExpBox False + 1 6 Construct 258:26-258:27 ExpBox False + 2 6 Construct 258:29-258:30 ExpBox False + 3 6 Construct 258:17-258:30 ExpBox False + 4 6 Construct 259:23-259:24 ExpBox False + 5 6 Construct 259:26-259:27 ExpBox False + 6 6 Construct 259:29-259:30 ExpBox False + 7 6 Construct 259:17-259:30 ExpBox False + 8 6 Construct 260:23-260:24 ExpBox False + 9 6 Construct 260:26-260:27 ExpBox False + 10 6 Construct 260:29-260:30 ExpBox False + 11 6 Construct 260:17-260:30 ExpBox False + 12 6 Construct 261:23-261:24 ExpBox False + 13 6 Construct 261:26-261:27 ExpBox False + 14 6 Construct 261:29-261:30 ExpBox False + 15 6 Construct 261:17-261:30 ExpBox False + 16 6 Construct 262:23-262:24 ExpBox False + 17 6 Construct 262:26-262:27 ExpBox False + 18 6 Construct 262:29-262:30 ExpBox False + 19 6 Construct 262:17-262:30 ExpBox False + 20 6 Construct 263:23-263:24 ExpBox False + 21 6 Construct 263:26-263:27 ExpBox False + 22 6 Construct 263:29-263:30 ExpBox False + 23 6 Construct 263:17-263:30 ExpBox False + 24 6 Construct 264:23-264:24 ExpBox False + 25 6 Construct 264:26-264:27 ExpBox False + 26 6 Construct 264:29-264:30 ExpBox False + 27 6 Construct 264:17-264:30 ExpBox False + 28 6 Construct 265:23-265:24 ExpBox False + 29 6 Construct 265:26-265:27 ExpBox False + 30 6 Construct 265:29-265:30 ExpBox False + 31 6 Construct 265:17-265:30 ExpBox False + 32 6 Construct 258:16-265:31 ExpBox False + 33 6 Construct 258:9-265:31 LocalBox ["transformBox","pts"] + 34 6 Construct 257:28-257:28 ExpBox False + 35 6 Construct 257:20-257:29 ExpBox False + 36 6 Construct 257:31-257:33 ExpBox False + 37 6 Construct 257:16-257:33 ExpBox False + 38 6 Construct 257:9-257:33 LocalBox ["transformBox","pts'"] + 39 6 Construct 251:16-251:18 ExpBox False + 40 6 Construct 251:25-251:30 ExpBox False + 41 6 Construct 251:32-251:35 ExpBox False + 42 6 Construct 251:20-251:36 ExpBox False + 43 6 Construct 251:8-251:37 ExpBox False + 44 6 Construct 252:16-252:18 ExpBox False + 45 6 Construct 252:25-252:30 ExpBox False + 46 6 Construct 252:32-252:35 ExpBox False + 47 6 Construct 252:20-252:36 ExpBox False + 48 6 Construct 252:8-252:37 ExpBox False + 49 6 Construct 253:16-253:18 ExpBox False + 50 6 Construct 253:25-253:30 ExpBox False + 51 6 Construct 253:32-253:35 ExpBox False + 52 6 Construct 253:20-253:36 ExpBox False + 53 6 Construct 253:8-253:37 ExpBox False + 54 6 Construct 254:16-254:18 ExpBox False + 55 6 Construct 254:25-254:30 ExpBox False + 56 6 Construct 254:32-254:35 ExpBox False + 57 6 Construct 254:20-254:36 ExpBox False + 58 6 Construct 254:8-254:37 ExpBox False + 59 6 Construct 255:16-255:18 ExpBox False + 60 6 Construct 255:25-255:30 ExpBox False + 61 6 Construct 255:32-255:35 ExpBox False + 62 6 Construct 255:20-255:36 ExpBox False + 63 6 Construct 255:8-255:37 ExpBox False + 64 6 Construct 256:16-256:18 ExpBox False + 65 6 Construct 256:25-256:30 ExpBox False + 66 6 Construct 256:32-256:35 ExpBox False + 67 6 Construct 256:20-256:36 ExpBox False + 68 6 Construct 256:8-256:37 ExpBox False + 69 6 Construct 251:5-256:38 ExpBox False + 70 6 Construct 250:1-265:31 TopLevelBox ["transformBox"] + 71 0 Construct 246:8-246:10 ExpBox False + 72 0 Construct 246:18-246:20 ExpBox False + 73 0 Construct 246:7-246:21 ExpBox False + 74 0 Construct 246:24-246:26 ExpBox False + 75 0 Construct 246:34-246:36 ExpBox False + 76 0 Construct 246:23-246:37 ExpBox False + 77 0 Construct 247:8-247:10 ExpBox False + 78 0 Construct 247:18-247:20 ExpBox False + 79 0 Construct 247:7-247:21 ExpBox False + 80 0 Construct 247:24-247:26 ExpBox False + 81 0 Construct 247:34-247:36 ExpBox False + 82 0 Construct 247:23-247:37 ExpBox False + 83 0 Construct 248:8-248:10 ExpBox False + 84 0 Construct 248:18-248:20 ExpBox False + 85 0 Construct 248:7-248:21 ExpBox False + 86 0 Construct 248:24-248:26 ExpBox False + 87 0 Construct 248:34-248:36 ExpBox False + 88 0 Construct 248:23-248:37 ExpBox False + 89 0 Construct 246:5-248:37 ExpBox False + 90 0 Construct 245:1-248:37 TopLevelBox ["mergeBox"] + 91 0 Construct 205:16-205:16 ExpBox False + 92 0 Construct 205:12-205:16 ExpBox False + 93 0 Construct 205:24-205:24 ExpBox False + 94 0 Construct 205:20-205:24 ExpBox False + 95 0 Construct 205:19-205:24 ExpBox False + 96 0 Construct 205:32-205:32 ExpBox False + 97 0 Construct 205:35-205:35 ExpBox False + 98 0 Construct 205:9-205:37 ExpBox False + 99 0 Construct 206:16-206:16 ExpBox False + 100 0 Construct 206:12-206:16 ExpBox False + 101 0 Construct 206:24-206:24 ExpBox False + 102 0 Construct 206:20-206:24 ExpBox False + 103 0 Construct 206:32-206:32 ExpBox False + 104 0 Construct 206:35-206:35 ExpBox False + 105 0 Construct 206:9-206:37 ExpBox False + 106 0 Construct 207:16-207:16 ExpBox False + 107 0 Construct 207:24-207:24 ExpBox False + 108 0 Construct 207:32-207:32 ExpBox False + 109 0 Construct 207:35-207:35 ExpBox False + 110 0 Construct 207:9-207:37 ExpBox False + 111 0 Construct 208:16-208:16 ExpBox False + 112 0 Construct 208:24-208:24 ExpBox False + 113 0 Construct 208:32-208:32 ExpBox False + 114 0 Construct 208:35-208:35 ExpBox False + 115 0 Construct 208:9-208:37 ExpBox False + 116 0 Construct 205:7-208:39 ExpBox False + 117 0 Construct 204:7-208:39 ExpBox False + 118 0 Construct 210:16-210:16 ExpBox False + 119 0 Construct 210:12-210:16 ExpBox False + 120 0 Construct 210:24-210:24 ExpBox False + 121 0 Construct 210:20-210:24 ExpBox False + 122 0 Construct 210:32-210:32 ExpBox False + 123 0 Construct 210:35-210:35 ExpBox False + 124 0 Construct 210:9-210:37 ExpBox False + 125 0 Construct 211:16-211:16 ExpBox False + 126 0 Construct 211:12-211:16 ExpBox False + 127 0 Construct 211:11-211:16 ExpBox False + 128 0 Construct 211:24-211:24 ExpBox False + 129 0 Construct 211:20-211:24 ExpBox False + 130 0 Construct 211:32-211:32 ExpBox False + 131 0 Construct 211:35-211:35 ExpBox False + 132 0 Construct 211:9-211:37 ExpBox False + 133 0 Construct 212:16-212:16 ExpBox False + 134 0 Construct 212:24-212:24 ExpBox False + 135 0 Construct 212:32-212:32 ExpBox False + 136 0 Construct 212:35-212:35 ExpBox False + 137 0 Construct 212:9-212:37 ExpBox False + 138 0 Construct 213:16-213:16 ExpBox False + 139 0 Construct 213:24-213:24 ExpBox False + 140 0 Construct 213:32-213:32 ExpBox False + 141 0 Construct 213:35-213:35 ExpBox False + 142 0 Construct 213:9-213:37 ExpBox False + 143 0 Construct 210:7-213:39 ExpBox False + 144 0 Construct 209:7-213:39 ExpBox False + 145 0 Construct 204:5-213:41 ExpBox False + 146 0 Construct 203:1-213:41 TopLevelBox ["rotzM"] + 147 0 Construct 239:26-239:26 ExpBox False + 148 0 Construct 239:20-239:26 ExpBox False + 149 0 Construct 238:13-238:14 ExpBox False + 150 0 Construct 238:16-238:19 ExpBox False + 151 0 Construct 238:6-238:19 ExpBox False + 152 0 Construct 238:29-238:32 ExpBox False + 153 0 Construct 238:34-238:35 ExpBox False + 154 0 Construct 238:22-238:35 ExpBox False + 155 0 Construct 238:5-238:36 ExpBox False + 156 0 Construct 237:1-239:26 TopLevelBox ["rotateEyeZ"] + 157 1 Construct 193:16-193:16 ExpBox False + 158 1 Construct 193:12-193:16 ExpBox False + 159 1 Construct 193:24-193:24 ExpBox False + 160 1 Construct 193:32-193:32 ExpBox False + 161 1 Construct 193:28-193:32 ExpBox False + 162 1 Construct 193:35-193:35 ExpBox False + 163 1 Construct 193:9-193:37 ExpBox False + 164 1 Construct 194:16-194:16 ExpBox False + 165 1 Construct 194:24-194:24 ExpBox False + 166 1 Construct 194:32-194:32 ExpBox False + 167 1 Construct 194:35-194:35 ExpBox False + 168 1 Construct 194:9-194:37 ExpBox False + 169 1 Construct 195:16-195:16 ExpBox False + 170 1 Construct 195:12-195:16 ExpBox False + 171 1 Construct 195:11-195:16 ExpBox False + 172 1 Construct 195:24-195:24 ExpBox False + 173 1 Construct 195:32-195:32 ExpBox False + 174 1 Construct 195:28-195:32 ExpBox False + 175 1 Construct 195:35-195:35 ExpBox False + 176 1 Construct 195:9-195:37 ExpBox False + 177 1 Construct 196:16-196:16 ExpBox False + 178 1 Construct 196:24-196:24 ExpBox False + 179 1 Construct 196:32-196:32 ExpBox False + 180 1 Construct 196:35-196:35 ExpBox False + 181 1 Construct 196:9-196:37 ExpBox False + 182 1 Construct 193:7-196:39 ExpBox False + 183 1 Construct 192:7-196:39 ExpBox False + 184 1 Construct 198:16-198:16 ExpBox False + 185 1 Construct 198:12-198:16 ExpBox False + 186 1 Construct 198:24-198:24 ExpBox False + 187 1 Construct 198:32-198:32 ExpBox False + 188 1 Construct 198:28-198:32 ExpBox False + 189 1 Construct 198:27-198:32 ExpBox False + 190 1 Construct 198:35-198:35 ExpBox False + 191 1 Construct 198:9-198:37 ExpBox False + 192 1 Construct 199:16-199:16 ExpBox False + 193 1 Construct 199:24-199:24 ExpBox False + 194 1 Construct 199:32-199:32 ExpBox False + 195 1 Construct 199:35-199:35 ExpBox False + 196 1 Construct 199:9-199:37 ExpBox False + 197 1 Construct 200:16-200:16 ExpBox False + 198 1 Construct 200:12-200:16 ExpBox False + 199 1 Construct 200:24-200:24 ExpBox False + 200 1 Construct 200:32-200:32 ExpBox False + 201 1 Construct 200:28-200:32 ExpBox False + 202 1 Construct 200:35-200:35 ExpBox False + 203 1 Construct 200:9-200:37 ExpBox False + 204 1 Construct 201:16-201:16 ExpBox False + 205 1 Construct 201:24-201:24 ExpBox False + 206 1 Construct 201:32-201:32 ExpBox False + 207 1 Construct 201:35-201:35 ExpBox False + 208 1 Construct 201:9-201:37 ExpBox False + 209 1 Construct 198:7-201:39 ExpBox False + 210 1 Construct 197:7-201:39 ExpBox False + 211 1 Construct 192:5-201:41 ExpBox False + 212 1 Construct 191:1-201:41 TopLevelBox ["rotyM"] + 213 0 Construct 236:26-236:26 ExpBox False + 214 0 Construct 236:20-236:26 ExpBox False + 215 0 Construct 235:13-235:14 ExpBox False + 216 0 Construct 235:16-235:19 ExpBox False + 217 0 Construct 235:6-235:19 ExpBox False + 218 0 Construct 235:29-235:32 ExpBox False + 219 0 Construct 235:34-235:35 ExpBox False + 220 0 Construct 235:22-235:35 ExpBox False + 221 0 Construct 235:5-235:36 ExpBox False + 222 0 Construct 234:1-236:26 TopLevelBox ["rotateEyeY"] + 223 1 Construct 181:16-181:16 ExpBox False + 224 1 Construct 181:24-181:24 ExpBox False + 225 1 Construct 181:32-181:32 ExpBox False + 226 1 Construct 181:35-181:35 ExpBox False + 227 1 Construct 181:9-181:37 ExpBox False + 228 1 Construct 182:16-182:16 ExpBox False + 229 1 Construct 182:24-182:24 ExpBox False + 230 1 Construct 182:20-182:24 ExpBox False + 231 1 Construct 182:32-182:32 ExpBox False + 232 1 Construct 182:28-182:32 ExpBox False + 233 1 Construct 182:27-182:32 ExpBox False + 234 1 Construct 182:35-182:35 ExpBox False + 235 1 Construct 182:9-182:37 ExpBox False + 236 1 Construct 183:16-183:16 ExpBox False + 237 1 Construct 183:24-183:24 ExpBox False + 238 1 Construct 183:20-183:24 ExpBox False + 239 1 Construct 183:32-183:32 ExpBox False + 240 1 Construct 183:28-183:32 ExpBox False + 241 1 Construct 183:35-183:35 ExpBox False + 242 1 Construct 183:9-183:37 ExpBox False + 243 1 Construct 184:16-184:16 ExpBox False + 244 1 Construct 184:24-184:24 ExpBox False + 245 1 Construct 184:32-184:32 ExpBox False + 246 1 Construct 184:35-184:35 ExpBox False + 247 1 Construct 184:9-184:37 ExpBox False + 248 1 Construct 181:7-184:39 ExpBox False + 249 1 Construct 180:7-184:39 ExpBox False + 250 1 Construct 186:16-186:16 ExpBox False + 251 1 Construct 186:24-186:24 ExpBox False + 252 1 Construct 186:32-186:32 ExpBox False + 253 1 Construct 186:35-186:35 ExpBox False + 254 1 Construct 186:9-186:37 ExpBox False + 255 1 Construct 187:16-187:16 ExpBox False + 256 1 Construct 187:24-187:24 ExpBox False + 257 1 Construct 187:20-187:24 ExpBox False + 258 1 Construct 187:32-187:32 ExpBox False + 259 1 Construct 187:28-187:32 ExpBox False + 260 1 Construct 187:35-187:35 ExpBox False + 261 1 Construct 187:9-187:37 ExpBox False + 262 1 Construct 188:16-188:16 ExpBox False + 263 1 Construct 188:24-188:24 ExpBox False + 264 1 Construct 188:20-188:24 ExpBox False + 265 1 Construct 188:19-188:24 ExpBox False + 266 1 Construct 188:32-188:32 ExpBox False + 267 1 Construct 188:28-188:32 ExpBox False + 268 1 Construct 188:35-188:35 ExpBox False + 269 1 Construct 188:9-188:37 ExpBox False + 270 1 Construct 189:16-189:16 ExpBox False + 271 1 Construct 189:24-189:24 ExpBox False + 272 1 Construct 189:32-189:32 ExpBox False + 273 1 Construct 189:35-189:35 ExpBox False + 274 1 Construct 189:9-189:37 ExpBox False + 275 1 Construct 186:7-189:39 ExpBox False + 276 1 Construct 185:7-189:39 ExpBox False + 277 1 Construct 180:5-189:41 ExpBox False + 278 1 Construct 179:1-189:41 TopLevelBox ["rotxM"] + 279 0 Construct 233:26-233:26 ExpBox False + 280 0 Construct 233:20-233:26 ExpBox False + 281 0 Construct 232:13-232:14 ExpBox False + 282 0 Construct 232:16-232:19 ExpBox False + 283 0 Construct 232:6-232:19 ExpBox False + 284 0 Construct 232:29-232:32 ExpBox False + 285 0 Construct 232:34-232:35 ExpBox False + 286 0 Construct 232:22-232:35 ExpBox False + 287 0 Construct 232:5-232:36 ExpBox False + 288 0 Construct 231:1-233:26 TopLevelBox ["rotateEyeX"] + 289 1 Construct 177:22-177:22 ExpBox False + 290 1 Construct 177:14-177:22 ExpBox False + 291 1 Construct 177:9-177:22 LocalBox ["scaleM","z'"] + 292 1 Construct 176:22-176:22 ExpBox False + 293 1 Construct 176:14-176:22 ExpBox False + 294 1 Construct 176:9-176:22 LocalBox ["scaleM","y'"] + 295 1 Construct 175:22-175:22 ExpBox False + 296 1 Construct 175:14-175:22 ExpBox False + 297 1 Construct 175:9-175:22 LocalBox ["scaleM","x'"] + 298 1 Construct 166:13-166:14 ExpBox False + 299 1 Construct 166:20-166:20 ExpBox False + 300 1 Construct 166:26-166:26 ExpBox False + 301 1 Construct 166:29-166:29 ExpBox False + 302 1 Construct 166:9-166:31 ExpBox False + 303 1 Construct 167:14-167:14 ExpBox False + 304 1 Construct 167:19-167:20 ExpBox False + 305 1 Construct 167:26-167:26 ExpBox False + 306 1 Construct 167:29-167:29 ExpBox False + 307 1 Construct 167:9-167:31 ExpBox False + 308 1 Construct 168:14-168:14 ExpBox False + 309 1 Construct 168:20-168:20 ExpBox False + 310 1 Construct 168:25-168:26 ExpBox False + 311 1 Construct 168:29-168:29 ExpBox False + 312 1 Construct 168:9-168:31 ExpBox False + 313 1 Construct 169:14-169:14 ExpBox False + 314 1 Construct 169:20-169:20 ExpBox False + 315 1 Construct 169:26-169:26 ExpBox False + 316 1 Construct 169:29-169:29 ExpBox False + 317 1 Construct 169:9-169:31 ExpBox False + 318 1 Construct 166:7-169:33 ExpBox False + 319 1 Construct 165:7-169:33 ExpBox False + 320 1 Construct 171:11-171:11 ExpBox False + 321 1 Construct 171:13-171:14 ExpBox False + 322 1 Construct 171:11-171:14 ExpBox False + 323 1 Construct 171:20-171:20 ExpBox False + 324 1 Construct 171:26-171:26 ExpBox False + 325 1 Construct 171:29-171:29 ExpBox False + 326 1 Construct 171:9-171:31 ExpBox False + 327 1 Construct 172:14-172:14 ExpBox False + 328 1 Construct 172:17-172:17 ExpBox False + 329 1 Construct 172:19-172:20 ExpBox False + 330 1 Construct 172:17-172:20 ExpBox False + 331 1 Construct 172:26-172:26 ExpBox False + 332 1 Construct 172:29-172:29 ExpBox False + 333 1 Construct 172:9-172:31 ExpBox False + 334 1 Construct 173:14-173:14 ExpBox False + 335 1 Construct 173:20-173:20 ExpBox False + 336 1 Construct 173:23-173:23 ExpBox False + 337 1 Construct 173:25-173:26 ExpBox False + 338 1 Construct 173:23-173:26 ExpBox False + 339 1 Construct 173:29-173:29 ExpBox False + 340 1 Construct 173:9-173:31 ExpBox False + 341 1 Construct 174:14-174:14 ExpBox False + 342 1 Construct 174:20-174:20 ExpBox False + 343 1 Construct 174:26-174:26 ExpBox False + 344 1 Construct 174:29-174:29 ExpBox False + 345 1 Construct 174:9-174:31 ExpBox False + 346 1 Construct 171:7-174:33 ExpBox False + 347 1 Construct 170:7-174:33 ExpBox False + 348 1 Construct 165:5-174:35 ExpBox False + 349 1 Construct 164:1-177:22 TopLevelBox ["scaleM"] + 350 3 Construct 154:11-154:11 ExpBox False + 351 3 Construct 154:14-154:14 ExpBox False + 352 3 Construct 154:17-154:17 ExpBox False + 353 3 Construct 154:20-154:20 ExpBox False + 354 3 Construct 154:9-154:22 ExpBox False + 355 3 Construct 155:11-155:11 ExpBox False + 356 3 Construct 155:14-155:14 ExpBox False + 357 3 Construct 155:17-155:17 ExpBox False + 358 3 Construct 155:20-155:20 ExpBox False + 359 3 Construct 155:9-155:22 ExpBox False + 360 3 Construct 156:11-156:11 ExpBox False + 361 3 Construct 156:14-156:14 ExpBox False + 362 3 Construct 156:17-156:17 ExpBox False + 363 3 Construct 156:20-156:20 ExpBox False + 364 3 Construct 156:9-156:22 ExpBox False + 365 1 Construct 157:11-157:11 ExpBox False + 366 1 Construct 157:14-157:14 ExpBox False + 367 1 Construct 157:17-157:17 ExpBox False + 368 1 Construct 157:20-157:20 ExpBox False + 369 3 Construct 157:9-157:22 ExpBox False + 370 3 Construct 154:7-157:24 ExpBox False + 371 3 Construct 153:7-157:24 ExpBox False + 372 3 Construct 159:11-159:11 ExpBox False + 373 3 Construct 159:14-159:14 ExpBox False + 374 3 Construct 159:17-159:17 ExpBox False + 375 3 Construct 159:21-159:21 ExpBox False + 376 3 Construct 159:20-159:21 ExpBox False + 377 3 Construct 159:9-159:23 ExpBox False + 378 3 Construct 160:11-160:11 ExpBox False + 379 3 Construct 160:14-160:14 ExpBox False + 380 3 Construct 160:17-160:17 ExpBox False + 381 3 Construct 160:21-160:21 ExpBox False + 382 3 Construct 160:20-160:21 ExpBox False + 383 3 Construct 160:9-160:23 ExpBox False + 384 3 Construct 161:11-161:11 ExpBox False + 385 3 Construct 161:14-161:14 ExpBox False + 386 3 Construct 161:17-161:17 ExpBox False + 387 3 Construct 161:21-161:21 ExpBox False + 388 3 Construct 161:20-161:21 ExpBox False + 389 3 Construct 161:9-161:23 ExpBox False + 390 1 Construct 162:11-162:11 ExpBox False + 391 1 Construct 162:14-162:14 ExpBox False + 392 1 Construct 162:17-162:17 ExpBox False + 393 1 Construct 162:21-162:21 ExpBox False + 394 3 Construct 162:9-162:23 ExpBox False + 395 3 Construct 159:7-162:25 ExpBox False + 396 3 Construct 158:7-162:25 ExpBox False + 397 3 Construct 153:5-162:27 ExpBox False + 398 3 Construct 152:1-162:27 TopLevelBox ["transM"] + 399 0 Construct 230:27-230:29 ExpBox False + 400 0 Construct 230:20-230:29 ExpBox False + 401 0 Construct 229:13-229:14 ExpBox False + 402 0 Construct 229:16-229:19 ExpBox False + 403 0 Construct 229:6-229:19 ExpBox False + 404 0 Construct 229:29-229:32 ExpBox False + 405 0 Construct 229:34-229:35 ExpBox False + 406 0 Construct 229:22-229:35 ExpBox False + 407 0 Construct 229:5-229:36 ExpBox False + 408 0 Construct 228:1-230:29 TopLevelBox ["translateEye"] + 409 1 Construct 147:11-147:13 ExpBox False + 410 1 Construct 147:16-147:18 ExpBox False + 411 1 Construct 147:21-147:23 ExpBox False + 412 1 Construct 147:26-147:28 ExpBox False + 413 1 Construct 147:9-147:30 ExpBox False + 414 1 Construct 148:11-148:13 ExpBox False + 415 1 Construct 148:16-148:18 ExpBox False + 416 1 Construct 148:21-148:23 ExpBox False + 417 1 Construct 148:26-148:28 ExpBox False + 418 1 Construct 148:9-148:30 ExpBox False + 419 1 Construct 149:11-149:13 ExpBox False + 420 1 Construct 149:16-149:18 ExpBox False + 421 1 Construct 149:21-149:23 ExpBox False + 422 1 Construct 149:26-149:28 ExpBox False + 423 1 Construct 149:9-149:30 ExpBox False + 424 1 Construct 150:11-150:13 ExpBox False + 425 1 Construct 150:16-150:18 ExpBox False + 426 1 Construct 150:21-150:23 ExpBox False + 427 1 Construct 150:26-150:28 ExpBox False + 428 1 Construct 150:9-150:30 ExpBox False + 429 1 Construct 147:7-150:32 ExpBox False + 430 1 Construct 146:8-150:32 ExpBox False + 431 1 Construct 146:1-150:32 TopLevelBox ["unit"] + 432 1 Construct 227:8-227:11 ExpBox False + 433 1 Construct 227:14-227:17 ExpBox False + 434 1 Construct 227:7-227:18 ExpBox False + 435 1 Construct 227:1-227:18 TopLevelBox ["eye"] + 436 6 Construct 116:63-116:63 ExpBox False + 437 6 Construct 116:65-116:66 ExpBox False + 438 6 Construct 116:55-116:67 ExpBox False + 439 6 Construct 116:83-116:85 ExpBox False + 440 6 Construct 116:87-116:88 ExpBox False + 441 6 Construct 116:75-116:89 ExpBox False + 442 6 Construct 116:91-116:91 ExpBox False + 443 6 Construct 116:44-116:91 ExpBox True + 444 1 Construct 117:66-117:68 ExpBox False + 445 1 Construct 117:70-117:70 ExpBox False + 446 1 Construct 117:55-117:71 ExpBox False + 447 1 Construct 117:86-117:88 ExpBox False + 448 1 Construct 117:90-117:90 ExpBox False + 449 1 Construct 117:75-117:91 ExpBox False + 450 1 Construct 117:44-117:91 ExpBox True + 451 0 Construct 118:66-118:68 ExpBox False + 452 0 Construct 118:70-118:70 ExpBox False + 453 0 Construct 118:55-118:71 ExpBox False + 454 0 Construct 118:86-118:88 ExpBox False + 455 0 Construct 118:90-118:90 ExpBox False + 456 0 Construct 118:75-118:91 ExpBox False + 457 0 Construct 118:44-118:91 ExpBox True + 458 0 Construct 119:66-119:68 ExpBox False + 459 0 Construct 119:70-119:70 ExpBox False + 460 0 Construct 119:55-119:71 ExpBox False + 461 0 Construct 119:86-119:88 ExpBox False + 462 0 Construct 119:90-119:90 ExpBox False + 463 0 Construct 119:75-119:91 ExpBox False + 464 0 Construct 119:44-119:91 ExpBox True + 465 6 Construct 120:69-120:69 ExpBox False + 466 6 Construct 120:71-120:73 ExpBox False + 467 6 Construct 120:55-120:74 ExpBox False + 468 6 Construct 120:87-120:89 ExpBox False + 469 6 Construct 120:91-120:91 ExpBox False + 470 6 Construct 120:76-120:92 ExpBox False + 471 6 Construct 120:44-120:92 ExpBox True + 472 2 Construct 121:55-121:55 ExpBox False + 473 2 Construct 121:57-121:58 ExpBox False + 474 2 Construct 121:60-121:63 ExpBox False + 475 2 Construct 121:44-121:63 ExpBox True + 476 15 Construct 116:1-121:63 TopLevelBox ["transform"] + 477 3 Construct 126:17-126:25 ExpBox False + 478 3 Construct 126:36-126:38 ExpBox False + 479 3 Construct 126:29-126:38 ExpBox False + 480 3 Construct 126:17-126:38 ExpBox False + 481 3 Construct 126:1-126:38 TopLevelBox ["translate"] + 482 0 Construct 127:27-127:27 ExpBox False + 483 0 Construct 127:30-127:30 ExpBox False + 484 0 Construct 127:33-127:33 ExpBox False + 485 0 Construct 127:26-127:34 ExpBox False + 486 0 Construct 127:16-127:34 ExpBox False + 487 0 Construct 127:1-127:34 TopLevelBox ["translateX"] + 488 0 Construct 128:27-128:27 ExpBox False + 489 0 Construct 128:30-128:30 ExpBox False + 490 0 Construct 128:33-128:33 ExpBox False + 491 0 Construct 128:26-128:34 ExpBox False + 492 0 Construct 128:16-128:34 ExpBox False + 493 0 Construct 128:1-128:34 TopLevelBox ["translateY"] + 494 0 Construct 129:27-129:27 ExpBox False + 495 0 Construct 129:30-129:30 ExpBox False + 496 0 Construct 129:33-129:33 ExpBox False + 497 0 Construct 129:26-129:34 ExpBox False + 498 0 Construct 129:16-129:34 ExpBox False + 499 0 Construct 129:1-129:34 TopLevelBox ["translateZ"] + 500 1 Construct 134:13-134:21 ExpBox False + 501 1 Construct 134:32-134:34 ExpBox False + 502 1 Construct 134:25-134:34 ExpBox False + 503 1 Construct 134:13-134:34 ExpBox False + 504 1 Construct 134:1-134:34 TopLevelBox ["scale"] + 505 0 Construct 135:19-135:19 ExpBox False + 506 0 Construct 135:22-135:22 ExpBox False + 507 0 Construct 135:25-135:25 ExpBox False + 508 0 Construct 135:18-135:26 ExpBox False + 509 0 Construct 135:12-135:26 ExpBox False + 510 0 Construct 135:1-135:26 TopLevelBox ["scaleX"] + 511 0 Construct 136:19-136:19 ExpBox False + 512 0 Construct 136:22-136:22 ExpBox False + 513 0 Construct 136:25-136:25 ExpBox False + 514 0 Construct 136:18-136:26 ExpBox False + 515 0 Construct 136:12-136:26 ExpBox False + 516 0 Construct 136:1-136:26 TopLevelBox ["scaleY"] + 517 0 Construct 137:19-137:19 ExpBox False + 518 0 Construct 137:22-137:22 ExpBox False + 519 0 Construct 137:25-137:25 ExpBox False + 520 0 Construct 137:18-137:26 ExpBox False + 521 0 Construct 137:12-137:26 ExpBox False + 522 0 Construct 137:1-137:26 TopLevelBox ["scaleZ"] + 523 1 Construct 138:19-138:19 ExpBox False + 524 1 Construct 138:21-138:21 ExpBox False + 525 1 Construct 138:23-138:23 ExpBox False + 526 1 Construct 138:18-138:24 ExpBox False + 527 1 Construct 138:12-138:24 ExpBox False + 528 1 Construct 138:1-138:24 TopLevelBox ["uscale"] + 529 1 Construct 142:13-142:21 ExpBox False + 530 1 Construct 142:31-142:31 ExpBox False + 531 1 Construct 142:25-142:31 ExpBox False + 532 1 Construct 142:13-142:31 ExpBox False + 533 1 Construct 142:1-142:31 TopLevelBox ["rotateX"] + 534 1 Construct 143:13-143:21 ExpBox False + 535 1 Construct 143:31-143:31 ExpBox False + 536 1 Construct 143:25-143:31 ExpBox False + 537 1 Construct 143:13-143:31 ExpBox False + 538 1 Construct 143:1-143:31 TopLevelBox ["rotateY"] + 539 0 Construct 144:13-144:21 ExpBox False + 540 0 Construct 144:31-144:31 ExpBox False + 541 0 Construct 144:25-144:31 ExpBox False + 542 0 Construct 144:13-144:31 ExpBox False + 543 0 Construct 144:1-144:31 TopLevelBox ["rotateZ"] + 544 1 Construct 90:9-90:13 ExpBox False + 545 1 Construct 90:1-90:13 TopLevelBox ["plane"] + 546 1 Construct 86:17-86:17 ExpBox False + 547 1 Construct 86:19-86:19 ExpBox False + 548 1 Construct 86:13-86:19 ExpBox False + 549 1 Construct 86:1-86:19 TopLevelBox ["mkBox"] + 550 0 Construct 92:16-92:16 ExpBox False + 551 0 Construct 92:15-92:16 ExpBox False + 552 0 Construct 92:20-92:26 ExpBox False + 553 0 Construct 92:14-92:27 ExpBox False + 554 0 Construct 92:30-92:30 ExpBox False + 555 0 Construct 92:34-92:40 ExpBox False + 556 0 Construct 92:29-92:41 ExpBox False + 557 0 Construct 93:16-93:16 ExpBox False + 558 0 Construct 93:15-93:16 ExpBox False + 559 0 Construct 93:20-93:26 ExpBox False + 560 0 Construct 93:14-93:27 ExpBox False + 561 0 Construct 93:30-93:30 ExpBox False + 562 0 Construct 93:34-93:40 ExpBox False + 563 0 Construct 93:29-93:41 ExpBox False + 564 0 Construct 94:16-94:16 ExpBox False + 565 0 Construct 94:15-94:16 ExpBox False + 566 0 Construct 94:20-94:26 ExpBox False + 567 0 Construct 94:14-94:27 ExpBox False + 568 0 Construct 94:30-94:30 ExpBox False + 569 0 Construct 94:34-94:40 ExpBox False + 570 0 Construct 94:29-94:41 ExpBox False + 571 0 Construct 92:11-94:42 ExpBox False + 572 0 Construct 94:52-94:52 ExpBox False + 573 0 Construct 94:44-94:53 ExpBox False + 574 0 Construct 92:5-94:53 ExpBox False + 575 0 Construct 91:1-94:53 TopLevelBox ["sphere"] + 576 0 Construct 96:16-96:16 ExpBox False + 577 0 Construct 96:15-96:16 ExpBox False + 578 0 Construct 96:20-96:26 ExpBox False + 579 0 Construct 96:14-96:27 ExpBox False + 580 0 Construct 96:30-96:30 ExpBox False + 581 0 Construct 96:34-96:40 ExpBox False + 582 0 Construct 96:29-96:41 ExpBox False + 583 0 Construct 97:20-97:26 ExpBox False + 584 0 Construct 97:14-97:27 ExpBox False + 585 0 Construct 97:30-97:30 ExpBox False + 586 0 Construct 97:34-97:40 ExpBox False + 587 0 Construct 97:29-97:41 ExpBox False + 588 0 Construct 98:16-98:16 ExpBox False + 589 0 Construct 98:15-98:16 ExpBox False + 590 0 Construct 98:20-98:26 ExpBox False + 591 0 Construct 98:14-98:27 ExpBox False + 592 0 Construct 98:30-98:30 ExpBox False + 593 0 Construct 98:34-98:40 ExpBox False + 594 0 Construct 98:29-98:41 ExpBox False + 595 0 Construct 96:11-98:42 ExpBox False + 596 0 Construct 98:50-98:50 ExpBox False + 597 0 Construct 98:44-98:51 ExpBox False + 598 0 Construct 96:5-98:51 ExpBox False + 599 0 Construct 95:1-98:51 TopLevelBox ["cone"] + 600 1 Construct 100:17-100:23 ExpBox False + 601 1 Construct 100:14-100:24 ExpBox False + 602 1 Construct 100:27-100:27 ExpBox False + 603 1 Construct 100:31-100:37 ExpBox False + 604 1 Construct 100:26-100:38 ExpBox False + 605 1 Construct 101:17-101:23 ExpBox False + 606 1 Construct 101:14-101:24 ExpBox False + 607 1 Construct 101:27-101:27 ExpBox False + 608 1 Construct 101:31-101:37 ExpBox False + 609 1 Construct 101:26-101:38 ExpBox False + 610 1 Construct 102:17-102:23 ExpBox False + 611 1 Construct 102:14-102:24 ExpBox False + 612 1 Construct 102:27-102:27 ExpBox False + 613 1 Construct 102:31-102:37 ExpBox False + 614 1 Construct 102:26-102:38 ExpBox False + 615 1 Construct 100:11-102:39 ExpBox False + 616 1 Construct 102:47-102:47 ExpBox False + 617 1 Construct 102:41-102:48 ExpBox False + 618 1 Construct 100:5-102:48 ExpBox False + 619 1 Construct 99:1-102:48 TopLevelBox ["cube"] + 620 0 Construct 104:16-104:16 ExpBox False + 621 0 Construct 104:15-104:16 ExpBox False + 622 0 Construct 104:20-104:26 ExpBox False + 623 0 Construct 104:14-104:27 ExpBox False + 624 0 Construct 104:30-104:30 ExpBox False + 625 0 Construct 104:34-104:40 ExpBox False + 626 0 Construct 104:29-104:41 ExpBox False + 627 0 Construct 105:20-105:26 ExpBox False + 628 0 Construct 105:14-105:27 ExpBox False + 629 0 Construct 105:30-105:30 ExpBox False + 630 0 Construct 105:34-105:40 ExpBox False + 631 0 Construct 105:29-105:41 ExpBox False + 632 0 Construct 106:16-106:16 ExpBox False + 633 0 Construct 106:15-106:16 ExpBox False + 634 0 Construct 106:20-106:26 ExpBox False + 635 0 Construct 106:14-106:27 ExpBox False + 636 0 Construct 106:30-106:30 ExpBox False + 637 0 Construct 106:34-106:40 ExpBox False + 638 0 Construct 106:29-106:41 ExpBox False + 639 0 Construct 104:11-106:42 ExpBox False + 640 0 Construct 106:54-106:54 ExpBox False + 641 0 Construct 106:44-106:55 ExpBox False + 642 0 Construct 104:5-106:55 ExpBox False + 643 0 Construct 103:1-106:55 TopLevelBox ["cylinder"] + 644 0 Construct 81:31-81:32 ExpBox False + 645 0 Construct 81:46-81:46 ExpBox False + 646 0 Construct 81:48-81:48 ExpBox False + 647 0 Construct 81:34-81:49 ExpBox False + 648 0 Construct 81:27-81:49 ExpBox True + 649 0 Construct 84:29-84:29 ExpBox False + 650 0 Construct 84:31-84:31 ExpBox False + 651 0 Construct 84:18-84:31 ExpBox True + 652 0 Construct 81:1-84:31 TopLevelBox ["difference"] + 653 0 Construct 78:53-78:54 ExpBox False + 654 0 Construct 78:56-78:57 ExpBox False + 655 0 Construct 78:43-78:58 ExpBox False + 656 0 Construct 78:71-78:71 ExpBox False + 657 0 Construct 78:73-78:73 ExpBox False + 658 0 Construct 78:60-78:74 ExpBox False + 659 0 Construct 78:39-78:74 ExpBox True + 660 0 Construct 79:27-79:27 ExpBox False + 661 0 Construct 79:29-79:29 ExpBox False + 662 0 Construct 79:17-79:29 ExpBox True + 663 0 Construct 78:1-79:29 TopLevelBox ["intersect"] + 664 0 Construct 74:49-74:50 ExpBox False + 665 0 Construct 74:52-74:53 ExpBox False + 666 0 Construct 74:39-74:54 ExpBox False + 667 0 Construct 74:63-74:63 ExpBox False + 668 0 Construct 74:65-74:65 ExpBox False + 669 0 Construct 74:56-74:66 ExpBox False + 670 0 Construct 74:35-74:66 ExpBox True + 671 1 Construct 75:19-75:19 ExpBox False + 672 1 Construct 75:21-75:21 ExpBox False + 673 1 Construct 75:13-75:21 ExpBox True + 674 1 Construct 74:1-75:21 TopLevelBox ["union"] + 675 0 Construct 35:12-35:15 TopLevelBox ["showsPrec"] + 676 0 Construct 35:12-35:15 TopLevelBox ["showList"] + 677 0 Construct 51:12-51:15 TopLevelBox ["showsPrec"] + 678 0 Construct 51:12-51:15 TopLevelBox ["showList"] + 679 0 Construct 64:13-64:16 TopLevelBox ["showsPrec"] + 680 0 Construct 64:13-64:16 TopLevelBox ["showList"] + 0 1 Intersections 404:26-404:28 ExpBox False + 1 1 Intersections 404:24-404:29 ExpBox False + 2 1 Intersections 404:31-404:33 ExpBox False + 3 1 Intersections 404:15-404:33 ExpBox False + 4 1 Intersections 404:1-404:33 TopLevelBox ["infInterval"] + 5 317803 Intersections 402:14-402:15 ExpBox False + 6 317803 Intersections 402:19-402:24 ExpBox False + 7 317803 Intersections 402:13-402:25 ExpBox False + 8 317803 Intersections 402:29-402:33 ExpBox False + 9 317803 Intersections 402:13-402:33 ExpBox False + 10 317803 Intersections 402:9-402:33 LocalBox ["intersectRayWithSlab","b"] + 11 317803 Intersections 401:14-401:15 ExpBox False + 12 317803 Intersections 401:19-401:24 ExpBox False + 13 317803 Intersections 401:13-401:25 ExpBox False + 14 317803 Intersections 401:29-401:33 ExpBox False + 15 317803 Intersections 401:13-401:33 ExpBox False + 16 317803 Intersections 401:9-401:33 LocalBox ["intersectRayWithSlab","a"] + 17 346614 Intersections 398:5-398:9 ExpBox False + 18 346614 Intersections 398:14-398:14 ExpBox False + 19 346614 Intersections 398:5-398:14 ExpBox False + 20 28811 Intersections 398:5-398:14 BinBox GuardBinBox True + 21 317803 Intersections 398:5-398:14 BinBox GuardBinBox False + 22 28811 Intersections 398:21-398:26 ExpBox False + 23 28811 Intersections 398:30-398:31 ExpBox False + 24 28811 Intersections 398:21-398:31 ExpBox False + 25 21311 Intersections 398:36-398:41 ExpBox False + 26 21311 Intersections 398:45-398:46 ExpBox False + 27 21311 Intersections 398:36-398:46 ExpBox False + 28 28811 Intersections 398:21-398:46 ExpBox False + 29 1 Intersections 398:21-398:46 BinBox CondBinBox True + 30 10594 Intersections 398:21-398:46 BinBox CondBinBox False + 31 1 Intersections 398:53-398:62 ExpBox True + 32 10594 Intersections 398:69-398:79 ExpBox True + 33 28811 Intersections 398:18-398:79 ExpBox True + 34 317803 Intersections 399:5-399:9 ExpBox False + 35 317803 Intersections 399:14-399:14 ExpBox False + 36 317803 Intersections 399:5-399:14 ExpBox False + 37 215534 Intersections 399:5-399:14 BinBox GuardBinBox True + 38 102269 Intersections 399:5-399:14 BinBox GuardBinBox False + 39 215534 Intersections 399:27-399:27 ExpBox False + 40 215534 Intersections 399:29-399:29 ExpBox False + 41 215534 Intersections 399:18-399:29 ExpBox True + 42 102269 Intersections 400:5-400:13 ExpBox False + 43 102269 Intersections 400:5-400:13 BinBox GuardBinBox True + 44 0 Intersections 400:5-400:13 BinBox GuardBinBox False + 45 102269 Intersections 400:27-400:27 ExpBox False + 46 102269 Intersections 400:29-400:29 ExpBox False + 47 102269 Intersections 400:18-400:29 ExpBox True + 48 346614 Intersections 397:1-402:33 TopLevelBox ["intersectRayWithSlab"] + 49 0 Intersections 389:34-389:43 ExpBox True + 50 3 Intersections 390:34-390:43 ExpBox True + 51 147905 Intersections 392:5-392:5 ExpBox False + 52 147905 Intersections 392:9-392:9 ExpBox False + 53 147905 Intersections 392:5-392:9 ExpBox False + 54 81032 Intersections 392:14-392:14 ExpBox False + 55 81032 Intersections 392:18-392:18 ExpBox False + 56 81032 Intersections 392:14-392:18 ExpBox False + 57 147905 Intersections 392:5-392:18 ExpBox False + 58 2 Intersections 392:5-392:18 BinBox GuardBinBox True + 59 67893 Intersections 392:5-392:18 BinBox GuardBinBox False + 60 2 Intersections 392:22-392:31 ExpBox True + 61 67893 Intersections 393:5-393:13 ExpBox False + 62 67893 Intersections 393:5-393:13 BinBox GuardBinBox True + 63 0 Intersections 393:5-393:13 BinBox GuardBinBox False + 64 67893 Intersections 393:27-393:27 ExpBox False + 65 67893 Intersections 393:35-393:35 ExpBox False + 66 67893 Intersections 393:26-393:36 ExpBox False + 67 67893 Intersections 393:39-393:39 ExpBox False + 68 67893 Intersections 393:47-393:47 ExpBox False + 69 67893 Intersections 393:38-393:48 ExpBox False + 70 67893 Intersections 393:17-393:48 ExpBox True + 71 231076 Intersections 389:1-393:48 TopLevelBox ["intersectInterval"] + 72 17309 Intersections 376:29-376:32 ExpBox True + 73 3 Intersections 377:29-377:33 ExpBox True + 74 115538 Intersections 376:1-377:33 TopLevelBox ["isInterval"] + 75 115538 Intersections 384:51-384:51 ExpBox False + 76 115538 Intersections 384:43-384:52 ExpBox False + 77 115538 Intersections 384:66-384:66 ExpBox False + 78 115538 Intersections 384:54-384:67 ExpBox False + 79 115538 Intersections 384:70-384:71 ExpBox False + 80 108038 Intersections 384:74-384:75 ExpBox False + 81 115538 Intersections 384:69-384:76 ExpBox False + 82 115538 Intersections 384:22-384:76 ExpBox False + 83 115538 Intersections 384:9-384:76 LocalBox ["intersectWithBox","z_interval"] + 84 115538 Intersections 383:51-383:51 ExpBox False + 85 115538 Intersections 383:43-383:52 ExpBox False + 86 115538 Intersections 383:66-383:66 ExpBox False + 87 115538 Intersections 383:54-383:67 ExpBox False + 88 115538 Intersections 383:70-383:71 ExpBox False + 89 115538 Intersections 383:74-383:75 ExpBox False + 90 115538 Intersections 383:69-383:76 ExpBox False + 91 115538 Intersections 383:22-383:76 ExpBox False + 92 115538 Intersections 383:9-383:76 LocalBox ["intersectWithBox","y_interval"] + 93 115538 Intersections 382:51-382:51 ExpBox False + 94 115538 Intersections 382:43-382:52 ExpBox False + 95 115538 Intersections 382:66-382:66 ExpBox False + 96 115538 Intersections 382:54-382:67 ExpBox False + 97 115538 Intersections 382:70-382:71 ExpBox False + 98 115538 Intersections 382:74-382:75 ExpBox False + 99 115538 Intersections 382:69-382:76 ExpBox False + 100 115538 Intersections 382:22-382:76 ExpBox False + 101 115538 Intersections 382:9-382:76 LocalBox ["intersectWithBox","x_interval"] + 102 115538 Intersections 385:38-385:47 ExpBox False + 103 115538 Intersections 386:39-386:48 ExpBox False + 104 115538 Intersections 386:50-386:59 ExpBox False + 105 115538 Intersections 386:20-386:60 ExpBox False + 106 115538 Intersections 385:20-386:60 ExpBox False + 107 115538 Intersections 385:9-386:60 LocalBox ["intersectWithBox","interval"] + 108 115538 Intersections 381:16-381:23 ExpBox False + 109 115538 Intersections 381:5-381:23 ExpBox False + 110 115538 Intersections 380:1-386:60 TopLevelBox ["intersectWithBox"] + 111 0 Intersections 359:14-359:14 ExpBox False + 112 0 Intersections 359:11-359:14 ExpBox False + 113 0 Intersections 359:18-359:18 ExpBox False + 114 0 Intersections 359:22-359:22 ExpBox False + 115 0 Intersections 359:18-359:22 ExpBox False + 116 0 Intersections 359:26-359:26 ExpBox False + 117 0 Intersections 359:18-359:26 ExpBox False + 118 0 Intersections 359:11-359:26 ExpBox False + 119 0 Intersections 359:7-359:26 LocalBox ["quadratic","d"] + 120 0 Intersections 360:15-360:15 ExpBox False + 121 0 Intersections 360:24-360:24 ExpBox False + 122 0 Intersections 360:15-360:24 ExpBox False + 123 0 Intersections 360:15-360:24 BinBox CondBinBox True + 124 0 Intersections 360:15-360:24 BinBox CondBinBox False + 125 0 Intersections 360:31-360:31 ExpBox True + 126 0 Intersections 360:38-360:38 ExpBox True + 127 0 Intersections 360:12-360:38 ExpBox False + 128 0 Intersections 360:7-360:38 LocalBox ["quadratic","d'"] + 129 0 Intersections 361:9-361:10 ExpBox False + 130 0 Intersections 361:14-361:14 ExpBox False + 131 0 Intersections 361:9-361:14 ExpBox False + 132 0 Intersections 361:9-361:14 BinBox CondBinBox True + 133 0 Intersections 361:9-361:14 BinBox CondBinBox False + 134 0 Intersections 362:11-362:17 ExpBox True + 135 0 Intersections 364:12-364:12 ExpBox False + 136 0 Intersections 364:16-364:16 ExpBox False + 137 0 Intersections 364:12-364:16 ExpBox False + 138 0 Intersections 364:12-364:16 BinBox CondBinBox True + 139 0 Intersections 364:12-364:16 BinBox CondBinBox False + 140 0 Intersections 364:32-364:32 ExpBox False + 141 0 Intersections 364:30-364:33 ExpBox False + 142 0 Intersections 364:42-364:43 ExpBox False + 143 0 Intersections 364:37-364:43 ExpBox False + 144 0 Intersections 364:29-364:44 ExpBox False + 145 0 Intersections 364:49-364:49 ExpBox False + 146 0 Intersections 364:53-364:53 ExpBox False + 147 0 Intersections 364:48-364:54 ExpBox False + 148 0 Intersections 364:29-364:54 ExpBox False + 149 0 Intersections 365:32-365:32 ExpBox False + 150 0 Intersections 365:30-365:33 ExpBox False + 151 0 Intersections 365:42-365:43 ExpBox False + 152 0 Intersections 365:37-365:43 ExpBox False + 153 0 Intersections 365:29-365:44 ExpBox False + 154 0 Intersections 365:49-365:49 ExpBox False + 155 0 Intersections 365:53-365:53 ExpBox False + 156 0 Intersections 365:48-365:54 ExpBox False + 157 0 Intersections 365:29-365:54 ExpBox False + 158 0 Intersections 364:28-365:55 ExpBox False + 159 0 Intersections 364:23-365:55 ExpBox True + 160 0 Intersections 366:32-366:32 ExpBox False + 161 0 Intersections 366:30-366:33 ExpBox False + 162 0 Intersections 366:42-366:43 ExpBox False + 163 0 Intersections 366:37-366:43 ExpBox False + 164 0 Intersections 366:29-366:44 ExpBox False + 165 0 Intersections 366:49-366:49 ExpBox False + 166 0 Intersections 366:53-366:53 ExpBox False + 167 0 Intersections 366:48-366:54 ExpBox False + 168 0 Intersections 366:29-366:54 ExpBox False + 169 0 Intersections 367:32-367:32 ExpBox False + 170 0 Intersections 367:30-367:33 ExpBox False + 171 0 Intersections 367:42-367:43 ExpBox False + 172 0 Intersections 367:37-367:43 ExpBox False + 173 0 Intersections 367:29-367:44 ExpBox False + 174 0 Intersections 367:49-367:49 ExpBox False + 175 0 Intersections 367:53-367:53 ExpBox False + 176 0 Intersections 367:48-367:54 ExpBox False + 177 0 Intersections 367:29-367:54 ExpBox False + 178 0 Intersections 366:28-367:55 ExpBox False + 179 0 Intersections 366:23-367:55 ExpBox True + 180 0 Intersections 364:9-367:55 ExpBox True + 181 0 Intersections 359:3-367:55 ExpBox False + 182 0 Intersections 357:1-367:55 TopLevelBox ["quadratic"] + 183 0 Intersections 348:23-348:23 ExpBox True + 184 0 Intersections 349:27-349:27 ExpBox False + 185 0 Intersections 349:23-349:27 ExpBox True + 186 0 Intersections 348:9-349:27 LocalBox ["intersectConeSide","xor"] + 187 0 Intersections 345:24-345:24 ExpBox False + 188 0 Intersections 345:13-345:24 ExpBox False + 189 0 Intersections 345:9-345:24 LocalBox ["intersectConeSide","c"] + 190 0 Intersections 344:24-344:24 ExpBox False + 191 0 Intersections 344:13-344:24 ExpBox False + 192 0 Intersections 344:9-344:24 LocalBox ["intersectConeSide","b"] + 193 0 Intersections 343:24-343:24 ExpBox False + 194 0 Intersections 343:13-343:24 ExpBox False + 195 0 Intersections 343:9-343:24 LocalBox ["intersectConeSide","a"] + 196 0 Intersections 342:20-342:20 ExpBox False + 197 0 Intersections 342:13-342:20 ExpBox False + 198 0 Intersections 342:9-342:20 LocalBox ["intersectConeSide","z"] + 199 0 Intersections 341:20-341:20 ExpBox False + 200 0 Intersections 341:13-341:20 ExpBox False + 201 0 Intersections 341:9-341:20 LocalBox ["intersectConeSide","y"] + 202 0 Intersections 340:20-340:20 ExpBox False + 203 0 Intersections 340:13-340:20 ExpBox False + 204 0 Intersections 340:9-340:20 LocalBox ["intersectConeSide","x"] + 205 0 Intersections 335:24-335:24 ExpBox False + 206 0 Intersections 335:28-335:28 ExpBox False + 207 0 Intersections 335:32-335:32 ExpBox False + 208 0 Intersections 335:28-335:32 ExpBox False + 209 0 Intersections 335:24-335:32 ExpBox False + 210 0 Intersections 335:19-335:32 LocalBox ["intersectConeSide","g","z0"] + 211 0 Intersections 334:24-334:24 ExpBox False + 212 0 Intersections 334:28-334:28 ExpBox False + 213 0 Intersections 334:32-334:32 ExpBox False + 214 0 Intersections 334:28-334:32 ExpBox False + 215 0 Intersections 334:24-334:32 ExpBox False + 216 0 Intersections 334:19-334:32 LocalBox ["intersectConeSide","g","y0"] + 217 0 Intersections 333:24-333:24 ExpBox False + 218 0 Intersections 333:28-333:28 ExpBox False + 219 0 Intersections 333:32-333:32 ExpBox False + 220 0 Intersections 333:28-333:32 ExpBox False + 221 0 Intersections 333:24-333:32 ExpBox False + 222 0 Intersections 333:19-333:32 LocalBox ["intersectConeSide","g","x0"] + 223 0 Intersections 336:31-336:32 ExpBox False + 224 0 Intersections 336:34-336:35 ExpBox False + 225 0 Intersections 336:37-336:38 ExpBox False + 226 0 Intersections 336:24-336:38 ExpBox False + 227 0 Intersections 336:19-336:38 LocalBox ["intersectConeSide","g","p0"] + 228 0 Intersections 337:24-337:32 ExpBox False + 229 0 Intersections 337:43-337:44 ExpBox False + 230 0 Intersections 337:48-337:49 ExpBox False + 231 0 Intersections 337:46-337:50 ExpBox False + 232 0 Intersections 337:52-337:53 ExpBox False + 233 0 Intersections 337:36-337:53 ExpBox False + 234 0 Intersections 337:24-337:53 ExpBox False + 235 0 Intersections 337:19-337:53 LocalBox ["intersectConeSide","g","v0"] + 236 0 Intersections 338:39-338:40 ExpBox False + 237 0 Intersections 338:30-338:40 ExpBox False + 238 0 Intersections 332:34-332:34 ExpBox False + 239 0 Intersections 332:36-332:36 ExpBox False + 240 0 Intersections 332:38-332:38 ExpBox False + 241 0 Intersections 332:28-332:38 ExpBox False + 242 0 Intersections 332:19-332:38 LocalBox ["intersectConeSide","g","origin"] + 243 0 Intersections 331:16-331:16 ExpBox False + 244 0 Intersections 331:26-331:31 ExpBox False + 245 0 Intersections 331:33-331:34 ExpBox False + 246 0 Intersections 331:36-331:37 ExpBox False + 247 0 Intersections 331:20-331:37 ExpBox False + 248 0 Intersections 331:41-331:48 ExpBox False + 249 0 Intersections 331:51-331:52 ExpBox False + 250 0 Intersections 331:55-331:61 ExpBox False + 251 0 Intersections 331:40-331:62 ExpBox False + 252 0 Intersections 331:19-331:63 ExpBox False + 253 0 Intersections 331:15-331:64 ExpBox False + 254 0 Intersections 331:9-338:40 LocalBox ["intersectConeSide","g"] + 255 0 Intersections 315:17-315:17 ExpBox False + 256 0 Intersections 315:14-315:17 ExpBox False + 257 0 Intersections 315:24-315:24 ExpBox False + 258 0 Intersections 315:21-315:24 ExpBox False + 259 0 Intersections 315:14-315:24 ExpBox False + 260 0 Intersections 315:31-315:31 ExpBox False + 261 0 Intersections 315:28-315:31 ExpBox False + 262 0 Intersections 315:14-315:31 ExpBox False + 263 0 Intersections 315:9-315:31 LocalBox ["intersectConeSide","c3"] + 264 0 Intersections 314:14-314:14 ExpBox False + 265 0 Intersections 314:19-314:19 ExpBox False + 266 0 Intersections 314:23-314:23 ExpBox False + 267 0 Intersections 314:19-314:23 ExpBox False + 268 0 Intersections 314:27-314:27 ExpBox False + 269 0 Intersections 314:31-314:31 ExpBox False + 270 0 Intersections 314:27-314:31 ExpBox False + 271 0 Intersections 314:19-314:31 ExpBox False + 272 0 Intersections 314:35-314:35 ExpBox False + 273 0 Intersections 314:39-314:39 ExpBox False + 274 0 Intersections 314:35-314:39 ExpBox False + 275 0 Intersections 314:18-314:40 ExpBox False + 276 0 Intersections 314:14-314:40 ExpBox False + 277 0 Intersections 314:9-314:40 LocalBox ["intersectConeSide","c2"] + 278 0 Intersections 313:17-313:17 ExpBox False + 279 0 Intersections 313:14-313:17 ExpBox False + 280 0 Intersections 313:24-313:24 ExpBox False + 281 0 Intersections 313:21-313:24 ExpBox False + 282 0 Intersections 313:14-313:24 ExpBox False + 283 0 Intersections 313:31-313:31 ExpBox False + 284 0 Intersections 313:28-313:31 ExpBox False + 285 0 Intersections 313:14-313:31 ExpBox False + 286 0 Intersections 313:9-313:31 LocalBox ["intersectConeSide","c1"] + 287 0 Intersections 316:24-316:25 ExpBox False + 288 0 Intersections 316:27-316:28 ExpBox False + 289 0 Intersections 316:30-316:31 ExpBox False + 290 0 Intersections 316:14-316:31 ExpBox False + 291 0 Intersections 317:20-317:29 ExpBox True + 292 0 Intersections 325:22-325:22 ExpBox False + 293 0 Intersections 325:26-325:27 ExpBox False + 294 0 Intersections 325:31-325:31 ExpBox False + 295 0 Intersections 325:26-325:31 ExpBox False + 296 0 Intersections 325:22-325:31 ExpBox False + 297 0 Intersections 325:17-325:31 LocalBox ["intersectConeSide","y2"] + 298 0 Intersections 324:22-324:22 ExpBox False + 299 0 Intersections 324:26-324:27 ExpBox False + 300 0 Intersections 324:31-324:31 ExpBox False + 301 0 Intersections 324:26-324:31 ExpBox False + 302 0 Intersections 324:22-324:31 ExpBox False + 303 0 Intersections 324:17-324:31 LocalBox ["intersectConeSide","y1"] + 304 0 Intersections 326:20-326:21 ExpBox False + 305 0 Intersections 326:30-326:30 ExpBox False + 306 0 Intersections 326:20-326:30 ExpBox False + 307 0 Intersections 326:20-326:30 BinBox CondBinBox True + 308 0 Intersections 326:20-326:30 BinBox CondBinBox False + 309 0 Intersections 326:67-326:68 ExpBox False + 310 0 Intersections 326:64-326:69 ExpBox False + 311 0 Intersections 326:74-326:75 ExpBox False + 312 0 Intersections 326:71-326:76 ExpBox False + 313 0 Intersections 326:54-326:76 ExpBox True + 314 0 Intersections 327:25-327:26 ExpBox False + 315 0 Intersections 327:35-327:35 ExpBox False + 316 0 Intersections 327:25-327:35 ExpBox False + 317 0 Intersections 327:25-327:35 BinBox CondBinBox True + 318 0 Intersections 327:25-327:35 BinBox CondBinBox False + 319 0 Intersections 327:67-327:68 ExpBox False + 320 0 Intersections 327:64-327:69 ExpBox False + 321 0 Intersections 327:74-327:75 ExpBox False + 322 0 Intersections 327:71-327:76 ExpBox False + 323 0 Intersections 327:54-327:76 ExpBox True + 324 0 Intersections 328:26-328:27 ExpBox False + 325 0 Intersections 328:31-328:31 ExpBox False + 326 0 Intersections 328:25-328:32 ExpBox False + 327 0 Intersections 328:41-328:42 ExpBox False + 328 0 Intersections 328:46-328:46 ExpBox False + 329 0 Intersections 328:40-328:47 ExpBox False + 330 0 Intersections 328:25-328:47 ExpBox False + 331 0 Intersections 328:25-328:47 BinBox CondBinBox True + 332 0 Intersections 328:25-328:47 BinBox CondBinBox False + 333 0 Intersections 328:67-328:68 ExpBox False + 334 0 Intersections 328:64-328:69 ExpBox False + 335 0 Intersections 328:74-328:75 ExpBox False + 336 0 Intersections 328:71-328:76 ExpBox False + 337 0 Intersections 328:54-328:76 ExpBox True + 338 0 Intersections 329:67-329:68 ExpBox False + 339 0 Intersections 329:64-329:69 ExpBox False + 340 0 Intersections 329:74-329:75 ExpBox False + 341 0 Intersections 329:71-329:76 ExpBox False + 342 0 Intersections 329:54-329:76 ExpBox True + 343 0 Intersections 328:22-329:76 ExpBox True + 344 0 Intersections 327:22-329:76 ExpBox True + 345 0 Intersections 324:13-329:76 ExpBox True + 346 0 Intersections 313:5-329:76 ExpBox False + 347 0 Intersections 307:1-349:27 TopLevelBox ["intersectConeSide"] + 348 0 Intersections 292:24-292:24 ExpBox False + 349 0 Intersections 292:13-292:24 ExpBox False + 350 0 Intersections 292:9-292:24 LocalBox ["intersectCylSide","c"] + 351 0 Intersections 291:24-291:24 ExpBox False + 352 0 Intersections 291:13-291:24 ExpBox False + 353 0 Intersections 291:9-291:24 LocalBox ["intersectCylSide","b"] + 354 0 Intersections 290:24-290:24 ExpBox False + 355 0 Intersections 290:13-290:24 ExpBox False + 356 0 Intersections 290:9-290:24 LocalBox ["intersectCylSide","a"] + 357 0 Intersections 289:20-289:20 ExpBox False + 358 0 Intersections 289:13-289:20 ExpBox False + 359 0 Intersections 289:9-289:20 LocalBox ["intersectCylSide","z"] + 360 0 Intersections 288:20-288:20 ExpBox False + 361 0 Intersections 288:13-288:20 ExpBox False + 362 0 Intersections 288:9-288:20 LocalBox ["intersectCylSide","y"] + 363 0 Intersections 287:20-287:20 ExpBox False + 364 0 Intersections 287:13-287:20 ExpBox False + 365 0 Intersections 287:9-287:20 LocalBox ["intersectCylSide","x"] + 366 0 Intersections 282:24-282:24 ExpBox False + 367 0 Intersections 282:28-282:28 ExpBox False + 368 0 Intersections 282:32-282:32 ExpBox False + 369 0 Intersections 282:28-282:32 ExpBox False + 370 0 Intersections 282:24-282:32 ExpBox False + 371 0 Intersections 282:19-282:32 LocalBox ["intersectCylSide","g","z0"] + 372 0 Intersections 281:24-281:24 ExpBox False + 373 0 Intersections 281:28-281:28 ExpBox False + 374 0 Intersections 281:32-281:32 ExpBox False + 375 0 Intersections 281:28-281:32 ExpBox False + 376 0 Intersections 281:24-281:32 ExpBox False + 377 0 Intersections 281:19-281:32 LocalBox ["intersectCylSide","g","y0"] + 378 0 Intersections 280:24-280:24 ExpBox False + 379 0 Intersections 280:28-280:28 ExpBox False + 380 0 Intersections 280:32-280:32 ExpBox False + 381 0 Intersections 280:28-280:32 ExpBox False + 382 0 Intersections 280:24-280:32 ExpBox False + 383 0 Intersections 280:19-280:32 LocalBox ["intersectCylSide","g","x0"] + 384 0 Intersections 283:31-283:32 ExpBox False + 385 0 Intersections 283:34-283:35 ExpBox False + 386 0 Intersections 283:37-283:38 ExpBox False + 387 0 Intersections 283:24-283:38 ExpBox False + 388 0 Intersections 283:19-283:38 LocalBox ["intersectCylSide","g","p0"] + 389 0 Intersections 284:31-284:32 ExpBox False + 390 0 Intersections 284:34-284:34 ExpBox False + 391 0 Intersections 284:36-284:37 ExpBox False + 392 0 Intersections 284:24-284:37 ExpBox False + 393 0 Intersections 284:19-284:37 LocalBox ["intersectCylSide","g","v0"] + 394 0 Intersections 285:39-285:40 ExpBox False + 395 0 Intersections 285:30-285:40 ExpBox False + 396 0 Intersections 279:34-279:34 ExpBox False + 397 0 Intersections 279:36-279:36 ExpBox False + 398 0 Intersections 279:38-279:38 ExpBox False + 399 0 Intersections 279:28-279:38 ExpBox False + 400 0 Intersections 279:19-279:38 LocalBox ["intersectCylSide","g","origin"] + 401 0 Intersections 278:16-278:16 ExpBox False + 402 0 Intersections 278:32-278:37 ExpBox False + 403 0 Intersections 278:39-278:40 ExpBox False + 404 0 Intersections 278:42-278:43 ExpBox False + 405 0 Intersections 278:20-278:43 ExpBox False + 406 0 Intersections 278:47-278:58 ExpBox False + 407 0 Intersections 278:61-278:62 ExpBox False + 408 0 Intersections 278:65-278:71 ExpBox False + 409 0 Intersections 278:46-278:72 ExpBox False + 410 0 Intersections 278:19-278:73 ExpBox False + 411 0 Intersections 278:15-278:74 ExpBox False + 412 0 Intersections 278:9-285:40 LocalBox ["intersectCylSide","g"] + 413 0 Intersections 277:19-277:19 ExpBox False + 414 0 Intersections 277:16-277:19 ExpBox False + 415 0 Intersections 277:26-277:26 ExpBox False + 416 0 Intersections 277:23-277:26 ExpBox False + 417 0 Intersections 277:16-277:26 ExpBox False + 418 0 Intersections 277:9-277:26 LocalBox ["intersectCylSide","sqxy"] + 419 0 Intersections 263:12-263:12 ExpBox False + 420 0 Intersections 263:9-263:12 ExpBox False + 421 0 Intersections 263:19-263:19 ExpBox False + 422 0 Intersections 263:16-263:19 ExpBox False + 423 0 Intersections 263:8-263:20 ExpBox False + 424 0 Intersections 263:29-263:29 ExpBox False + 425 0 Intersections 263:8-263:29 ExpBox False + 426 0 Intersections 263:8-263:29 BinBox CondBinBox True + 427 0 Intersections 263:8-263:29 BinBox CondBinBox False + 428 0 Intersections 266:13-266:16 ExpBox False + 429 0 Intersections 266:25-266:27 ExpBox False + 430 0 Intersections 266:13-266:27 ExpBox False + 431 0 Intersections 266:32-266:35 ExpBox False + 432 0 Intersections 266:39-266:41 ExpBox False + 433 0 Intersections 266:32-266:41 ExpBox False + 434 0 Intersections 266:12-266:42 ExpBox False + 435 0 Intersections 266:12-266:42 BinBox CondBinBox True + 436 0 Intersections 266:12-266:42 BinBox CondBinBox False + 437 0 Intersections 266:49-266:57 ExpBox True + 438 0 Intersections 266:64-266:73 ExpBox True + 439 0 Intersections 266:9-266:73 ExpBox True + 440 0 Intersections 271:21-271:21 ExpBox False + 441 0 Intersections 271:18-271:21 ExpBox False + 442 0 Intersections 271:28-271:28 ExpBox False + 443 0 Intersections 271:25-271:28 ExpBox False + 444 0 Intersections 271:18-271:28 ExpBox False + 445 0 Intersections 271:32-271:32 ExpBox False + 446 0 Intersections 271:18-271:32 ExpBox False + 447 0 Intersections 271:13-271:32 LocalBox ["intersectCylSide","c3"] + 448 0 Intersections 270:18-270:18 ExpBox False + 449 0 Intersections 270:23-270:23 ExpBox False + 450 0 Intersections 270:27-270:27 ExpBox False + 451 0 Intersections 270:23-270:27 ExpBox False + 452 0 Intersections 270:31-270:31 ExpBox False + 453 0 Intersections 270:35-270:35 ExpBox False + 454 0 Intersections 270:31-270:35 ExpBox False + 455 0 Intersections 270:22-270:36 ExpBox False + 456 0 Intersections 270:18-270:36 ExpBox False + 457 0 Intersections 270:13-270:36 LocalBox ["intersectCylSide","c2"] + 458 0 Intersections 269:21-269:21 ExpBox False + 459 0 Intersections 269:18-269:21 ExpBox False + 460 0 Intersections 269:28-269:28 ExpBox False + 461 0 Intersections 269:25-269:28 ExpBox False + 462 0 Intersections 269:18-269:28 ExpBox False + 463 0 Intersections 269:13-269:28 LocalBox ["intersectCylSide","c1"] + 464 0 Intersections 273:24-273:25 ExpBox False + 465 0 Intersections 273:27-273:28 ExpBox False + 466 0 Intersections 273:30-273:31 ExpBox False + 467 0 Intersections 273:14-273:31 ExpBox False + 468 0 Intersections 274:20-274:29 ExpBox True + 469 0 Intersections 275:39-275:40 ExpBox False + 470 0 Intersections 275:36-275:41 ExpBox False + 471 0 Intersections 275:46-275:47 ExpBox False + 472 0 Intersections 275:43-275:48 ExpBox False + 473 0 Intersections 275:26-275:48 ExpBox True + 474 0 Intersections 269:9-275:48 ExpBox True + 475 0 Intersections 263:5-275:48 ExpBox False + 476 0 Intersections 259:1-292:24 TopLevelBox ["intersectCylSide"] + 477 0 Intersections 232:38-232:44 ExpBox True + 478 0 Intersections 233:38-233:44 ExpBox True + 479 1 Intersections 234:38-234:44 ExpBox True + 480 31374 Intersections 242:13-242:13 ExpBox False + 481 31374 Intersections 242:22-242:22 ExpBox False + 482 31374 Intersections 242:13-242:22 ExpBox False + 483 0 Intersections 242:13-242:22 BinBox GuardBinBox True + 484 31374 Intersections 242:13-242:22 BinBox GuardBinBox False + 485 0 Intersections 242:32-242:33 ExpBox False + 486 0 Intersections 242:37-242:37 ExpBox False + 487 0 Intersections 242:40-242:40 ExpBox False + 488 0 Intersections 242:44-242:50 ExpBox False + 489 0 Intersections 242:40-242:50 ExpBox False + 490 0 Intersections 242:36-242:51 ExpBox False + 491 0 Intersections 242:31-242:52 ExpBox False + 492 0 Intersections 242:26-242:52 ExpBox True + 493 31374 Intersections 243:13-243:13 ExpBox False + 494 31374 Intersections 243:22-243:22 ExpBox False + 495 31374 Intersections 243:13-243:22 ExpBox False + 496 23819 Intersections 243:13-243:22 BinBox GuardBinBox True + 497 1 Intersections 243:13-243:22 BinBox GuardBinBox False + 498 23819 Intersections 243:31-243:34 ExpBox False + 499 23819 Intersections 243:26-243:34 ExpBox True + 500 1 Intersections 244:13-244:21 ExpBox False + 501 1 Intersections 244:13-244:21 BinBox GuardBinBox True + 502 0 Intersections 244:13-244:21 BinBox GuardBinBox False + 503 1 Intersections 244:26-244:32 ExpBox True + 504 31374 Intersections 240:9-244:32 LocalBox ["intersectSlabIval","checkInterval"] + 505 31374 Intersections 239:17-239:18 ExpBox False + 506 31374 Intersections 239:22-239:23 ExpBox False + 507 31374 Intersections 239:17-239:23 ExpBox False + 508 14552 Intersections 239:17-239:23 BinBox CondBinBox True + 509 16822 Intersections 239:17-239:23 BinBox CondBinBox False + 510 14552 Intersections 239:30-239:32 ExpBox True + 511 16822 Intersections 239:39-239:41 ExpBox True + 512 31374 Intersections 239:14-239:41 ExpBox False + 513 31374 Intersections 239:9-239:41 LocalBox ["intersectSlabIval","mv"] + 514 31374 Intersections 238:17-238:18 ExpBox False + 515 31374 Intersections 238:22-238:23 ExpBox False + 516 31374 Intersections 238:17-238:23 ExpBox False + 517 22758 Intersections 238:17-238:23 BinBox CondBinBox True + 518 8616 Intersections 238:17-238:23 BinBox CondBinBox False + 519 22758 Intersections 238:30-238:32 ExpBox True + 520 8616 Intersections 238:39-238:41 ExpBox True + 521 31374 Intersections 238:14-238:41 ExpBox False + 522 31374 Intersections 238:9-238:41 LocalBox ["intersectSlabIval","nu"] + 523 31374 Intersections 237:20-237:21 ExpBox False + 524 31374 Intersections 237:24-237:25 ExpBox False + 525 31374 Intersections 237:19-237:26 ExpBox False + 526 31374 Intersections 237:5-237:26 ExpBox True + 527 34618 Intersections 232:1-244:32 TopLevelBox ["intersectSlabIval"] + 528 51927 Intersections 227:5-227:5 ExpBox False + 529 51927 Intersections 227:14-227:14 ExpBox False + 530 51927 Intersections 227:5-227:14 ExpBox False + 531 0 Intersections 227:5-227:14 BinBox GuardBinBox True + 532 51927 Intersections 227:5-227:14 BinBox GuardBinBox False + 533 0 Intersections 227:22-227:22 ExpBox False + 534 0 Intersections 227:27-227:27 ExpBox False + 535 0 Intersections 227:21-227:28 ExpBox False + 536 0 Intersections 227:34-227:34 ExpBox False + 537 0 Intersections 227:39-227:39 ExpBox False + 538 0 Intersections 227:33-227:40 ExpBox False + 539 0 Intersections 227:21-227:40 ExpBox False + 540 0 Intersections 227:21-227:40 BinBox CondBinBox True + 541 0 Intersections 227:21-227:40 BinBox CondBinBox False + 542 0 Intersections 228:30-228:30 ExpBox False + 543 0 Intersections 228:34-228:36 ExpBox False + 544 0 Intersections 228:33-228:36 ExpBox False + 545 0 Intersections 228:29-228:37 ExpBox False + 546 0 Intersections 228:41-228:41 ExpBox False + 547 0 Intersections 228:44-228:46 ExpBox False + 548 0 Intersections 228:40-228:47 ExpBox False + 549 0 Intersections 228:28-228:48 ExpBox False + 550 0 Intersections 228:23-228:48 ExpBox True + 551 0 Intersections 228:55-228:61 ExpBox True + 552 0 Intersections 227:18-228:61 ExpBox True + 553 51927 Intersections 229:5-229:5 ExpBox False + 554 51927 Intersections 229:9-229:9 ExpBox False + 555 51927 Intersections 229:5-229:9 ExpBox False + 556 37729 Intersections 229:5-229:9 BinBox GuardBinBox True + 557 14198 Intersections 229:5-229:9 BinBox GuardBinBox False + 558 7735 Intersections 229:25-229:25 ExpBox False + 559 35117 Intersections 229:31-229:31 ExpBox False + 560 35117 Intersections 229:29-229:32 ExpBox False + 561 35117 Intersections 229:34-229:34 ExpBox False + 562 35117 Intersections 229:29-229:34 ExpBox False + 563 35117 Intersections 229:24-229:35 ExpBox False + 564 945 Intersections 229:39-229:39 ExpBox False + 565 35117 Intersections 229:43-229:43 ExpBox False + 566 35117 Intersections 229:45-229:45 ExpBox False + 567 35117 Intersections 229:42-229:46 ExpBox False + 568 35117 Intersections 229:48-229:48 ExpBox False + 569 35117 Intersections 229:42-229:48 ExpBox False + 570 35117 Intersections 229:38-229:49 ExpBox False + 571 35117 Intersections 229:23-229:50 ExpBox False + 572 37729 Intersections 229:18-229:50 ExpBox True + 573 14198 Intersections 230:5-230:13 ExpBox False + 574 14198 Intersections 230:5-230:13 BinBox GuardBinBox True + 575 0 Intersections 230:5-230:13 BinBox GuardBinBox False + 576 2019 Intersections 230:25-230:25 ExpBox False + 577 13566 Intersections 230:29-230:29 ExpBox False + 578 13566 Intersections 230:31-230:31 ExpBox False + 579 13566 Intersections 230:28-230:32 ExpBox False + 580 13566 Intersections 230:34-230:34 ExpBox False + 581 13566 Intersections 230:28-230:34 ExpBox False + 582 13566 Intersections 230:24-230:35 ExpBox False + 583 1082 Intersections 230:39-230:39 ExpBox False + 584 13566 Intersections 230:45-230:45 ExpBox False + 585 13566 Intersections 230:43-230:46 ExpBox False + 586 13566 Intersections 230:48-230:48 ExpBox False + 587 13566 Intersections 230:43-230:48 ExpBox False + 588 13566 Intersections 230:38-230:49 ExpBox False + 589 13566 Intersections 230:23-230:50 ExpBox False + 590 14198 Intersections 230:18-230:50 ExpBox True + 591 51927 Intersections 226:1-230:50 TopLevelBox ["intersectCubeSlab"] + 592 17309 Intersections 224:24-224:24 ExpBox False + 593 17309 Intersections 224:13-224:24 ExpBox False + 594 17309 Intersections 224:9-224:24 LocalBox ["intersectCube","c"] + 595 17309 Intersections 223:24-223:24 ExpBox False + 596 17309 Intersections 223:13-223:24 ExpBox False + 597 17309 Intersections 223:9-223:24 LocalBox ["intersectCube","b"] + 598 17309 Intersections 222:24-222:24 ExpBox False + 599 17309 Intersections 222:13-222:24 ExpBox False + 600 17309 Intersections 222:9-222:24 LocalBox ["intersectCube","a"] + 601 17309 Intersections 221:20-221:20 ExpBox False + 602 17309 Intersections 221:13-221:20 ExpBox False + 603 17309 Intersections 221:9-221:20 LocalBox ["intersectCube","z"] + 604 17309 Intersections 220:20-220:20 ExpBox False + 605 17309 Intersections 220:13-220:20 ExpBox False + 606 17309 Intersections 220:9-220:20 LocalBox ["intersectCube","y"] + 607 14065 Intersections 219:20-219:20 ExpBox False + 608 14065 Intersections 219:13-219:20 ExpBox False + 609 14065 Intersections 219:9-219:20 LocalBox ["intersectCube","x"] + 610 1 Intersections 218:26-218:26 ExpBox False + 611 1 Intersections 218:28-218:28 ExpBox False + 612 1 Intersections 218:30-218:30 ExpBox False + 613 1 Intersections 218:19-218:30 ExpBox False + 614 1 Intersections 218:9-218:30 LocalBox ["intersectCube","vectorZ"] + 615 1 Intersections 217:26-217:26 ExpBox False + 616 1 Intersections 217:28-217:28 ExpBox False + 617 1 Intersections 217:30-217:30 ExpBox False + 618 1 Intersections 217:19-217:30 ExpBox False + 619 1 Intersections 217:9-217:30 LocalBox ["intersectCube","vectorY"] + 620 1 Intersections 216:26-216:26 ExpBox False + 621 1 Intersections 216:28-216:28 ExpBox False + 622 1 Intersections 216:30-216:30 ExpBox False + 623 1 Intersections 216:19-216:30 ExpBox False + 624 1 Intersections 216:9-216:30 LocalBox ["intersectCube","vectorX"] + 625 1 Intersections 215:18-215:27 ExpBox False + 626 1 Intersections 215:30-215:36 ExpBox False + 627 1 Intersections 215:39-215:45 ExpBox False + 628 879 Intersections 215:17-215:46 ExpBox False + 629 879 Intersections 215:9-215:46 LocalBox ["intersectCube","face5"] + 630 1 Intersections 214:18-214:24 ExpBox False + 631 1 Intersections 214:30-214:36 ExpBox False + 632 1 Intersections 214:39-214:45 ExpBox False + 633 1890 Intersections 214:17-214:46 ExpBox False + 634 1890 Intersections 214:9-214:46 LocalBox ["intersectCube","face4"] + 635 0 Intersections 213:18-213:26 ExpBox False + 636 0 Intersections 213:30-213:36 ExpBox False + 637 0 Intersections 213:39-213:45 ExpBox False + 638 1074 Intersections 213:17-213:46 ExpBox False + 639 1074 Intersections 213:9-213:46 LocalBox ["intersectCube","face3"] + 640 1 Intersections 212:18-212:25 ExpBox False + 641 1 Intersections 212:30-212:36 ExpBox False + 642 1 Intersections 212:39-212:45 ExpBox False + 643 2164 Intersections 212:17-212:46 ExpBox False + 644 2164 Intersections 212:9-212:46 LocalBox ["intersectCube","face2"] + 645 0 Intersections 211:18-211:25 ExpBox False + 646 0 Intersections 211:30-211:36 ExpBox False + 647 0 Intersections 211:39-211:45 ExpBox False + 648 0 Intersections 211:17-211:46 ExpBox False + 649 0 Intersections 211:9-211:46 LocalBox ["intersectCube","face1"] + 650 1 Intersections 210:18-210:26 ExpBox False + 651 1 Intersections 210:30-210:36 ExpBox False + 652 1 Intersections 210:39-210:45 ExpBox False + 653 5774 Intersections 210:17-210:46 ExpBox False + 654 5774 Intersections 210:9-210:46 LocalBox ["intersectCube","face0"] + 655 5728 Intersections 209:36-209:38 ExpBox False + 656 5728 Intersections 209:40-209:40 ExpBox False + 657 5728 Intersections 209:22-209:40 ExpBox False + 658 5728 Intersections 209:17-209:40 LocalBox ["intersectCube","g","p0"] + 659 11781 Intersections 208:14-208:14 ExpBox False + 660 0 Intersections 208:25-208:26 ExpBox False + 661 5728 Intersections 208:28-208:29 ExpBox False + 662 5728 Intersections 208:31-208:32 ExpBox False + 663 5728 Intersections 208:18-208:32 ExpBox False + 664 5728 Intersections 208:36-208:36 ExpBox False + 665 5728 Intersections 208:39-208:40 ExpBox False + 666 5728 Intersections 208:43-208:49 ExpBox False + 667 5728 Intersections 208:35-208:50 ExpBox False + 668 11781 Intersections 208:17-208:51 ExpBox False + 669 11781 Intersections 208:13-208:52 ExpBox False + 670 11781 Intersections 207:9-209:40 LocalBox ["intersectCube","g"] + 671 2164 Intersections 202:47-202:51 ExpBox False + 672 1074 Intersections 202:53-202:57 ExpBox False + 673 14065 Intersections 202:59-202:59 ExpBox False + 674 17309 Intersections 202:61-202:61 ExpBox False + 675 17309 Intersections 202:28-202:62 ExpBox False + 676 879 Intersections 203:47-203:51 ExpBox False + 677 1890 Intersections 203:53-203:57 ExpBox False + 678 17309 Intersections 203:59-203:59 ExpBox False + 679 17309 Intersections 203:61-203:61 ExpBox False + 680 17309 Intersections 203:28-203:62 ExpBox False + 681 5774 Intersections 204:47-204:51 ExpBox False + 682 0 Intersections 204:53-204:57 ExpBox False + 683 17309 Intersections 204:59-204:59 ExpBox False + 684 17309 Intersections 204:61-204:61 ExpBox False + 685 17309 Intersections 204:28-204:62 ExpBox False + 686 17309 Intersections 203:9-204:63 ExpBox False + 687 17309 Intersections 202:10-204:63 ExpBox False + 688 1 Intersections 205:16-205:25 ExpBox True + 689 9754 Intersections 206:35-206:36 ExpBox False + 690 9754 Intersections 206:32-206:37 ExpBox False + 691 2027 Intersections 206:42-206:43 ExpBox False + 692 2027 Intersections 206:39-206:44 ExpBox False + 693 9754 Intersections 206:22-206:44 ExpBox True + 694 17309 Intersections 202:5-206:44 ExpBox False + 695 17309 Intersections 196:1-224:24 TopLevelBox ["intersectCube"] + 696 0 Intersections 180:26-180:26 ExpBox False + 697 0 Intersections 180:15-180:26 ExpBox False + 698 0 Intersections 180:11-180:26 LocalBox ["intersectSphere","c"] + 699 0 Intersections 179:26-179:26 ExpBox False + 700 0 Intersections 179:15-179:26 ExpBox False + 701 0 Intersections 179:11-179:26 LocalBox ["intersectSphere","b"] + 702 0 Intersections 178:26-178:26 ExpBox False + 703 0 Intersections 178:15-178:26 ExpBox False + 704 0 Intersections 178:11-178:26 LocalBox ["intersectSphere","a"] + 705 0 Intersections 177:22-177:22 ExpBox False + 706 0 Intersections 177:15-177:22 ExpBox False + 707 0 Intersections 177:11-177:22 LocalBox ["intersectSphere","z"] + 708 0 Intersections 176:22-176:22 ExpBox False + 709 0 Intersections 176:15-176:22 ExpBox False + 710 0 Intersections 176:11-176:22 LocalBox ["intersectSphere","y"] + 711 0 Intersections 175:22-175:22 ExpBox False + 712 0 Intersections 175:15-175:22 ExpBox False + 713 0 Intersections 175:11-175:22 LocalBox ["intersectSphere","x"] + 714 0 Intersections 185:26-185:26 ExpBox False + 715 0 Intersections 185:30-185:30 ExpBox False + 716 0 Intersections 185:34-185:34 ExpBox False + 717 0 Intersections 185:30-185:34 ExpBox False + 718 0 Intersections 185:26-185:34 ExpBox False + 719 0 Intersections 185:21-185:34 LocalBox ["intersectSphere","g","z0"] + 720 0 Intersections 184:26-184:26 ExpBox False + 721 0 Intersections 184:30-184:30 ExpBox False + 722 0 Intersections 184:34-184:34 ExpBox False + 723 0 Intersections 184:30-184:34 ExpBox False + 724 0 Intersections 184:26-184:34 ExpBox False + 725 0 Intersections 184:21-184:34 LocalBox ["intersectSphere","g","y0"] + 726 0 Intersections 183:26-183:26 ExpBox False + 727 0 Intersections 183:30-183:30 ExpBox False + 728 0 Intersections 183:34-183:34 ExpBox False + 729 0 Intersections 183:30-183:34 ExpBox False + 730 0 Intersections 183:26-183:34 ExpBox False + 731 0 Intersections 183:21-183:34 LocalBox ["intersectSphere","g","x0"] + 732 0 Intersections 186:33-186:34 ExpBox False + 733 0 Intersections 186:36-186:37 ExpBox False + 734 0 Intersections 186:39-186:40 ExpBox False + 735 0 Intersections 186:26-186:40 ExpBox False + 736 0 Intersections 186:21-186:40 LocalBox ["intersectSphere","g","p0"] + 737 0 Intersections 187:33-187:34 ExpBox False + 738 0 Intersections 187:36-187:37 ExpBox False + 739 0 Intersections 187:39-187:40 ExpBox False + 740 0 Intersections 187:26-187:40 ExpBox False + 741 0 Intersections 187:21-187:40 LocalBox ["intersectSphere","g","v0"] + 742 0 Intersections 188:41-188:42 ExpBox False + 743 0 Intersections 188:32-188:42 ExpBox False + 744 0 Intersections 182:36-182:36 ExpBox False + 745 0 Intersections 182:38-182:38 ExpBox False + 746 0 Intersections 182:40-182:40 ExpBox False + 747 0 Intersections 182:30-182:40 ExpBox False + 748 0 Intersections 182:21-182:40 LocalBox ["intersectSphere","g","origin"] + 749 0 Intersections 181:18-181:18 ExpBox False + 750 0 Intersections 181:32-181:37 ExpBox False + 751 0 Intersections 181:39-181:40 ExpBox False + 752 0 Intersections 181:42-181:43 ExpBox False + 753 0 Intersections 181:22-181:43 ExpBox False + 754 0 Intersections 181:47-181:56 ExpBox False + 755 0 Intersections 181:59-181:60 ExpBox False + 756 0 Intersections 181:63-181:69 ExpBox False + 757 0 Intersections 181:46-181:70 ExpBox False + 758 0 Intersections 181:21-181:71 ExpBox False + 759 0 Intersections 181:17-181:72 ExpBox False + 760 0 Intersections 181:11-188:42 LocalBox ["intersectSphere","g"] + 761 0 Intersections 170:17-170:17 ExpBox False + 762 0 Intersections 170:14-170:17 ExpBox False + 763 0 Intersections 170:24-170:24 ExpBox False + 764 0 Intersections 170:21-170:24 ExpBox False + 765 0 Intersections 170:14-170:24 ExpBox False + 766 0 Intersections 170:31-170:31 ExpBox False + 767 0 Intersections 170:28-170:31 ExpBox False + 768 0 Intersections 170:14-170:31 ExpBox False + 769 0 Intersections 170:35-170:35 ExpBox False + 770 0 Intersections 170:14-170:35 ExpBox False + 771 0 Intersections 170:9-170:35 LocalBox ["intersectSphere","c3"] + 772 0 Intersections 169:14-169:14 ExpBox False + 773 0 Intersections 169:19-169:19 ExpBox False + 774 0 Intersections 169:23-169:23 ExpBox False + 775 0 Intersections 169:19-169:23 ExpBox False + 776 0 Intersections 169:27-169:27 ExpBox False + 777 0 Intersections 169:31-169:31 ExpBox False + 778 0 Intersections 169:27-169:31 ExpBox False + 779 0 Intersections 169:19-169:31 ExpBox False + 780 0 Intersections 169:35-169:35 ExpBox False + 781 0 Intersections 169:39-169:39 ExpBox False + 782 0 Intersections 169:35-169:39 ExpBox False + 783 0 Intersections 169:18-169:40 ExpBox False + 784 0 Intersections 169:14-169:40 ExpBox False + 785 0 Intersections 169:9-169:40 LocalBox ["intersectSphere","c2"] + 786 0 Intersections 168:17-168:17 ExpBox False + 787 0 Intersections 168:14-168:17 ExpBox False + 788 0 Intersections 168:24-168:24 ExpBox False + 789 0 Intersections 168:21-168:24 ExpBox False + 790 0 Intersections 168:14-168:24 ExpBox False + 791 0 Intersections 168:31-168:31 ExpBox False + 792 0 Intersections 168:28-168:31 ExpBox False + 793 0 Intersections 168:14-168:31 ExpBox False + 794 0 Intersections 168:9-168:31 LocalBox ["intersectSphere","c1"] + 795 0 Intersections 172:24-172:25 ExpBox False + 796 0 Intersections 172:27-172:28 ExpBox False + 797 0 Intersections 172:30-172:31 ExpBox False + 798 0 Intersections 172:14-172:31 ExpBox False + 799 0 Intersections 173:20-173:29 ExpBox True + 800 0 Intersections 174:39-174:40 ExpBox False + 801 0 Intersections 174:36-174:41 ExpBox False + 802 0 Intersections 174:46-174:47 ExpBox False + 803 0 Intersections 174:43-174:48 ExpBox False + 804 0 Intersections 174:26-174:48 ExpBox True + 805 0 Intersections 168:5-174:48 ExpBox False + 806 0 Intersections 162:1-188:42 TopLevelBox ["intersectSphere"] + 807 26784 Intersections 154:24-154:24 ExpBox False + 808 26784 Intersections 154:13-154:24 ExpBox False + 809 26784 Intersections 154:9-154:24 LocalBox ["intersectXZPlane","c"] + 810 115538 Intersections 153:24-153:24 ExpBox False + 811 115538 Intersections 153:13-153:24 ExpBox False + 812 115538 Intersections 153:9-153:24 LocalBox ["intersectXZPlane","b"] + 813 26784 Intersections 152:24-152:24 ExpBox False + 814 26784 Intersections 152:13-152:24 ExpBox False + 815 26784 Intersections 152:9-152:24 LocalBox ["intersectXZPlane","a"] + 816 26784 Intersections 151:20-151:20 ExpBox False + 817 26784 Intersections 151:13-151:20 ExpBox False + 818 26784 Intersections 151:9-151:20 LocalBox ["intersectXZPlane","z"] + 819 115538 Intersections 150:20-150:20 ExpBox False + 820 115538 Intersections 150:13-150:20 ExpBox False + 821 115538 Intersections 150:9-150:20 LocalBox ["intersectXZPlane","y"] + 822 26784 Intersections 149:20-149:20 ExpBox False + 823 26784 Intersections 149:13-149:20 ExpBox False + 824 26784 Intersections 149:9-149:20 LocalBox ["intersectXZPlane","x"] + 825 1 Intersections 147:21-147:21 ExpBox False + 826 1 Intersections 147:23-147:23 ExpBox False + 827 1 Intersections 147:25-147:25 ExpBox False + 828 1 Intersections 147:14-147:25 ExpBox False + 829 1 Intersections 147:9-147:25 LocalBox ["intersectXZPlane","v1"] + 830 1 Intersections 146:21-146:21 ExpBox False + 831 1 Intersections 146:23-146:23 ExpBox False + 832 1 Intersections 146:25-146:25 ExpBox False + 833 1 Intersections 146:14-146:25 ExpBox False + 834 1 Intersections 146:9-146:25 LocalBox ["intersectXZPlane","v0"] + 835 115538 Intersections 142:15-142:21 ExpBox False + 836 115538 Intersections 142:23-142:23 ExpBox False + 837 115538 Intersections 142:14-142:24 ExpBox False + 838 115538 Intersections 142:28-142:28 ExpBox False + 839 115538 Intersections 142:14-142:28 ExpBox False + 840 115538 Intersections 142:9-142:28 LocalBox ["intersectXZPlane","t0"] + 841 26784 Intersections 143:14-143:14 ExpBox False + 842 26784 Intersections 143:18-143:18 ExpBox False + 843 26784 Intersections 143:22-143:23 ExpBox False + 844 26784 Intersections 143:18-143:23 ExpBox False + 845 26784 Intersections 143:14-143:23 ExpBox False + 846 26784 Intersections 143:9-143:23 LocalBox ["intersectXZPlane","x0"] + 847 26784 Intersections 144:14-144:14 ExpBox False + 848 26784 Intersections 144:18-144:18 ExpBox False + 849 26784 Intersections 144:22-144:23 ExpBox False + 850 26784 Intersections 144:18-144:23 ExpBox False + 851 26784 Intersections 144:14-144:23 ExpBox False + 852 26784 Intersections 144:9-144:23 LocalBox ["intersectXZPlane","z0"] + 853 26784 Intersections 145:20-145:21 ExpBox False + 854 26784 Intersections 145:23-145:23 ExpBox False + 855 26784 Intersections 145:25-145:26 ExpBox False + 856 26784 Intersections 145:14-145:26 ExpBox False + 857 26784 Intersections 145:9-145:26 LocalBox ["intersectXZPlane","p0"] + 858 115538 Intersections 127:5-127:5 ExpBox False + 859 115538 Intersections 127:14-127:14 ExpBox False + 860 115538 Intersections 127:5-127:14 ExpBox False + 861 0 Intersections 127:5-127:14 BinBox GuardBinBox True + 862 115538 Intersections 127:5-127:14 BinBox GuardBinBox False + 863 0 Intersections 129:8-129:8 ExpBox False + 864 0 Intersections 129:17-129:23 ExpBox False + 865 0 Intersections 129:8-129:23 ExpBox False + 866 0 Intersections 129:28-129:28 ExpBox False + 867 0 Intersections 129:32-129:38 ExpBox False + 868 0 Intersections 129:28-129:38 ExpBox False + 869 0 Intersections 129:8-129:38 ExpBox False + 870 0 Intersections 129:8-129:38 BinBox CondBinBox True + 871 0 Intersections 129:8-129:38 BinBox CondBinBox False + 872 0 Intersections 129:45-129:53 ExpBox True + 873 0 Intersections 129:60-129:69 ExpBox True + 874 0 Intersections 129:5-129:69 ExpBox True + 875 115538 Intersections 136:5-136:5 ExpBox False + 876 115538 Intersections 136:9-136:9 ExpBox False + 877 115538 Intersections 136:5-136:9 ExpBox False + 878 30000 Intersections 136:5-136:9 BinBox GuardBinBox True + 879 85538 Intersections 136:5-136:9 BinBox GuardBinBox False + 880 30000 Intersections 137:6-137:10 ExpBox False + 881 30000 Intersections 137:23-137:24 ExpBox False + 882 0 Intersections 137:35-137:36 ExpBox False + 883 26784 Intersections 137:38-137:39 ExpBox False + 884 26784 Intersections 137:41-137:42 ExpBox False + 885 26784 Intersections 137:28-137:42 ExpBox False + 886 26784 Intersections 137:46-137:46 ExpBox False + 887 26784 Intersections 137:49-137:50 ExpBox False + 888 26784 Intersections 137:53-137:59 ExpBox False + 889 26784 Intersections 137:45-137:60 ExpBox False + 890 30000 Intersections 137:27-137:61 ExpBox False + 891 30000 Intersections 137:22-137:62 ExpBox False + 892 30000 Intersections 137:14-137:62 ExpBox False + 893 30000 Intersections 137:13-137:63 ExpBox False + 894 0 Intersections 137:66-137:69 ExpBox False + 895 30000 Intersections 137:5-137:70 ExpBox True + 896 85538 Intersections 139:5-139:13 ExpBox False + 897 85538 Intersections 139:5-139:13 BinBox GuardBinBox True + 898 0 Intersections 139:5-139:13 BinBox GuardBinBox False + 899 85538 Intersections 140:6-140:9 ExpBox False + 900 85538 Intersections 140:22-140:23 ExpBox False + 901 0 Intersections 140:34-140:35 ExpBox False + 902 0 Intersections 140:37-140:38 ExpBox False + 903 0 Intersections 140:40-140:41 ExpBox False + 904 0 Intersections 140:27-140:41 ExpBox False + 905 0 Intersections 140:45-140:45 ExpBox False + 906 0 Intersections 140:48-140:49 ExpBox False + 907 0 Intersections 140:52-140:58 ExpBox False + 908 0 Intersections 140:44-140:59 ExpBox False + 909 85538 Intersections 140:26-140:60 ExpBox False + 910 85538 Intersections 140:21-140:61 ExpBox False + 911 85538 Intersections 140:14-140:61 ExpBox False + 912 85538 Intersections 140:13-140:62 ExpBox False + 913 85538 Intersections 140:66-140:70 ExpBox False + 914 85538 Intersections 140:5-140:71 ExpBox True + 915 115538 Intersections 126:1-154:24 TopLevelBox ["intersectXZPlane"] + 916 26784 Intersections 123:47-123:55 ExpBox False + 917 115538 Intersections 123:57-123:59 ExpBox False + 918 115538 Intersections 123:61-123:63 ExpBox False + 919 26784 Intersections 123:65-123:71 ExpBox False + 920 115538 Intersections 123:30-123:71 ExpBox False + 921 115538 Intersections 123:1-123:71 TopLevelBox ["intersectPlane"] + 922 32512 Intersections 97:22-97:22 ExpBox False + 923 32512 Intersections 97:24-97:25 ExpBox False + 924 32512 Intersections 97:15-97:25 ExpBox False + 925 32512 Intersections 97:9-97:25 LocalBox ["transformSurface","v1'"] + 926 32512 Intersections 96:22-96:22 ExpBox False + 927 32512 Intersections 96:24-96:25 ExpBox False + 928 32512 Intersections 96:15-96:25 ExpBox False + 929 32512 Intersections 96:9-96:25 LocalBox ["transformSurface","v0'"] + 930 0 Intersections 95:22-95:22 ExpBox False + 931 0 Intersections 95:24-95:25 ExpBox False + 932 0 Intersections 95:15-95:25 ExpBox False + 933 0 Intersections 95:9-95:25 LocalBox ["transformSurface","p0'"] + 934 0 Intersections 94:12-94:14 ExpBox False + 935 32512 Intersections 94:16-94:18 ExpBox False + 936 32512 Intersections 94:20-94:22 ExpBox False + 937 32512 Intersections 94:5-94:22 ExpBox True + 938 0 Intersections 103:22-103:22 ExpBox False + 939 0 Intersections 103:24-103:25 ExpBox False + 940 0 Intersections 103:15-103:25 ExpBox False + 941 0 Intersections 103:9-103:25 LocalBox ["transformSurface","v1'"] + 942 0 Intersections 102:22-102:22 ExpBox False + 943 0 Intersections 102:24-102:25 ExpBox False + 944 0 Intersections 102:15-102:25 ExpBox False + 945 0 Intersections 102:9-102:25 LocalBox ["transformSurface","v0'"] + 946 0 Intersections 101:22-101:22 ExpBox False + 947 0 Intersections 101:24-101:25 ExpBox False + 948 0 Intersections 101:15-101:25 ExpBox False + 949 0 Intersections 101:9-101:25 LocalBox ["transformSurface","p0'"] + 950 0 Intersections 100:15-100:17 ExpBox False + 951 0 Intersections 100:19-100:21 ExpBox False + 952 0 Intersections 100:23-100:25 ExpBox False + 953 0 Intersections 100:5-100:25 ExpBox True + 954 0 Intersections 110:22-110:22 ExpBox False + 955 0 Intersections 110:24-110:25 ExpBox False + 956 0 Intersections 110:15-110:25 ExpBox False + 957 0 Intersections 110:9-110:25 LocalBox ["transformSurface","v1'"] + 958 0 Intersections 109:22-109:22 ExpBox False + 959 0 Intersections 109:24-109:25 ExpBox False + 960 0 Intersections 109:15-109:25 ExpBox False + 961 0 Intersections 109:9-109:25 LocalBox ["transformSurface","v0'"] + 962 0 Intersections 108:22-108:22 ExpBox False + 963 0 Intersections 108:24-108:25 ExpBox False + 964 0 Intersections 108:15-108:25 ExpBox False + 965 0 Intersections 108:9-108:25 LocalBox ["transformSurface","p0'"] + 966 0 Intersections 107:17-107:19 ExpBox False + 967 0 Intersections 107:21-107:23 ExpBox False + 968 0 Intersections 107:25-107:27 ExpBox False + 969 0 Intersections 107:5-107:27 ExpBox True + 970 0 Intersections 116:22-116:22 ExpBox False + 971 0 Intersections 116:24-116:25 ExpBox False + 972 0 Intersections 116:15-116:25 ExpBox False + 973 0 Intersections 116:9-116:25 LocalBox ["transformSurface","v1'"] + 974 0 Intersections 115:22-115:22 ExpBox False + 975 0 Intersections 115:24-115:25 ExpBox False + 976 0 Intersections 115:15-115:25 ExpBox False + 977 0 Intersections 115:9-115:25 LocalBox ["transformSurface","v0'"] + 978 0 Intersections 114:22-114:22 ExpBox False + 979 0 Intersections 114:24-114:25 ExpBox False + 980 0 Intersections 114:15-114:25 ExpBox False + 981 0 Intersections 114:9-114:25 LocalBox ["transformSurface","p0'"] + 982 0 Intersections 113:11-113:13 ExpBox False + 983 0 Intersections 113:15-113:17 ExpBox False + 984 0 Intersections 113:19-113:21 ExpBox False + 985 0 Intersections 113:5-113:21 ExpBox True + 986 32512 Intersections 93:1-116:25 TopLevelBox ["transformSurface"] + 987 0 Intersections 85:12-85:13 ExpBox False + 988 0 Intersections 85:15-85:16 ExpBox False + 989 0 Intersections 85:18-85:19 ExpBox False + 990 0 Intersections 85:5-85:19 ExpBox True + 991 0 Intersections 87:15-87:16 ExpBox False + 992 0 Intersections 87:18-87:19 ExpBox False + 993 0 Intersections 87:21-87:22 ExpBox False + 994 0 Intersections 87:5-87:22 ExpBox True + 995 0 Intersections 89:17-89:18 ExpBox False + 996 0 Intersections 89:20-89:21 ExpBox False + 997 0 Intersections 89:23-89:24 ExpBox False + 998 0 Intersections 89:5-89:24 ExpBox True + 999 0 Intersections 91:11-91:12 ExpBox False + 1000 0 Intersections 91:14-91:15 ExpBox False + 1001 0 Intersections 91:17-91:18 ExpBox False + 1002 0 Intersections 91:5-91:18 ExpBox True + 1003 0 Intersections 84:1-91:18 TopLevelBox ["negateSurface"] + 1004 0 Intersections 82:34-82:34 ExpBox False + 1005 0 Intersections 82:37-82:37 ExpBox False + 1006 0 Intersections 82:55-82:55 ExpBox False + 1007 0 Intersections 82:41-82:55 ExpBox False + 1008 0 Intersections 82:58-82:58 ExpBox False + 1009 0 Intersections 82:40-82:59 ExpBox False + 1010 0 Intersections 82:33-82:60 ExpBox False + 1011 0 Intersections 82:9-82:60 LocalBox ["negateSurfaces","negSurf"] + 1012 0 Intersections 81:23-81:29 ExpBox False + 1013 0 Intersections 81:18-81:29 ExpBox False + 1014 0 Intersections 81:1-82:60 TopLevelBox ["negateSurfaces"] + 1015 0 Intersections 256:23-256:41 ExpBox False + 1016 0 Intersections 256:45-256:58 ExpBox False + 1017 0 Intersections 257:40-257:53 ExpBox False + 1018 0 Intersections 257:55-257:57 ExpBox False + 1019 0 Intersections 257:59-257:61 ExpBox False + 1020 0 Intersections 257:63-257:69 ExpBox False + 1021 0 Intersections 257:23-257:69 ExpBox False + 1022 0 Intersections 256:45-257:69 ExpBox False + 1023 0 Intersections 256:23-257:69 ExpBox False + 1024 0 Intersections 256:9-257:69 LocalBox ["intersectCylinder","isectBottom"] + 1025 0 Intersections 255:40-255:50 ExpBox False + 1026 0 Intersections 255:52-255:54 ExpBox False + 1027 0 Intersections 255:56-255:58 ExpBox False + 1028 0 Intersections 255:60-255:66 ExpBox False + 1029 0 Intersections 255:23-255:66 ExpBox False + 1030 0 Intersections 255:9-255:66 LocalBox ["intersectCylinder","isectTop"] + 1031 0 Intersections 254:40-254:42 ExpBox False + 1032 0 Intersections 254:44-254:50 ExpBox False + 1033 0 Intersections 254:23-254:50 ExpBox False + 1034 0 Intersections 254:9-254:50 LocalBox ["intersectCylinder","isectSide"] + 1035 0 Intersections 253:5-253:13 ExpBox False + 1036 0 Intersections 253:36-253:43 ExpBox False + 1037 0 Intersections 253:5-253:43 ExpBox False + 1038 0 Intersections 253:66-253:76 ExpBox False + 1039 0 Intersections 253:5-253:76 ExpBox False + 1040 0 Intersections 252:1-257:69 TopLevelBox ["intersectCylinder"] + 1041 0 Intersections 304:23-304:41 ExpBox False + 1042 0 Intersections 304:45-304:58 ExpBox False + 1043 0 Intersections 305:40-305:47 ExpBox False + 1044 0 Intersections 305:49-305:51 ExpBox False + 1045 0 Intersections 305:53-305:55 ExpBox False + 1046 0 Intersections 305:57-305:63 ExpBox False + 1047 0 Intersections 305:23-305:63 ExpBox False + 1048 0 Intersections 304:45-305:63 ExpBox False + 1049 0 Intersections 304:23-305:63 ExpBox False + 1050 0 Intersections 304:9-305:63 LocalBox ["intersectCone","isectBottom"] + 1051 0 Intersections 303:40-303:47 ExpBox False + 1052 0 Intersections 303:49-303:51 ExpBox False + 1053 0 Intersections 303:53-303:55 ExpBox False + 1054 0 Intersections 303:57-303:63 ExpBox False + 1055 0 Intersections 303:23-303:63 ExpBox False + 1056 0 Intersections 303:9-303:63 LocalBox ["intersectCone","isectTop"] + 1057 0 Intersections 302:41-302:43 ExpBox False + 1058 0 Intersections 302:45-302:51 ExpBox False + 1059 0 Intersections 302:23-302:51 ExpBox False + 1060 0 Intersections 302:9-302:51 LocalBox ["intersectCone","isectSide"] + 1061 0 Intersections 301:5-301:13 ExpBox False + 1062 0 Intersections 301:36-301:43 ExpBox False + 1063 0 Intersections 301:5-301:43 ExpBox False + 1064 0 Intersections 301:66-301:76 ExpBox False + 1065 0 Intersections 301:5-301:76 ExpBox False + 1066 0 Intersections 300:1-305:63 TopLevelBox ["intersectCone"] + 1067 115538 Intersections 44:28-44:30 ExpBox False + 1068 115538 Intersections 44:32-44:32 ExpBox False + 1069 115538 Intersections 44:14-44:32 ExpBox False + 1070 115538 Intersections 44:9-44:32 LocalBox ["intersections","js"] + 1071 115538 Intersections 43:28-43:30 ExpBox False + 1072 115538 Intersections 43:32-43:32 ExpBox False + 1073 115538 Intersections 43:14-43:32 ExpBox False + 1074 115538 Intersections 43:9-43:32 LocalBox ["intersections","is"] + 1075 115538 Intersections 42:20-42:21 ExpBox False + 1076 115538 Intersections 42:23-42:24 ExpBox False + 1077 115538 Intersections 42:5-42:24 ExpBox True + 1078 0 Intersections 49:28-49:30 ExpBox False + 1079 0 Intersections 49:32-49:32 ExpBox False + 1080 0 Intersections 49:14-49:32 ExpBox False + 1081 0 Intersections 49:9-49:32 LocalBox ["intersections","js"] + 1082 0 Intersections 48:28-48:30 ExpBox False + 1083 0 Intersections 48:32-48:32 ExpBox False + 1084 0 Intersections 48:14-48:32 ExpBox False + 1085 0 Intersections 48:9-48:32 LocalBox ["intersections","is"] + 1086 0 Intersections 47:24-47:25 ExpBox False + 1087 0 Intersections 47:27-47:28 ExpBox False + 1088 0 Intersections 47:5-47:28 ExpBox True + 1089 0 Intersections 54:28-54:30 ExpBox False + 1090 0 Intersections 54:32-54:32 ExpBox False + 1091 0 Intersections 54:14-54:32 ExpBox False + 1092 0 Intersections 54:9-54:32 LocalBox ["intersections","js"] + 1093 0 Intersections 53:28-53:30 ExpBox False + 1094 0 Intersections 53:32-53:32 ExpBox False + 1095 0 Intersections 53:14-53:32 ExpBox False + 1096 0 Intersections 53:9-53:32 LocalBox ["intersections","is"] + 1097 0 Intersections 52:25-52:26 ExpBox False + 1098 0 Intersections 52:44-52:45 ExpBox False + 1099 0 Intersections 52:28-52:46 ExpBox False + 1100 0 Intersections 52:5-52:46 ExpBox True + 1101 127319 Intersections 59:36-59:36 ExpBox False + 1102 127319 Intersections 59:39-59:39 ExpBox False + 1103 32512 Intersections 59:60-59:60 ExpBox False + 1104 32512 Intersections 59:62-59:62 ExpBox False + 1105 32512 Intersections 59:43-59:62 ExpBox False + 1106 32512 Intersections 59:65-59:66 ExpBox False + 1107 32512 Intersections 59:42-59:67 ExpBox False + 1108 127319 Intersections 59:35-59:68 ExpBox False + 1109 127319 Intersections 59:9-59:68 LocalBox ["intersections","xform"] + 1110 132847 Intersections 58:29-58:30 ExpBox False + 1111 132847 Intersections 58:41-58:43 ExpBox False + 1112 132847 Intersections 58:28-58:44 ExpBox False + 1113 132847 Intersections 58:46-58:46 ExpBox False + 1114 132847 Intersections 58:14-58:46 ExpBox False + 1115 132847 Intersections 58:9-58:46 LocalBox ["intersections","is"] + 1116 32512 Intersections 57:17-57:17 ExpBox False + 1117 125292 Intersections 57:10-57:18 ExpBox False + 1118 132847 Intersections 57:20-57:21 ExpBox False + 1119 132847 Intersections 57:5-57:21 ExpBox True + 1120 115538 Intersections 62:22-62:24 ExpBox False + 1121 115538 Intersections 62:26-62:28 ExpBox False + 1122 115538 Intersections 62:5-62:28 ExpBox False + 1123 17309 Intersections 62:5-62:28 BinBox GuardBinBox True + 1124 3 Intersections 62:5-62:28 BinBox GuardBinBox False + 1125 17309 Intersections 62:46-62:48 ExpBox False + 1126 17309 Intersections 62:50-62:50 ExpBox False + 1127 17309 Intersections 62:32-62:50 ExpBox True + 1128 1 Intersections 63:5-63:13 ExpBox False + 1129 1 Intersections 63:5-63:13 BinBox GuardBinBox True + 1130 0 Intersections 63:5-63:13 BinBox GuardBinBox False + 1131 1 Intersections 63:17-63:26 ExpBox True + 1132 115538 Intersections 66:20-66:22 ExpBox False + 1133 26784 Intersections 66:24-66:24 ExpBox False + 1134 115538 Intersections 66:5-66:24 ExpBox True + 1135 0 Intersections 69:21-69:23 ExpBox False + 1136 0 Intersections 69:25-69:25 ExpBox False + 1137 0 Intersections 69:5-69:25 ExpBox True + 1138 17309 Intersections 72:19-72:21 ExpBox False + 1139 5728 Intersections 72:23-72:23 ExpBox False + 1140 17309 Intersections 72:5-72:23 ExpBox True + 1141 0 Intersections 75:23-75:25 ExpBox False + 1142 0 Intersections 75:27-75:27 ExpBox False + 1143 0 Intersections 75:5-75:27 ExpBox True + 1144 0 Intersections 78:19-78:21 ExpBox False + 1145 0 Intersections 78:23-78:23 ExpBox False + 1146 0 Intersections 78:5-78:23 ExpBox True + 1147 496770 Intersections 41:1-78:23 TopLevelBox ["intersections"] + 1148 0 Intersections 27:36-27:40 ExpBox False + 1149 0 Intersections 27:45-27:45 ExpBox False + 1150 0 Intersections 27:48-27:51 ExpBox False + 1151 0 Intersections 27:54-27:62 ExpBox False + 1152 0 Intersections 27:44-27:63 ExpBox False + 1153 0 Intersections 27:43-27:64 ExpBox False + 1154 0 Intersections 27:67-27:70 ExpBox False + 1155 0 Intersections 27:35-27:71 ExpBox True + 1156 81027 Intersections 28:43-28:47 ExpBox True + 1157 87565 Intersections 30:5-30:5 ExpBox False + 1158 87565 Intersections 30:14-30:14 ExpBox False + 1159 87565 Intersections 30:5-30:14 ExpBox False + 1160 60838 Intersections 30:19-30:19 ExpBox False + 1161 60838 Intersections 30:23-30:23 ExpBox False + 1162 60838 Intersections 30:19-30:23 ExpBox False + 1163 87565 Intersections 30:5-30:23 ExpBox False + 1164 87565 Intersections 30:5-30:23 BinBox GuardBinBox True + 1165 0 Intersections 30:5-30:23 BinBox GuardBinBox False + 1166 87565 Intersections 31:21-31:25 ExpBox False + 1167 87565 Intersections 31:28-31:30 ExpBox False + 1168 83054 Intersections 31:33-31:38 ExpBox False + 1169 87565 Intersections 31:20-31:39 ExpBox False + 1170 87565 Intersections 31:5-31:39 ExpBox True + 1171 0 Intersections 32:5-32:13 ExpBox False + 1172 0 Intersections 32:5-32:13 BinBox GuardBinBox True + 1173 0 Intersections 32:5-32:13 BinBox GuardBinBox False + 1174 0 Intersections 33:6-33:10 ExpBox False + 1175 0 Intersections 33:14-33:14 ExpBox False + 1176 0 Intersections 33:17-33:20 ExpBox False + 1177 0 Intersections 33:23-33:31 ExpBox False + 1178 0 Intersections 33:13-33:32 ExpBox False + 1179 0 Intersections 33:36-33:37 ExpBox False + 1180 0 Intersections 33:13-33:37 ExpBox False + 1181 0 Intersections 33:40-33:45 ExpBox False + 1182 0 Intersections 33:5-33:46 ExpBox True + 1183 36538 Intersections 35:5-35:5 ExpBox False + 1184 36538 Intersections 35:14-35:14 ExpBox False + 1185 36538 Intersections 35:5-35:14 ExpBox False + 1186 36538 Intersections 35:19-35:19 ExpBox False + 1187 36538 Intersections 35:23-35:23 ExpBox False + 1188 36538 Intersections 35:19-35:23 ExpBox False + 1189 36538 Intersections 35:5-35:23 ExpBox False + 1190 2027 Intersections 35:5-35:23 BinBox GuardBinBox True + 1191 34511 Intersections 35:5-35:23 BinBox GuardBinBox False + 1192 2027 Intersections 37:21-37:24 ExpBox False + 1193 2027 Intersections 37:27-37:29 ExpBox False + 1194 2027 Intersections 37:32-37:37 ExpBox False + 1195 2027 Intersections 37:20-37:38 ExpBox False + 1196 2027 Intersections 37:5-37:38 ExpBox True + 1197 34511 Intersections 38:5-38:13 ExpBox False + 1198 34511 Intersections 38:5-38:13 BinBox GuardBinBox True + 1199 0 Intersections 38:5-38:13 BinBox GuardBinBox False + 1200 34511 Intersections 39:5-39:9 ExpBox True + 1201 205130 Intersections 27:1-39:9 TopLevelBox ["clampIntervals"] + 1202 115538 Intersections 25:28-25:30 ExpBox False + 1203 115538 Intersections 25:32-25:32 ExpBox False + 1204 115538 Intersections 25:14-25:32 ExpBox False + 1205 115538 Intersections 25:9-25:32 LocalBox ["intersectRayWithObject","is"] + 1206 115538 Intersections 24:20-24:21 ExpBox False + 1207 115538 Intersections 24:5-24:21 ExpBox False + 1208 115538 Intersections 23:1-25:32 TopLevelBox ["intersectRayWithObject"] + 0 0 Interval 94:10-94:11 ExpBox False + 1 0 Interval 94:6-94:11 ExpBox False + 2 0 Interval 94:57-94:58 ExpBox False + 3 0 Interval 94:17-94:17 ExpBox False + 4 0 Interval 94:24-94:30 ExpBox False + 5 0 Interval 94:20-94:30 ExpBox False + 6 0 Interval 94:33-94:33 ExpBox False + 7 0 Interval 94:16-94:34 ExpBox False + 8 0 Interval 94:14-94:60 ExpBox False + 9 0 Interval 94:67-94:68 ExpBox False + 10 0 Interval 94:63-94:68 ExpBox False + 11 0 Interval 94:5-94:69 ExpBox False + 12 0 Interval 93:1-94:69 TopLevelBox ["complementIntervals"] + 13 0 Interval 62:13-62:17 ExpBox True + 14 0 Interval 63:27-63:27 ExpBox False + 15 0 Interval 63:32-63:32 ExpBox False + 16 0 Interval 63:27-63:32 ExpBox False + 17 0 Interval 63:42-63:42 ExpBox False + 18 0 Interval 63:44-63:45 ExpBox False + 19 0 Interval 63:37-63:45 ExpBox False + 20 0 Interval 63:27-63:45 ExpBox True + 21 0 Interval 62:1-63:45 TopLevelBox ["bad'"] + 22 0 Interval 58:20-58:21 ExpBox False + 23 0 Interval 58:26-58:27 ExpBox False + 24 0 Interval 58:20-58:27 ExpBox True + 25 0 Interval 60:27-60:28 ExpBox False + 26 0 Interval 60:22-60:28 ExpBox False + 27 0 Interval 59:25-59:26 ExpBox False + 28 0 Interval 59:28-59:29 ExpBox False + 29 0 Interval 59:20-59:29 ExpBox False + 30 0 Interval 59:34-59:35 ExpBox False + 31 0 Interval 59:40-59:41 ExpBox False + 32 0 Interval 59:34-59:41 ExpBox False + 33 0 Interval 59:20-59:41 ExpBox True + 34 0 Interval 58:1-60:28 TopLevelBox ["bad"] + 35 9754 Interval 54:5-54:5 ExpBox False + 36 9754 Interval 54:14-54:14 ExpBox False + 37 9754 Interval 54:5-54:14 ExpBox False + 38 0 Interval 54:5-54:14 BinBox GuardBinBox True + 39 9754 Interval 54:5-54:14 BinBox GuardBinBox False + 40 0 Interval 54:18-54:19 ExpBox True + 41 9754 Interval 55:5-55:5 ExpBox False + 42 9754 Interval 55:14-55:14 ExpBox False + 43 9754 Interval 55:5-55:14 ExpBox False + 44 3216 Interval 55:5-55:14 BinBox GuardBinBox True + 45 6538 Interval 55:5-55:14 BinBox GuardBinBox False + 46 3216 Interval 55:18-55:19 ExpBox True + 47 6538 Interval 56:5-56:13 ExpBox False + 48 6538 Interval 56:5-56:13 BinBox GuardBinBox True + 49 0 Interval 56:5-56:13 BinBox GuardBinBox False + 50 6538 Interval 56:18-56:19 ExpBox True + 51 9754 Interval 53:1-56:19 TopLevelBox ["cmpI"] + 52 87565 Interval 44:19-44:19 ExpBox False + 53 87565 Interval 44:22-44:26 ExpBox False + 54 87565 Interval 44:29-44:29 ExpBox False + 55 87565 Interval 44:18-44:30 ExpBox False + 56 87565 Interval 44:1-44:30 TopLevelBox ["mkExit"] + 57 39754 Interval 43:19-43:19 ExpBox False + 58 39754 Interval 43:22-43:25 ExpBox False + 59 39754 Interval 43:29-43:29 ExpBox False + 60 39754 Interval 43:18-43:30 ExpBox False + 61 39754 Interval 43:1-43:30 TopLevelBox ["mkEntry"] + 62 9754 Interval 46:20-46:24 ExpBox False + 63 9754 Interval 46:36-46:37 ExpBox False + 64 9754 Interval 46:28-46:37 ExpBox False + 65 2027 Interval 46:47-46:48 ExpBox False + 66 2027 Interval 46:40-46:48 ExpBox False + 67 9754 Interval 46:27-46:49 ExpBox False + 68 2027 Interval 46:52-46:56 ExpBox False + 69 9754 Interval 46:19-46:57 ExpBox False + 70 9754 Interval 46:1-46:57 TopLevelBox ["entryexit"] + 71 0 Interval 48:35-48:36 ExpBox False + 72 0 Interval 48:40-48:41 ExpBox False + 73 0 Interval 48:35-48:41 ExpBox False + 74 0 Interval 48:35-48:41 BinBox GuardBinBox True + 75 0 Interval 48:35-48:41 BinBox GuardBinBox False + 76 0 Interval 48:57-48:58 ExpBox False + 77 0 Interval 48:60-48:61 ExpBox False + 78 0 Interval 48:47-48:61 ExpBox True + 79 0 Interval 49:35-49:43 ExpBox False + 80 0 Interval 49:35-49:43 BinBox GuardBinBox True + 81 0 Interval 49:35-49:43 BinBox GuardBinBox False + 82 0 Interval 49:57-49:58 ExpBox False + 83 0 Interval 49:60-49:61 ExpBox False + 84 0 Interval 49:47-49:61 ExpBox True + 85 0 Interval 48:1-49:61 TopLevelBox ["arrange"] + 86 0 Interval 47:20-47:23 ExpBox False + 87 0 Interval 47:34-47:35 ExpBox False + 88 0 Interval 47:27-47:35 ExpBox False + 89 0 Interval 47:46-47:47 ExpBox False + 90 0 Interval 47:38-47:47 ExpBox False + 91 0 Interval 47:26-47:48 ExpBox False + 92 0 Interval 47:51-47:54 ExpBox False + 93 0 Interval 47:19-47:55 ExpBox False + 94 0 Interval 47:1-47:55 TopLevelBox ["exitentry"] + 95 0 Interval 41:29-41:33 ExpBox False + 96 0 Interval 41:25-41:33 ExpBox False + 97 0 Interval 41:1-41:33 TopLevelBox ["isExit"] + 98 9754 Interval 40:25-40:29 ExpBox False + 99 9754 Interval 40:1-40:29 TopLevelBox ["isEntry"] + 100 6538 Interval 68:30-68:38 ExpBox False + 101 0 Interval 68:30-68:38 BinBox GuardBinBox True + 102 6538 Interval 68:30-68:38 BinBox GuardBinBox False + 103 0 Interval 68:42-68:43 ExpBox True + 104 6538 Interval 69:30-69:38 ExpBox False + 105 6538 Interval 69:30-69:38 BinBox GuardBinBox True + 106 0 Interval 69:30-69:38 BinBox GuardBinBox False + 107 6538 Interval 69:42-69:43 ExpBox True + 108 105784 Interval 70:30-70:38 ExpBox False + 109 0 Interval 70:30-70:38 BinBox GuardBinBox True + 110 105784 Interval 70:30-70:38 BinBox GuardBinBox False + 111 0 Interval 70:42-70:43 ExpBox True + 112 105784 Interval 71:30-71:38 ExpBox False + 113 105784 Interval 71:30-71:38 BinBox GuardBinBox True + 114 0 Interval 71:30-71:38 BinBox GuardBinBox False + 115 105784 Interval 71:42-71:43 ExpBox True + 116 9754 Interval 73:23-73:23 ExpBox False + 117 9754 Interval 73:25-73:25 ExpBox False + 118 9754 Interval 73:18-73:25 ExpBox False + 119 0 Interval 74:30-74:30 ExpBox False + 120 0 Interval 74:22-74:30 ExpBox False + 121 0 Interval 74:43-74:43 ExpBox False + 122 0 Interval 74:35-74:43 ExpBox False + 123 0 Interval 74:22-74:43 ExpBox False + 124 0 Interval 74:22-74:43 BinBox CondBinBox True + 125 0 Interval 74:22-74:43 BinBox CondBinBox False + 126 0 Interval 74:50-74:50 ExpBox False + 127 0 Interval 74:67-74:69 ExpBox False + 128 0 Interval 74:71-74:73 ExpBox False + 129 0 Interval 74:54-74:73 ExpBox False + 130 0 Interval 74:50-74:73 ExpBox True + 131 0 Interval 75:63-75:65 ExpBox False + 132 0 Interval 75:67-75:69 ExpBox False + 133 0 Interval 75:50-75:69 ExpBox True + 134 0 Interval 74:19-75:69 ExpBox True + 135 3216 Interval 76:30-76:30 ExpBox False + 136 3216 Interval 76:22-76:30 ExpBox False + 137 3216 Interval 76:22-76:30 BinBox CondBinBox True + 138 0 Interval 76:22-76:30 BinBox CondBinBox False + 139 3216 Interval 76:37-76:37 ExpBox False + 140 0 Interval 76:54-76:56 ExpBox False + 141 0 Interval 76:58-76:59 ExpBox False + 142 0 Interval 76:41-76:59 ExpBox False + 143 3216 Interval 76:37-76:59 ExpBox True + 144 0 Interval 77:54-77:56 ExpBox False + 145 0 Interval 77:58-77:59 ExpBox False + 146 0 Interval 77:41-77:59 ExpBox True + 147 3216 Interval 76:19-77:59 ExpBox True + 148 6538 Interval 78:30-78:30 ExpBox False + 149 6538 Interval 78:22-78:30 ExpBox False + 150 6538 Interval 78:22-78:30 BinBox CondBinBox True + 151 0 Interval 78:22-78:30 BinBox CondBinBox False + 152 6538 Interval 78:37-78:37 ExpBox False + 153 6538 Interval 78:54-78:55 ExpBox False + 154 6538 Interval 78:57-78:59 ExpBox False + 155 6538 Interval 78:41-78:59 ExpBox False + 156 6538 Interval 78:37-78:59 ExpBox True + 157 0 Interval 79:54-79:55 ExpBox False + 158 0 Interval 79:57-79:59 ExpBox False + 159 0 Interval 79:41-79:59 ExpBox True + 160 6538 Interval 78:19-79:59 ExpBox True + 161 9754 Interval 73:13-79:59 ExpBox True + 162 122076 Interval 68:9-79:59 LocalBox ["unionIntervals","uniIntervals"] + 163 115538 Interval 67:6-67:16 ExpBox False + 164 115538 Interval 67:21-67:31 ExpBox False + 165 115538 Interval 67:6-67:31 ExpBox False + 166 115538 Interval 67:47-67:48 ExpBox False + 167 115538 Interval 67:50-67:51 ExpBox False + 168 115538 Interval 67:34-67:51 ExpBox False + 169 81027 Interval 67:54-67:62 ExpBox False + 170 81027 Interval 67:67-67:75 ExpBox False + 171 81027 Interval 67:54-67:75 ExpBox False + 172 115538 Interval 67:5-67:76 ExpBox False + 173 115538 Interval 66:1-79:59 TopLevelBox ["unionIntervals"] + 174 0 Interval 85:35-85:36 ExpBox False + 175 0 Interval 85:15-85:36 ExpBox False + 176 0 Interval 85:9-85:36 LocalBox ["intersectIntervals","js'"] + 177 0 Interval 84:35-84:36 ExpBox False + 178 0 Interval 84:15-84:36 ExpBox False + 179 0 Interval 84:9-84:36 LocalBox ["intersectIntervals","is'"] + 180 0 Interval 83:41-83:43 ExpBox False + 181 0 Interval 83:45-83:47 ExpBox False + 182 0 Interval 83:25-83:48 ExpBox False + 183 0 Interval 83:5-83:48 ExpBox False + 184 0 Interval 82:1-85:36 TopLevelBox ["intersectIntervals"] + 185 0 Interval 90:35-90:36 ExpBox False + 186 0 Interval 90:15-90:36 ExpBox False + 187 0 Interval 90:9-90:36 LocalBox ["differenceIntervals","is'"] + 188 0 Interval 89:41-89:43 ExpBox False + 189 0 Interval 89:45-89:46 ExpBox False + 190 0 Interval 89:25-89:47 ExpBox False + 191 0 Interval 89:5-89:47 ExpBox False + 192 0 Interval 88:1-90:36 TopLevelBox ["differenceIntervals"] + 193 132847 Interval 38:24-38:25 ExpBox False + 194 125292 Interval 38:32-38:32 ExpBox False + 195 132847 Interval 38:34-38:35 ExpBox False + 196 132847 Interval 38:28-38:35 ExpBox False + 197 95120 Interval 38:38-38:39 ExpBox False + 198 132847 Interval 38:23-38:40 ExpBox False + 199 132847 Interval 38:1-38:40 TopLevelBox ["mapI"] + 200 0 Interval 36:14-36:17 ExpBox False + 201 0 Interval 36:20-36:21 ExpBox False + 202 0 Interval 36:24-36:27 ExpBox False + 203 0 Interval 36:13-36:28 ExpBox False + 204 0 Interval 36:1-36:28 TopLevelBox ["openIList"] + 205 1 Interval 35:15-35:19 ExpBox False + 206 1 Interval 35:22-35:23 ExpBox False + 207 1 Interval 35:26-35:30 ExpBox False + 208 1 Interval 35:14-35:31 ExpBox False + 209 1 Interval 35:1-35:31 TopLevelBox ["emptyIList"] diff --git a/testsuite/tests/hpc/raytrace/tixs/hpc_show_multi_002.stdout b/testsuite/tests/hpc/raytrace/tixs/hpc_show_multi_002.stdout new file mode 100644 index 0000000000000000000000000000000000000000..f5b7e9cc97079b55100c6835cc2943774b7b3fa8 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/hpc_show_multi_002.stdout @@ -0,0 +1,522 @@ + 0 180000 Geometry 311:12-311:12 ExpBox False + 1 180000 Geometry 311:16-311:16 ExpBox False + 2 180000 Geometry 311:12-311:16 ExpBox False + 3 0 Geometry 311:12-311:16 BinBox GuardBinBox True + 4 180000 Geometry 311:12-311:16 BinBox GuardBinBox False + 5 0 Geometry 311:20-311:20 ExpBox True + 6 180000 Geometry 312:12-312:12 ExpBox False + 7 180000 Geometry 312:16-312:16 ExpBox False + 8 180000 Geometry 312:12-312:16 ExpBox False + 9 4582 Geometry 312:12-312:16 BinBox GuardBinBox True + 10 175418 Geometry 312:12-312:16 BinBox GuardBinBox False + 11 4582 Geometry 312:20-312:20 ExpBox True + 12 175418 Geometry 313:12-313:15 ExpBox False + 13 175418 Geometry 313:12-313:15 BinBox GuardBinBox True + 14 0 Geometry 313:12-313:15 BinBox GuardBinBox False + 15 175418 Geometry 313:20-313:20 ExpBox True + 16 180000 Geometry 311:1-313:20 TopLevelBox ["clampf"] + 17 1 Geometry 299:7-299:12 ExpBox False + 18 1 Geometry 299:1-299:12 TopLevelBox ["inf"] + 19 1 Geometry 298:11-298:17 ExpBox False + 20 1 Geometry 298:1-298:17 TopLevelBox ["epsilon"] + 21 3 Geometry 302:13-302:13 ExpBox False + 22 3 Geometry 302:17-302:23 ExpBox False + 23 3 Geometry 302:13-302:23 ExpBox False + 24 3 Geometry 302:13-302:23 BinBox GuardBinBox True + 25 0 Geometry 302:13-302:23 BinBox GuardBinBox False + 26 3 Geometry 302:28-302:28 ExpBox True + 27 0 Geometry 303:13-303:13 ExpBox False + 28 0 Geometry 303:18-303:24 ExpBox False + 29 0 Geometry 303:17-303:24 ExpBox False + 30 0 Geometry 303:13-303:24 ExpBox False + 31 0 Geometry 303:13-303:24 BinBox GuardBinBox True + 32 0 Geometry 303:13-303:24 BinBox GuardBinBox False + 33 0 Geometry 303:28-303:28 ExpBox True + 34 0 Geometry 304:13-304:21 ExpBox False + 35 0 Geometry 304:13-304:21 BinBox GuardBinBox True + 36 0 Geometry 304:13-304:21 BinBox GuardBinBox False + 37 0 Geometry 304:28-304:34 ExpBox True + 38 3 Geometry 302:1-304:34 TopLevelBox ["nonZero"] + 39 376778 Geometry 307:18-307:18 ExpBox False + 40 376778 Geometry 307:20-307:20 ExpBox False + 41 376778 Geometry 307:17-307:21 ExpBox False + 42 376778 Geometry 307:13-307:21 ExpBox False + 43 376778 Geometry 307:25-307:31 ExpBox False + 44 376778 Geometry 307:13-307:31 ExpBox False + 45 376778 Geometry 307:1-307:31 TopLevelBox ["eqEps"] + 46 1 Geometry 308:8-308:12 ExpBox False + 47 1 Geometry 308:1-308:12 TopLevelBox ["near"] + 48 32512 Geometry 290:29-290:29 ExpBox False + 49 32512 Geometry 290:38-290:38 ExpBox False + 50 32512 Geometry 290:29-290:38 ExpBox False + 51 5785 Geometry 290:43-290:43 ExpBox False + 52 5785 Geometry 290:52-290:52 ExpBox False + 53 5785 Geometry 290:43-290:52 ExpBox False + 54 5785 Geometry 290:57-290:57 ExpBox False + 55 5785 Geometry 290:66-290:66 ExpBox False + 56 5785 Geometry 290:57-290:66 ExpBox False + 57 5785 Geometry 290:43-290:66 ExpBox False + 58 32512 Geometry 290:29-290:66 ExpBox False + 59 32512 Geometry 290:1-290:66 TopLevelBox ["nearC"] + 60 183672 Geometry 287:31-287:31 ExpBox False + 61 183672 Geometry 287:33-287:33 ExpBox False + 62 183672 Geometry 287:30-287:34 ExpBox False + 63 183672 Geometry 287:37-287:37 ExpBox False + 64 183672 Geometry 287:39-287:39 ExpBox False + 65 183672 Geometry 287:36-287:40 ExpBox False + 66 183672 Geometry 287:43-287:43 ExpBox False + 67 183672 Geometry 287:45-287:45 ExpBox False + 68 183672 Geometry 287:42-287:46 ExpBox False + 69 183672 Geometry 287:28-287:46 ExpBox False + 70 183672 Geometry 287:1-287:46 TopLevelBox ["multSC"] + 71 112863 Geometry 284:33-284:33 ExpBox False + 72 112863 Geometry 284:35-284:35 ExpBox False + 73 112863 Geometry 284:32-284:36 ExpBox False + 74 112863 Geometry 284:39-284:39 ExpBox False + 75 112863 Geometry 284:41-284:41 ExpBox False + 76 112863 Geometry 284:38-284:42 ExpBox False + 77 112863 Geometry 284:45-284:45 ExpBox False + 78 112863 Geometry 284:47-284:47 ExpBox False + 79 112863 Geometry 284:44-284:48 ExpBox False + 80 112863 Geometry 284:30-284:48 ExpBox False + 81 112863 Geometry 284:1-284:48 TopLevelBox ["multCC"] + 82 0 Geometry 278:32-278:32 ExpBox False + 83 0 Geometry 278:34-278:34 ExpBox False + 84 0 Geometry 278:31-278:35 ExpBox False + 85 0 Geometry 278:38-278:38 ExpBox False + 86 0 Geometry 278:40-278:40 ExpBox False + 87 0 Geometry 278:37-278:41 ExpBox False + 88 0 Geometry 278:44-278:44 ExpBox False + 89 0 Geometry 278:46-278:46 ExpBox False + 90 0 Geometry 278:43-278:47 ExpBox False + 91 0 Geometry 278:29-278:47 ExpBox False + 92 0 Geometry 278:1-278:47 TopLevelBox ["subCC"] + 93 151160 Geometry 275:32-275:32 ExpBox False + 94 151160 Geometry 275:34-275:34 ExpBox False + 95 151160 Geometry 275:31-275:35 ExpBox False + 96 151160 Geometry 275:38-275:38 ExpBox False + 97 151160 Geometry 275:40-275:40 ExpBox False + 98 151160 Geometry 275:37-275:41 ExpBox False + 99 151160 Geometry 275:44-275:44 ExpBox False + 100 151160 Geometry 275:46-275:46 ExpBox False + 101 151160 Geometry 275:43-275:47 ExpBox False + 102 151160 Geometry 275:29-275:47 ExpBox False + 103 151160 Geometry 275:1-275:47 TopLevelBox ["addCC"] + 104 1 Geometry 272:11-272:11 ExpBox False + 105 1 Geometry 272:13-272:13 ExpBox False + 106 1 Geometry 272:15-272:15 ExpBox False + 107 1 Geometry 272:9-272:15 ExpBox False + 108 1 Geometry 272:1-272:15 TopLevelBox ["black"] + 109 1 Geometry 281:15-281:19 ExpBox False + 110 1 Geometry 281:21-281:25 ExpBox False + 111 1 Geometry 281:9-281:25 ExpBox False + 112 1 Geometry 281:1-281:25 TopLevelBox ["sumCC"] + 113 0 Geometry 270:11-270:11 ExpBox False + 114 0 Geometry 270:13-270:13 ExpBox False + 115 0 Geometry 270:15-270:15 ExpBox False + 116 0 Geometry 270:9-270:15 ExpBox False + 117 0 Geometry 270:1-270:15 TopLevelBox ["white"] + 118 12 Geometry 239:47-239:49 ExpBox False + 119 12 Geometry 239:52-239:54 ExpBox False + 120 12 Geometry 239:57-239:59 ExpBox False + 121 12 Geometry 239:62-239:64 ExpBox False + 122 12 Geometry 239:44-239:65 ExpBox False + 123 12 Geometry 240:47-240:49 ExpBox False + 124 12 Geometry 240:52-240:54 ExpBox False + 125 12 Geometry 240:57-240:59 ExpBox False + 126 12 Geometry 240:62-240:64 ExpBox False + 127 12 Geometry 240:44-240:65 ExpBox False + 128 12 Geometry 241:47-241:49 ExpBox False + 129 12 Geometry 241:52-241:54 ExpBox False + 130 12 Geometry 241:57-241:59 ExpBox False + 131 12 Geometry 241:62-241:64 ExpBox False + 132 12 Geometry 241:44-241:65 ExpBox False + 133 12 Geometry 242:47-242:49 ExpBox False + 134 12 Geometry 242:52-242:54 ExpBox False + 135 12 Geometry 242:57-242:59 ExpBox False + 136 12 Geometry 242:62-242:64 ExpBox False + 137 12 Geometry 242:44-242:65 ExpBox False + 138 12 Geometry 239:41-242:66 ExpBox False + 139 12 Geometry 236:1-242:66 TopLevelBox ["transposeM"] + 140 229838 Geometry 222:25-222:25 ExpBox False + 141 229838 Geometry 222:27-222:27 ExpBox False + 142 229838 Geometry 222:24-222:28 ExpBox False + 143 229838 Geometry 222:31-222:31 ExpBox False + 144 229838 Geometry 222:33-222:33 ExpBox False + 145 229838 Geometry 222:30-222:34 ExpBox False + 146 229838 Geometry 222:37-222:37 ExpBox False + 147 229838 Geometry 222:39-222:39 ExpBox False + 148 229838 Geometry 222:36-222:40 ExpBox False + 149 229838 Geometry 222:22-222:40 ExpBox False + 150 229838 Geometry 222:1-222:40 TopLevelBox ["multSV"] + 151 419283 Geometry 210:8-210:8 ExpBox False + 152 419283 Geometry 210:12-210:12 ExpBox False + 153 419283 Geometry 210:8-210:12 ExpBox False + 154 419283 Geometry 210:1-210:12 TopLevelBox ["sq"] + 155 0 Geometry 214:28-214:28 ExpBox False + 156 0 Geometry 214:25-214:28 ExpBox False + 157 0 Geometry 214:35-214:35 ExpBox False + 158 0 Geometry 214:32-214:35 ExpBox False + 159 0 Geometry 214:25-214:35 ExpBox False + 160 0 Geometry 214:42-214:42 ExpBox False + 161 0 Geometry 214:39-214:42 ExpBox False + 162 0 Geometry 214:25-214:42 ExpBox False + 163 0 Geometry 214:1-214:42 TopLevelBox ["distFrom0Sq"] + 164 0 Geometry 218:33-218:33 ExpBox False + 165 0 Geometry 218:20-218:34 ExpBox False + 166 0 Geometry 218:15-218:34 ExpBox False + 167 0 Geometry 218:1-218:34 TopLevelBox ["distFrom0"] + 168 139761 Geometry 200:27-200:27 ExpBox False + 169 139761 Geometry 200:24-200:27 ExpBox False + 170 139761 Geometry 200:34-200:34 ExpBox False + 171 139761 Geometry 200:31-200:34 ExpBox False + 172 139761 Geometry 200:24-200:34 ExpBox False + 173 139761 Geometry 200:41-200:41 ExpBox False + 174 139761 Geometry 200:38-200:41 ExpBox False + 175 139761 Geometry 200:23-200:42 ExpBox False + 176 139761 Geometry 200:18-200:42 ExpBox False + 177 139761 Geometry 200:11-200:42 LocalBox ["normalize","norm"] + 178 139761 Geometry 198:16-198:19 ExpBox False + 179 139761 Geometry 198:24-198:24 ExpBox False + 180 139761 Geometry 198:16-198:24 ExpBox False + 181 139761 Geometry 198:16-198:24 BinBox GuardBinBox True + 182 0 Geometry 198:16-198:24 BinBox GuardBinBox False + 183 139761 Geometry 198:36-198:36 ExpBox False + 184 139761 Geometry 198:38-198:41 ExpBox False + 185 139761 Geometry 198:35-198:42 ExpBox False + 186 139761 Geometry 198:44-198:44 ExpBox False + 187 139761 Geometry 198:28-198:44 ExpBox True + 188 0 Geometry 199:16-199:24 ExpBox False + 189 0 Geometry 199:16-199:24 BinBox GuardBinBox True + 190 0 Geometry 199:16-199:24 BinBox GuardBinBox False + 191 0 Geometry 199:34-199:51 ExpBox False + 192 0 Geometry 199:28-199:51 ExpBox True + 193 139761 Geometry 197:1-200:42 TopLevelBox ["normalize"] + 194 0 Geometry 192:27-192:27 ExpBox False + 195 0 Geometry 192:24-192:27 ExpBox False + 196 0 Geometry 192:34-192:34 ExpBox False + 197 0 Geometry 192:31-192:34 ExpBox False + 198 0 Geometry 192:24-192:34 ExpBox False + 199 0 Geometry 192:41-192:41 ExpBox False + 200 0 Geometry 192:38-192:41 ExpBox False + 201 0 Geometry 192:23-192:42 ExpBox False + 202 0 Geometry 192:18-192:42 ExpBox False + 203 0 Geometry 192:1-192:42 TopLevelBox ["norm"] + 204 0 Geometry 188:10-188:11 ExpBox False + 205 0 Geometry 188:15-188:16 ExpBox False + 206 0 Geometry 188:9-188:17 ExpBox False + 207 0 Geometry 188:20-188:21 ExpBox False + 208 0 Geometry 188:25-188:26 ExpBox False + 209 0 Geometry 188:19-188:27 ExpBox False + 210 0 Geometry 188:30-188:31 ExpBox False + 211 0 Geometry 188:35-188:36 ExpBox False + 212 0 Geometry 188:29-188:37 ExpBox False + 213 0 Geometry 188:7-188:37 ExpBox False + 214 0 Geometry 187:1-188:37 TopLevelBox ["subPP"] + 215 0 Geometry 206:26-206:27 ExpBox False + 216 0 Geometry 206:29-206:30 ExpBox False + 217 0 Geometry 206:20-206:30 ExpBox False + 218 0 Geometry 204:18-204:18 ExpBox False + 219 0 Geometry 204:15-204:18 ExpBox False + 220 0 Geometry 204:25-204:25 ExpBox False + 221 0 Geometry 204:22-204:25 ExpBox False + 222 0 Geometry 204:15-204:25 ExpBox False + 223 0 Geometry 204:32-204:32 ExpBox False + 224 0 Geometry 204:29-204:32 ExpBox False + 225 0 Geometry 204:15-204:32 ExpBox False + 226 0 Geometry 204:1-206:30 TopLevelBox ["dist2"] + 227 0 Geometry 184:11-184:12 ExpBox False + 228 0 Geometry 184:9-184:13 ExpBox False + 229 0 Geometry 184:17-184:18 ExpBox False + 230 0 Geometry 184:15-184:19 ExpBox False + 231 0 Geometry 184:23-184:24 ExpBox False + 232 0 Geometry 184:21-184:25 ExpBox False + 233 0 Geometry 184:7-184:25 ExpBox False + 234 0 Geometry 183:1-184:25 TopLevelBox ["negV"] + 235 53539 Geometry 180:10-180:11 ExpBox False + 236 53539 Geometry 180:15-180:16 ExpBox False + 237 53539 Geometry 180:9-180:17 ExpBox False + 238 53539 Geometry 180:20-180:21 ExpBox False + 239 53539 Geometry 180:25-180:26 ExpBox False + 240 53539 Geometry 180:19-180:27 ExpBox False + 241 53539 Geometry 180:30-180:31 ExpBox False + 242 53539 Geometry 180:35-180:36 ExpBox False + 243 53539 Geometry 180:29-180:37 ExpBox False + 244 53539 Geometry 180:7-180:37 ExpBox False + 245 53539 Geometry 179:1-180:37 TopLevelBox ["subVV"] + 246 63350 Geometry 176:10-176:11 ExpBox False + 247 63350 Geometry 176:15-176:16 ExpBox False + 248 63350 Geometry 176:9-176:17 ExpBox False + 249 63350 Geometry 176:20-176:21 ExpBox False + 250 63350 Geometry 176:25-176:26 ExpBox False + 251 63350 Geometry 176:19-176:27 ExpBox False + 252 63350 Geometry 176:30-176:31 ExpBox False + 253 63350 Geometry 176:35-176:36 ExpBox False + 254 63350 Geometry 176:29-176:37 ExpBox False + 255 63350 Geometry 176:7-176:37 ExpBox False + 256 63350 Geometry 175:1-176:37 TopLevelBox ["addPV"] + 257 34539 Geometry 293:25-293:25 ExpBox False + 258 34539 Geometry 293:36-293:36 ExpBox False + 259 34539 Geometry 293:47-293:47 ExpBox False + 260 34539 Geometry 293:35-293:48 ExpBox False + 261 34539 Geometry 293:25-293:48 ExpBox False + 262 34539 Geometry 293:1-293:48 TopLevelBox ["offsetToPoint"] + 263 0 Geometry 172:10-172:11 ExpBox False + 264 0 Geometry 172:15-172:16 ExpBox False + 265 0 Geometry 172:9-172:17 ExpBox False + 266 0 Geometry 172:20-172:21 ExpBox False + 267 0 Geometry 172:25-172:26 ExpBox False + 268 0 Geometry 172:19-172:27 ExpBox False + 269 0 Geometry 172:30-172:31 ExpBox False + 270 0 Geometry 172:35-172:36 ExpBox False + 271 0 Geometry 172:29-172:37 ExpBox False + 272 0 Geometry 172:7-172:37 ExpBox False + 273 0 Geometry 171:1-172:37 TopLevelBox ["addVV"] + 274 1323260 Geometry 168:40-168:41 ExpBox False + 275 1323260 Geometry 168:45-168:46 ExpBox False + 276 1323260 Geometry 168:40-168:46 ExpBox False + 277 1323260 Geometry 168:50-168:51 ExpBox False + 278 1323260 Geometry 168:55-168:56 ExpBox False + 279 1323260 Geometry 168:50-168:56 ExpBox False + 280 1323260 Geometry 168:40-168:56 ExpBox False + 281 1323260 Geometry 168:60-168:61 ExpBox False + 282 1323260 Geometry 168:65-168:66 ExpBox False + 283 1323260 Geometry 168:60-168:66 ExpBox False + 284 1323260 Geometry 168:40-168:66 ExpBox False + 285 1323260 Geometry 168:70-168:71 ExpBox False + 286 1323260 Geometry 168:75-168:76 ExpBox False + 287 1323260 Geometry 168:70-168:76 ExpBox False + 288 1323260 Geometry 168:40-168:76 ExpBox False + 289 1323260 Geometry 168:1-168:76 TopLevelBox ["dot4"] + 290 330815 Geometry 260:18-260:18 ExpBox False + 291 330815 Geometry 260:20-260:21 ExpBox False + 292 330815 Geometry 260:12-260:22 ExpBox False + 293 330815 Geometry 261:18-261:18 ExpBox False + 294 330815 Geometry 261:20-261:21 ExpBox False + 295 330815 Geometry 261:12-261:22 ExpBox False + 296 330815 Geometry 262:18-262:18 ExpBox False + 297 330815 Geometry 262:20-262:21 ExpBox False + 298 330815 Geometry 262:12-262:22 ExpBox False + 299 330815 Geometry 263:18-263:18 ExpBox False + 300 330815 Geometry 263:20-263:21 ExpBox False + 301 330815 Geometry 263:12-263:22 ExpBox False + 302 330815 Geometry 260:10-263:22 ExpBox False + 303 330815 Geometry 259:1-263:22 TopLevelBox ["multMQ"] + 304 12 Geometry 232:23-232:24 ExpBox False + 305 12 Geometry 232:12-232:24 ExpBox False + 306 12 Geometry 232:6-232:24 LocalBox ["multMM","m2'"] + 307 12 Geometry 227:18-227:20 ExpBox False + 308 12 Geometry 227:22-227:23 ExpBox False + 309 12 Geometry 227:10-227:24 ExpBox False + 310 12 Geometry 228:18-228:20 ExpBox False + 311 12 Geometry 228:22-228:23 ExpBox False + 312 12 Geometry 228:10-228:24 ExpBox False + 313 12 Geometry 229:18-229:20 ExpBox False + 314 12 Geometry 229:22-229:23 ExpBox False + 315 12 Geometry 229:10-229:24 ExpBox False + 316 12 Geometry 230:18-230:20 ExpBox False + 317 12 Geometry 230:22-230:23 ExpBox False + 318 12 Geometry 230:10-230:24 ExpBox False + 319 12 Geometry 227:8-230:24 ExpBox False + 320 12 Geometry 226:1-232:24 TopLevelBox ["multMM"] + 321 32512 Geometry 157:8-157:9 ExpBox False + 322 32512 Geometry 157:13-157:14 ExpBox False + 323 32512 Geometry 157:8-157:14 ExpBox False + 324 32512 Geometry 157:18-157:19 ExpBox False + 325 32512 Geometry 157:23-157:24 ExpBox False + 326 32512 Geometry 157:18-157:24 ExpBox False + 327 32512 Geometry 157:7-157:25 ExpBox False + 328 32512 Geometry 157:28-157:29 ExpBox False + 329 32512 Geometry 157:33-157:34 ExpBox False + 330 32512 Geometry 157:28-157:34 ExpBox False + 331 32512 Geometry 157:38-157:39 ExpBox False + 332 32512 Geometry 157:43-157:44 ExpBox False + 333 32512 Geometry 157:38-157:44 ExpBox False + 334 32512 Geometry 157:27-157:45 ExpBox False + 335 32512 Geometry 157:48-157:49 ExpBox False + 336 32512 Geometry 157:53-157:54 ExpBox False + 337 32512 Geometry 157:48-157:54 ExpBox False + 338 32512 Geometry 157:58-157:59 ExpBox False + 339 32512 Geometry 157:63-157:64 ExpBox False + 340 32512 Geometry 157:58-157:64 ExpBox False + 341 32512 Geometry 157:47-157:65 ExpBox False + 342 32512 Geometry 157:5-157:65 ExpBox False + 343 32512 Geometry 156:1-157:65 TopLevelBox ["cross"] + 344 112863 Geometry 153:33-153:34 ExpBox False + 345 112863 Geometry 153:38-153:39 ExpBox False + 346 112863 Geometry 153:33-153:39 ExpBox False + 347 112863 Geometry 153:43-153:44 ExpBox False + 348 112863 Geometry 153:48-153:49 ExpBox False + 349 112863 Geometry 153:43-153:49 ExpBox False + 350 112863 Geometry 153:33-153:49 ExpBox False + 351 112863 Geometry 153:53-153:54 ExpBox False + 352 112863 Geometry 153:58-153:59 ExpBox False + 353 112863 Geometry 153:53-153:59 ExpBox False + 354 112863 Geometry 153:33-153:59 ExpBox False + 355 112863 Geometry 153:1-153:59 TopLevelBox ["dot"] + 356 197872 Geometry 149:32-149:32 ExpBox False + 357 197872 Geometry 149:34-149:34 ExpBox False + 358 197872 Geometry 149:36-149:36 ExpBox False + 359 197872 Geometry 149:30-149:36 ExpBox False + 360 197872 Geometry 149:1-149:36 TopLevelBox ["quad_to_vector"] + 361 132895 Geometry 145:31-145:31 ExpBox False + 362 132895 Geometry 145:33-145:33 ExpBox False + 363 132895 Geometry 145:35-145:35 ExpBox False + 364 132895 Geometry 145:29-145:35 ExpBox False + 365 132895 Geometry 145:1-145:35 TopLevelBox ["quad_to_point"] + 366 132895 Geometry 141:29-141:29 ExpBox False + 367 132895 Geometry 141:31-141:31 ExpBox False + 368 132895 Geometry 141:33-141:33 ExpBox False + 369 132895 Geometry 141:35-141:35 ExpBox False + 370 132895 Geometry 141:27-141:35 ExpBox False + 371 132895 Geometry 141:1-141:35 TopLevelBox ["point_to_quad"] + 372 132895 Geometry 253:36-253:36 ExpBox False + 373 132895 Geometry 253:53-253:53 ExpBox False + 374 132895 Geometry 253:38-253:54 ExpBox False + 375 132895 Geometry 253:28-253:55 ExpBox False + 376 132895 Geometry 253:14-253:55 ExpBox False + 377 132895 Geometry 253:1-253:55 TopLevelBox ["multMP"] + 378 197872 Geometry 137:30-137:30 ExpBox False + 379 197872 Geometry 137:32-137:32 ExpBox False + 380 197872 Geometry 137:34-137:34 ExpBox False + 381 197872 Geometry 137:36-137:36 ExpBox False + 382 197872 Geometry 137:28-137:36 ExpBox False + 383 197872 Geometry 137:1-137:36 TopLevelBox ["vector_to_quad"] + 384 197872 Geometry 249:37-249:37 ExpBox False + 385 197872 Geometry 249:55-249:55 ExpBox False + 386 197872 Geometry 249:39-249:56 ExpBox False + 387 197872 Geometry 249:29-249:57 ExpBox False + 388 197872 Geometry 249:14-249:57 ExpBox False + 389 197872 Geometry 249:1-249:57 TopLevelBox ["multMV"] + 390 132847 Geometry 267:27-267:27 ExpBox False + 391 132847 Geometry 267:29-267:29 ExpBox False + 392 132847 Geometry 267:20-267:29 ExpBox False + 393 132847 Geometry 267:39-267:39 ExpBox False + 394 132847 Geometry 267:41-267:41 ExpBox False + 395 132847 Geometry 267:32-267:41 ExpBox False + 396 132847 Geometry 267:19-267:42 ExpBox False + 397 132847 Geometry 267:1-267:42 TopLevelBox ["multMR"] + 398 0 Geometry 133:32-133:32 ExpBox False + 399 0 Geometry 133:34-133:34 ExpBox False + 400 0 Geometry 133:36-133:36 ExpBox False + 401 0 Geometry 133:30-133:36 ExpBox False + 402 0 Geometry 133:1-133:36 TopLevelBox ["vector_to_point"] + 403 0 Geometry 130:31-130:31 ExpBox False + 404 0 Geometry 130:33-130:33 ExpBox False + 405 0 Geometry 130:35-130:35 ExpBox False + 406 0 Geometry 130:29-130:35 ExpBox False + 407 0 Geometry 130:1-130:35 TopLevelBox ["point_to_vector"] + 408 0 Geometry 127:29-127:29 ExpBox False + 409 0 Geometry 127:38-127:38 ExpBox False + 410 0 Geometry 127:29-127:38 ExpBox False + 411 0 Geometry 127:43-127:43 ExpBox False + 412 0 Geometry 127:52-127:52 ExpBox False + 413 0 Geometry 127:43-127:52 ExpBox False + 414 0 Geometry 127:57-127:57 ExpBox False + 415 0 Geometry 127:66-127:66 ExpBox False + 416 0 Geometry 127:57-127:66 ExpBox False + 417 0 Geometry 127:43-127:66 ExpBox False + 418 0 Geometry 127:29-127:66 ExpBox False + 419 0 Geometry 127:1-127:66 TopLevelBox ["nearV"] + 420 60006 Geometry 124:18-124:18 ExpBox False + 421 60006 Geometry 124:20-124:20 ExpBox False + 422 60006 Geometry 124:22-124:22 ExpBox False + 423 60006 Geometry 124:16-124:22 ExpBox False + 424 60006 Geometry 124:1-124:22 TopLevelBox ["vector"] + 425 0 Geometry 163:14-163:14 ExpBox False + 426 0 Geometry 163:19-163:19 ExpBox False + 427 0 Geometry 163:14-163:19 ExpBox False + 428 0 Geometry 163:14-163:19 BinBox GuardBinBox True + 429 0 Geometry 163:14-163:19 BinBox GuardBinBox False + 430 0 Geometry 163:44-163:44 ExpBox False + 431 0 Geometry 163:46-163:46 ExpBox False + 432 0 Geometry 163:50-163:50 ExpBox False + 433 0 Geometry 163:48-163:51 ExpBox False + 434 0 Geometry 163:36-163:52 ExpBox False + 435 0 Geometry 163:26-163:52 ExpBox True + 436 0 Geometry 164:14-164:22 ExpBox False + 437 0 Geometry 164:14-164:22 BinBox GuardBinBox True + 438 0 Geometry 164:14-164:22 BinBox GuardBinBox False + 439 0 Geometry 164:46-164:46 ExpBox False + 440 0 Geometry 164:44-164:47 ExpBox False + 441 0 Geometry 164:49-164:49 ExpBox False + 442 0 Geometry 164:51-164:51 ExpBox False + 443 0 Geometry 164:36-164:52 ExpBox False + 444 0 Geometry 164:26-164:52 ExpBox True + 445 0 Geometry 163:9-164:52 LocalBox ["tangents","v1"] + 446 0 Geometry 162:6-162:7 ExpBox False + 447 0 Geometry 162:10-162:10 ExpBox False + 448 0 Geometry 162:20-162:21 ExpBox False + 449 0 Geometry 162:10-162:21 ExpBox False + 450 0 Geometry 162:5-162:22 ExpBox False + 451 0 Geometry 161:1-164:52 TopLevelBox ["tangents"] + 452 26833 Geometry 121:17-121:17 ExpBox False + 453 26833 Geometry 121:19-121:19 ExpBox False + 454 26833 Geometry 121:21-121:21 ExpBox False + 455 26833 Geometry 121:15-121:21 ExpBox False + 456 26833 Geometry 121:1-121:21 TopLevelBox ["point"] + 457 159631 Geometry 118:24-118:24 ExpBox False + 458 159631 Geometry 118:1-118:24 TopLevelBox ["zComponent"] + 459 248385 Geometry 116:24-116:24 ExpBox False + 460 248385 Geometry 116:1-116:24 TopLevelBox ["yComponent"] + 461 159631 Geometry 114:24-114:24 ExpBox False + 462 159631 Geometry 114:1-114:24 TopLevelBox ["xComponent"] + 463 188590 Geometry 111:20-111:20 ExpBox False + 464 188590 Geometry 111:1-111:20 TopLevelBox ["zCoord"] + 465 253212 Geometry 109:20-109:20 ExpBox False + 466 253212 Geometry 109:1-109:20 TopLevelBox ["yCoord"] + 467 187913 Geometry 107:20-107:20 ExpBox False + 468 187913 Geometry 107:1-107:20 TopLevelBox ["xCoord"] + 469 60000 Geometry 104:22-104:22 ExpBox False + 470 60000 Geometry 104:24-104:24 ExpBox False + 471 60000 Geometry 104:26-104:26 ExpBox False + 472 60000 Geometry 104:21-104:27 ExpBox False + 473 60000 Geometry 104:1-104:27 TopLevelBox ["uncolor"] + 474 32514 Geometry 102:17-102:17 ExpBox False + 475 32514 Geometry 102:19-102:19 ExpBox False + 476 32514 Geometry 102:21-102:21 ExpBox False + 477 32514 Geometry 102:15-102:21 ExpBox False + 478 32514 Geometry 102:1-102:21 TopLevelBox ["color"] + 479 0 Geometry 100:16-100:16 ExpBox False + 480 0 Geometry 100:19-100:19 ExpBox False + 481 0 Geometry 100:22-100:22 ExpBox False + 482 0 Geometry 100:15-100:23 ExpBox False + 483 0 Geometry 100:1-100:23 TopLevelBox ["coord"] + 484 13 Geometry 95:10-95:12 ExpBox False + 485 13 Geometry 95:14-95:16 ExpBox False + 486 13 Geometry 95:18-95:20 ExpBox False + 487 13 Geometry 95:22-95:24 ExpBox False + 488 13 Geometry 95:7-95:25 ExpBox False + 489 13 Geometry 96:10-96:12 ExpBox False + 490 13 Geometry 96:14-96:16 ExpBox False + 491 13 Geometry 96:18-96:20 ExpBox False + 492 13 Geometry 96:22-96:24 ExpBox False + 493 13 Geometry 96:7-96:25 ExpBox False + 494 13 Geometry 97:10-97:12 ExpBox False + 495 13 Geometry 97:14-97:16 ExpBox False + 496 13 Geometry 97:18-97:20 ExpBox False + 497 13 Geometry 97:22-97:24 ExpBox False + 498 13 Geometry 97:7-97:25 ExpBox False + 499 13 Geometry 98:10-98:12 ExpBox False + 500 13 Geometry 98:14-98:16 ExpBox False + 501 13 Geometry 98:18-98:20 ExpBox False + 502 13 Geometry 98:22-98:24 ExpBox False + 503 13 Geometry 98:7-98:25 ExpBox False + 504 13 Geometry 95:5-98:25 ExpBox False + 505 13 Geometry 91:1-98:25 TopLevelBox ["matrix"] + 506 0 Geometry 70:15-70:18 TopLevelBox ["showsPrec"] + 507 0 Geometry 70:15-70:18 TopLevelBox ["showList"] + 508 0 Geometry 72:15-72:18 TopLevelBox ["showsPrec"] + 509 0 Geometry 72:15-72:18 TopLevelBox ["showList"] + 510 0 Geometry 72:21-72:22 TopLevelBox ["=="] + 511 0 Geometry 72:21-72:22 TopLevelBox ["/="] + 512 0 Geometry 77:15-77:18 TopLevelBox ["showsPrec"] + 513 0 Geometry 77:15-77:18 TopLevelBox ["showList"] + 514 0 Geometry 77:21-77:22 TopLevelBox ["=="] + 515 0 Geometry 77:21-77:22 TopLevelBox ["/="] + 516 0 Geometry 80:15-80:18 TopLevelBox ["showsPrec"] + 517 0 Geometry 80:15-80:18 TopLevelBox ["showList"] + 518 0 Geometry 83:15-83:18 TopLevelBox ["showsPrec"] + 519 0 Geometry 83:15-83:18 TopLevelBox ["showList"] + 520 0 Geometry 74:15-74:18 TopLevelBox ["showsPrec"] + 521 0 Geometry 74:15-74:18 TopLevelBox ["showList"] diff --git a/testsuite/tests/hpc/raytrace/tixs/test.T b/testsuite/tests/hpc/raytrace/tixs/test.T new file mode 100644 index 0000000000000000000000000000000000000000..877eb51270eb5683927a75a3a323860ba3fc2ad4 --- /dev/null +++ b/testsuite/tests/hpc/raytrace/tixs/test.T @@ -0,0 +1,23 @@ +setTestOpts([when(fast(), skip), js_skip]) + +test('hpc_report_multi_001', extra_files(['.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} report hpc_sample --include=Geometry --per-module"]) +test('hpc_report_multi_002', extra_files(['.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} report hpc_sample --exclude=Geometry --per-module"]) +test('hpc_report_multi_003', extra_files(['.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} report hpc_sample --include=Geometry --per-module --decl-list"]) + +test('hpc_markup_multi_001', extra_files(['../Geometry.hs', '.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} markup --hpcdir=tixs/.hpc --hpcdir=hpc_markup_multi_001/.hpc --destdir=markup_multi_001" + " hpc_sample --include=Geometry"]) +test('hpc_markup_multi_002', extra_files(['../CSG.hs', '../Construct.hs', '../Data.hs', '../Eval.hs', '../Geometry.hs', '../Illumination.hs', '../Intersections.hs', '../Interval.hs', '../Main.hs', '../Misc.hs', '../Parse.hs', '../Pixmap.hs', '../Primitives.hs', '../RayTrace.hs', '../Surface.hs', '.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} markup --hpcdir=tixs/.hpc --hpcdir=hpc_markup_multi_002/.hpc --destdir=markup_multi_002" + " hpc_sample --exclude=Geometry"]) +test('hpc_markup_multi_003', extra_files(['../CSG.hs', '../Construct.hs', '../Data.hs', '../Eval.hs', '../Geometry.hs', '../Illumination.hs', '../Intersections.hs', '../Interval.hs', '../Main.hs', '../Misc.hs', '../Parse.hs', '../Pixmap.hs', '../Primitives.hs', '../RayTrace.hs', '../Surface.hs', '.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} markup --hpcdir=tixs/.hpc --hpcdir=hpc_markup_multi_003/.hpc --destdir=markup_multi_003" + " hpc_sample --fun-entry-count"]) + +test('hpc_show_multi_001', extra_files(['.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} show hpc_sample"]) +test('hpc_show_multi_002', extra_files(['.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} show hpc_sample --include=Geometry"]) diff --git a/testsuite/tests/hpc/simple/Makefile b/testsuite/tests/hpc/simple/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4a268530f13bc7f70d03965dacf45d8a0b4a720e --- /dev/null +++ b/testsuite/tests/hpc/simple/Makefile @@ -0,0 +1,4 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + diff --git a/testsuite/tests/hpc/simple/hpc001.hs b/testsuite/tests/hpc/simple/hpc001.hs new file mode 100644 index 0000000000000000000000000000000000000000..53421b8e55f12ff6870dbf192eebfe6fadc365e6 --- /dev/null +++ b/testsuite/tests/hpc/simple/hpc001.hs @@ -0,0 +1 @@ +main = print (const "Hello" "World") diff --git a/testsuite/tests/hpc/simple/hpc001.stdout b/testsuite/tests/hpc/simple/hpc001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..03d524f4c5a2386143c06ddb6f5e58990f407e08 --- /dev/null +++ b/testsuite/tests/hpc/simple/hpc001.stdout @@ -0,0 +1,115 @@ +"Hello" + + + 75% expressions used (3/4) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) + + +-----<module Main>----- + 75% expressions used (3/4) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) + + +Writing: Main.hs.html +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +</head> +<body> +<pre> +<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span> +</pre> +<pre> +<span class="lineno"> 1 </span><span class="decl"><span class="istickedoff">main = print (const "Hello" <span class="nottickedoff">"World"</span>)</span></span> + +</pre> +</body> +</html> +Writing: hpc_index.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">75%</td><td>3/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">75%</td><td>3/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_fun.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">75%</td><td>3/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">75%</td><td>3/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_alt.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">75%</td><td>3/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">75%</td><td>3/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> +Writing: hpc_index_exp.html +<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">table.bar { background-color: #f25913; } +td.bar { background-color: #60de51; } +td.invbar { background-color: #f25913; } +table.dashboard { border-collapse: collapse ; border: solid 1px black } +.dashboard td { border: solid 1px black } +.dashboard th { border: solid 1px black } +</style> +</head><body><table class="dashboard" width="100%" border=1> +<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr> +<td> <tt>module <a href="Main.hs.html">Main</a></tt></td> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">75%</td><td>3/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +<tr></tr><tr style="background: #e0e0e0"> +<th align=left> Program Coverage Total</tt></th> +<td align="right">100%</td><td>1/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">75%</td><td>3/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr> +</table></body></html> + + diff --git a/testsuite/tests/hpc/simple/test.T b/testsuite/tests/hpc/simple/test.T new file mode 100644 index 0000000000000000000000000000000000000000..cd7cd8b0949529ab79af04f0b946d7862492b57b --- /dev/null +++ b/testsuite/tests/hpc/simple/test.T @@ -0,0 +1,8 @@ +setTestOpts([omit_ghci, when(fast(), skip), js_skip]) + +hpc_prefix = "perl hpcrun.pl --clear --exeext={exeext} --hpc={hpc}" + +test('hpc001', [extra_files(['../hpcrun.pl']), cmd_prefix(hpc_prefix), + when(arch('wasm32'), fragile(23243)) + ], + compile_and_run, ['-fhpc']) diff --git a/testsuite/tests/hpc/simple/tixs/.hpc.copy/Main.mix b/testsuite/tests/hpc/simple/tixs/.hpc.copy/Main.mix new file mode 100644 index 0000000000000000000000000000000000000000..75ce018698bb30fc45c8100dc6aaf43e1a283354 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/.hpc.copy/Main.mix @@ -0,0 +1 @@ +Mix "hpc001.hs" 2012-01-29 18:01:54 UTC 2454134535 8 [(1:21-1:27,ExpBox False),(1:29-1:35,ExpBox False),(1:14-1:36,ExpBox False),(1:8-1:36,ExpBox False),(1:1-1:36,TopLevelBox ["main"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/simple/tixs/.hpc/Main.mix b/testsuite/tests/hpc/simple/tixs/.hpc/Main.mix new file mode 100644 index 0000000000000000000000000000000000000000..75ce018698bb30fc45c8100dc6aaf43e1a283354 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/.hpc/Main.mix @@ -0,0 +1 @@ +Mix "hpc001.hs" 2012-01-29 18:01:54 UTC 2454134535 8 [(1:21-1:27,ExpBox False),(1:29-1:35,ExpBox False),(1:14-1:36,ExpBox False),(1:8-1:36,ExpBox False),(1:1-1:36,TopLevelBox ["main"])] \ No newline at end of file diff --git a/testsuite/tests/hpc/simple/tixs/.hpc/NoParse.mix b/testsuite/tests/hpc/simple/tixs/.hpc/NoParse.mix new file mode 100644 index 0000000000000000000000000000000000000000..28f54ff6e04b563b6dbe9b991ad9c31b12bafc98 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/.hpc/NoParse.mix @@ -0,0 +1 @@ +NoParse diff --git a/testsuite/tests/hpc/simple/tixs/Makefile b/testsuite/tests/hpc/simple/tixs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..60332c95014a6e15468cdba71e80a9b6615174e5 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/Makefile @@ -0,0 +1,14 @@ +# This Makefile runs the tests using GHC's testsuite framework. It +# assumes the package is part of a GHC build tree with the testsuite +# installed in ../../../testsuite. + +TOP=../../../../../testsuite +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + +build-tix: + rm -Rf .hpc hpc001.o a.out + '$(TEST_HC)' -fhpc hpc001.hs + ./a.out + mv a.out.tix hpc_sample.tix + diff --git a/testsuite/tests/hpc/simple/tixs/T10529a.stderr b/testsuite/tests/hpc/simple/tixs/T10529a.stderr new file mode 100644 index 0000000000000000000000000000000000000000..2f495549f0f02e40937425f246da9c7f06d9f8ab --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/T10529a.stderr @@ -0,0 +1,3 @@ +hpc: can not find NonExistingModule in ./.hpc +CallStack (from ImplicitParams): + error, called at libraries/hpc/Trace/Hpc/Mix.hs:119:15 in hpc-0.6.0.2:Trace.Hpc.Mix diff --git a/testsuite/tests/hpc/simple/tixs/T10529b.stderr b/testsuite/tests/hpc/simple/tixs/T10529b.stderr new file mode 100644 index 0000000000000000000000000000000000000000..ad9b6758439a3eb352bfba1cb811da80cd55bb7c --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/T10529b.stderr @@ -0,0 +1,4 @@ +hpc: hash in tix file for module Main (1234567890) +does not match hash in ./.hpc/Main.mix (2454134535) +CallStack (from ImplicitParams): + error, called at libraries/hpc/Trace/Hpc/Mix.hs:129:17 in hpc-0.6.0.2:Trace.Hpc.Mix diff --git a/testsuite/tests/hpc/simple/tixs/T10529c.stderr b/testsuite/tests/hpc/simple/tixs/T10529c.stderr new file mode 100644 index 0000000000000000000000000000000000000000..0700886c856c2c5bb0c366c7f5865786ad713330 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/T10529c.stderr @@ -0,0 +1,3 @@ +hpc: can not parse ./.hpc/NoParse.mix +CallStack (from ImplicitParams): + error, called at libraries/hpc/Trace/Hpc/Mix.hs:103:43 in hpc-0.6.0.2:Trace.Hpc.Mix diff --git a/testsuite/tests/hpc/simple/tixs/hand_overlay.ovr b/testsuite/tests/hpc/simple/tixs/hand_overlay.ovr new file mode 100644 index 0000000000000000000000000000000000000000..c5f8ef4d19375fa295d32f0ffedf9fa1a7b0a1fe --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hand_overlay.ovr @@ -0,0 +1,6 @@ +module "Main" { + inside "main" { + tick "\"World\"" [my tag]; + } +} + diff --git a/testsuite/tests/hpc/simple/tixs/hpc001.hs b/testsuite/tests/hpc/simple/tixs/hpc001.hs new file mode 100644 index 0000000000000000000000000000000000000000..53421b8e55f12ff6870dbf192eebfe6fadc365e6 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc001.hs @@ -0,0 +1 @@ +main = print (const "Hello" "World") diff --git a/testsuite/tests/hpc/simple/tixs/hpc_bad_001.stdout b/testsuite/tests/hpc/simple/tixs/hpc_bad_001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..49506a8b1793a185ca51930fde7c785f2915ffa5 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_bad_001.stdout @@ -0,0 +1 @@ +no such HPC command: bad diff --git a/testsuite/tests/hpc/simple/tixs/hpc_draft.stdout b/testsuite/tests/hpc/simple/tixs/hpc_draft.stdout new file mode 100644 index 0000000000000000000000000000000000000000..24b41fa0250a774ee1e64cf0f60ef87042251864 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_draft.stdout @@ -0,0 +1,6 @@ +module "Main" { + inside "main" { + tick "\"World\"" on line 1; + } +} + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_hand_overlay.stdout b/testsuite/tests/hpc/simple/tixs/hpc_hand_overlay.stdout new file mode 100644 index 0000000000000000000000000000000000000000..fe4d77fac04604d686121991334797b4dd238b98 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_hand_overlay.stdout @@ -0,0 +1,9 @@ +Tix [TixModule "Main" 2454134535 5 [0,1,0,0,0]] +100% expressions used (4/4) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) diff --git a/testsuite/tests/hpc/simple/tixs/hpc_help.stdout b/testsuite/tests/hpc/simple/tixs/hpc_help.stdout new file mode 100644 index 0000000000000000000000000000000000000000..c690a342d6cd72102eafd1e579c475ca6dbeb036 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_help.stdout @@ -0,0 +1,27 @@ +Usage: hpc COMMAND ... + +Commands: + help Display help for hpc or a single command +Reporting Coverage: + report Output textual report about program coverage + markup Markup Haskell source with program coverage +Processing Coverage files: + sum Sum multiple .tix files in a single .tix file + combine Combine two .tix files in a single .tix file + map Map a function over a single .tix file +Coverage Overlays: + overlay Generate a .tix file from an overlay file + draft Generate draft overlay that provides 100% coverage +Others: + show Show .tix file in readable, verbose format + version Display version for hpc + + +or: hpc @response_file_1 @response_file_2 ... + +The contents of a Response File must have this format: +COMMAND ... + +example: +report my_library.tix --include=ModuleA \ +--include=ModuleB \ No newline at end of file diff --git a/testsuite/tests/hpc/simple/tixs/hpc_help_draft.stdout b/testsuite/tests/hpc/simple/tixs/hpc_help_draft.stdout new file mode 100644 index 0000000000000000000000000000000000000000..fb663ff8fe2598508611210b3013886cd07fc012 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_help_draft.stdout @@ -0,0 +1,18 @@ +Usage: hpc draft [OPTION] .. <TIX_FILE> +Generate draft overlay that provides 100% coverage + + +Options: + + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --output=FILE output FILE + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_help_help.stdout b/testsuite/tests/hpc/simple/tixs/hpc_help_help.stdout new file mode 100644 index 0000000000000000000000000000000000000000..4dc1205fcba1550fe3106ae9ac7e033f7a019f0c --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_help_help.stdout @@ -0,0 +1,3 @@ +Usage: hpc help [<HPC_COMMAND>] +Display help for hpc or a single command + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_help_markup.stdout b/testsuite/tests/hpc/simple/tixs/hpc_help_markup.stdout new file mode 100644 index 0000000000000000000000000000000000000000..947d18b4907880633f536706f738f4da6b33577b --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_help_markup.stdout @@ -0,0 +1,20 @@ +Usage: hpc markup [OPTION] .. <TIX_FILE> [<MODULE> [<MODULE> ..]] +Markup Haskell source with program coverage + + +Options: + + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --fun-entry-count show top-level function entry counts + --highlight-covered highlight covered code, rather that code gaps + --destdir=DIR path to write output to + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_help_overlay.stdout b/testsuite/tests/hpc/simple/tixs/hpc_help_overlay.stdout new file mode 100644 index 0000000000000000000000000000000000000000..ea4859c8c8cf011c3578cf90fd8d9a8b2f0ce443 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_help_overlay.stdout @@ -0,0 +1,16 @@ +Usage: hpc overlay [OPTION] .. <OVERLAY_FILE> [<OVERLAY_FILE> [...]] +Generate a .tix file from an overlay file + + +Options: + + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --output=FILE output FILE + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_help_report.stdout b/testsuite/tests/hpc/simple/tixs/hpc_help_report.stdout new file mode 100644 index 0000000000000000000000000000000000000000..5d73a49ad421477ff9ba2ac9f337ef959fc22d0c --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_help_report.stdout @@ -0,0 +1,20 @@ +Usage: hpc report [OPTION] .. <TIX_FILE> [<MODULE> [<MODULE> ..]] +Output textual report about program coverage + + +Options: + + --per-module show module level detail + --decl-list show unused decls + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --xml-output show output in XML + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_help_show.stdout b/testsuite/tests/hpc/simple/tixs/hpc_help_show.stdout new file mode 100644 index 0000000000000000000000000000000000000000..1302178b03b8493e849067158054adbe7ce329e0 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_help_show.stdout @@ -0,0 +1,18 @@ +Usage: hpc show [OPTION] .. <TIX_FILE> [<MODULE> [<MODULE> ..]] +Show .tix file in readable, verbose format + + +Options: + + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --output=FILE output FILE + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_help_version.stdout b/testsuite/tests/hpc/simple/tixs/hpc_help_version.stdout new file mode 100644 index 0000000000000000000000000000000000000000..38e62c79ac7d8c90ddcd9e535feb57144664c875 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_help_version.stdout @@ -0,0 +1,3 @@ +Usage: hpc version +Display version for hpc + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_markup_001.stdout b/testsuite/tests/hpc/simple/tixs/hpc_markup_001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..d6e087aaa72a2db1d6fe34d652ac0d4b81c5c888 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_markup_001.stdout @@ -0,0 +1,24 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { color: #404040; background: white; font-style: oblique } +span.istickedoff { color: black; background: #d0c0ff; font-style: normal; } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold; background: #d0c0ff } +span.spaces { background: white } +</style> +</head> +<body> +<pre> +<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span> +</pre> +<pre> +<span class="lineno"> 1 </span><span class="decl"><span class="istickedoff">main = print (const "Hello" <span class="nottickedoff">"World"</span>)</span></span> + +</pre> +</body> +</html> diff --git a/testsuite/tests/hpc/simple/tixs/hpc_markup_002.stdout b/testsuite/tests/hpc/simple/tixs/hpc_markup_002.stdout new file mode 100644 index 0000000000000000000000000000000000000000..38a790c353f3b03c384efa273d854a6fcefbe1c2 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_markup_002.stdout @@ -0,0 +1,24 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<style type="text/css"> +span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px } +span.nottickedoff { background: yellow} +span.istickedoff { background: white } +span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 } +span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 } +span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 } +span.decl { font-weight: bold } +span.spaces { background: white } +</style> +</head> +<body> +<pre> +<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span> +</pre> +<pre> +<span class="lineno"> 1 </span><span class="funcount">-- entered once</span><span class="decl"><span class="istickedoff">main = print (const "Hello" <span class="nottickedoff">"World"</span>)</span></span> + +</pre> +</body> +</html> diff --git a/testsuite/tests/hpc/simple/tixs/hpc_markup_error_001.stdout b/testsuite/tests/hpc/simple/tixs/hpc_markup_error_001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..a68a5dcf646b3e15427937ca533991e51652abf3 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_markup_error_001.stdout @@ -0,0 +1,21 @@ +Error: no .tix file or executable name specified +Usage: hpc markup [OPTION] .. <TIX_FILE> [<MODULE> [<MODULE> ..]] +Markup Haskell source with program coverage + + +Options: + + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --fun-entry-count show top-level function entry counts + --highlight-covered highlight covered code, rather that code gaps + --destdir=DIR path to write output to + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_markup_error_002.stdout b/testsuite/tests/hpc/simple/tixs/hpc_markup_error_002.stdout new file mode 100644 index 0000000000000000000000000000000000000000..43748603db95339588bfe74169777fb537b5679d --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_markup_error_002.stdout @@ -0,0 +1,21 @@ +Error: unable to find tix file for: hpc001.hs +Usage: hpc markup [OPTION] .. <TIX_FILE> [<MODULE> [<MODULE> ..]] +Markup Haskell source with program coverage + + +Options: + + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --fun-entry-count show top-level function entry counts + --highlight-covered highlight covered code, rather that code gaps + --destdir=DIR path to write output to + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_overlay.stdout b/testsuite/tests/hpc/simple/tixs/hpc_overlay.stdout new file mode 100644 index 0000000000000000000000000000000000000000..8fda52f6e871f3b1755444e6c3295b1dcb22fdad --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_overlay.stdout @@ -0,0 +1,10 @@ +Tix [TixModule "Main" 2454134535 5 [0,1,0,0,0]] + +100% expressions used (4/4) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) diff --git a/testsuite/tests/hpc/simple/tixs/hpc_overlay2.stdout b/testsuite/tests/hpc/simple/tixs/hpc_overlay2.stdout new file mode 100644 index 0000000000000000000000000000000000000000..fe4d77fac04604d686121991334797b4dd238b98 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_overlay2.stdout @@ -0,0 +1,9 @@ +Tix [TixModule "Main" 2454134535 5 [0,1,0,0,0]] +100% expressions used (4/4) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) diff --git a/testsuite/tests/hpc/simple/tixs/hpc_report_001.stdout b/testsuite/tests/hpc/simple/tixs/hpc_report_001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..dbb9066fc91faddf4d871e6c9dafffad40a955cb --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_report_001.stdout @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<coverage name="hpc_sample.tix"> + <summary> + <exprs boxes="4" count="3"/> + <booleans boxes="0" true="0" false="0" count="0"/> + <guards boxes="0" true="0" false="0" count="0"/> + <conditionals boxes="0" true="0" false="0" count="0"/> + <qualifiers boxes="0" true="0" false="0" count="0"/> + <alts boxes="0" count="0"/> + <local boxes="0" count="0"/> + <toplevel boxes="1" count="1"/> + </summary> +</coverage> diff --git a/testsuite/tests/hpc/simple/tixs/hpc_report_002.stdout b/testsuite/tests/hpc/simple/tixs/hpc_report_002.stdout new file mode 100644 index 0000000000000000000000000000000000000000..24f5e53df78097a9f78c1ec64b8562ae7d583c1a --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_report_002.stdout @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<coverage name="hpc_sample.tix"> + <module name = "Main"> + <exprs boxes="4" count="3"/> + <booleans boxes="0" true="0" false="0" count="0"/> + <guards boxes="0" true="0" false="0" count="0"/> + <conditionals boxes="0" true="0" false="0" count="0"/> + <qualifiers boxes="0" true="0" false="0" count="0"/> + <alts boxes="0" count="0"/> + <local boxes="0" count="0"/> + <toplevel boxes="1" count="1"/> + </module> + <summary> + <exprs boxes="4" count="3"/> + <booleans boxes="0" true="0" false="0" count="0"/> + <guards boxes="0" true="0" false="0" count="0"/> + <conditionals boxes="0" true="0" false="0" count="0"/> + <qualifiers boxes="0" true="0" false="0" count="0"/> + <alts boxes="0" count="0"/> + <local boxes="0" count="0"/> + <toplevel boxes="1" count="1"/> + </summary> +</coverage> diff --git a/testsuite/tests/hpc/simple/tixs/hpc_report_003.stdout b/testsuite/tests/hpc/simple/tixs/hpc_report_003.stdout new file mode 100644 index 0000000000000000000000000000000000000000..f8e72d0fb2fbd57ef2f4e7df6673f50aa96e67aa --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_report_003.stdout @@ -0,0 +1,9 @@ +-----<module Main>----- + 75% expressions used (3/4) +100% boolean coverage (0/0) + 100% guards (0/0) + 100% 'if' conditions (0/0) + 100% qualifiers (0/0) +100% alternatives used (0/0) +100% local declarations used (0/0) +100% top-level declarations used (1/1) diff --git a/testsuite/tests/hpc/simple/tixs/hpc_report_error_001.stdout b/testsuite/tests/hpc/simple/tixs/hpc_report_error_001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..4878dd712cbb429aab9eb5e4283a6361cc84c680 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_report_error_001.stdout @@ -0,0 +1,21 @@ +Error: no .tix file or executable name specified +Usage: hpc report [OPTION] .. <TIX_FILE> [<MODULE> [<MODULE> ..]] +Output textual report about program coverage + + +Options: + + --per-module show module level detail + --decl-list show unused decls + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --xml-output show output in XML + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_report_error_002.stdout b/testsuite/tests/hpc/simple/tixs/hpc_report_error_002.stdout new file mode 100644 index 0000000000000000000000000000000000000000..0c95a0a30319774e42b4775da12a19d30591bffd --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_report_error_002.stdout @@ -0,0 +1,21 @@ +Error: unable to find tix file for:hpc001.hs +Usage: hpc report [OPTION] .. <TIX_FILE> [<MODULE> [<MODULE> ..]] +Output textual report about program coverage + + +Options: + + --per-module show module level detail + --decl-list show unused decls + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --xml-output show output in XML + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_sample.tix b/testsuite/tests/hpc/simple/tixs/hpc_sample.tix new file mode 100644 index 0000000000000000000000000000000000000000..a93645e8833129981639b767c8aa55b0015be0e7 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_sample.tix @@ -0,0 +1 @@ +Tix [ TixModule "Main" 2454134535 5 [1,0,1,1,1]] diff --git a/testsuite/tests/hpc/simple/tixs/hpc_sample_incompatible_hash.tix b/testsuite/tests/hpc/simple/tixs/hpc_sample_incompatible_hash.tix new file mode 100644 index 0000000000000000000000000000000000000000..f9c335ef19516c9f19d7377ca1db11cb300b12f9 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_sample_incompatible_hash.tix @@ -0,0 +1 @@ +Tix [ TixModule "Main" 1234567890 5 [1,0,1,1,1]] diff --git a/testsuite/tests/hpc/simple/tixs/hpc_sample_no_parse.tix b/testsuite/tests/hpc/simple/tixs/hpc_sample_no_parse.tix new file mode 100644 index 0000000000000000000000000000000000000000..b2b2110f6208bfea20e76292fc849ac4289049e8 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_sample_no_parse.tix @@ -0,0 +1 @@ +Tix [ TixModule "NoParse" 2454134535 5 [1,0,1,1,1]] diff --git a/testsuite/tests/hpc/simple/tixs/hpc_sample_non_existing_module.tix b/testsuite/tests/hpc/simple/tixs/hpc_sample_non_existing_module.tix new file mode 100644 index 0000000000000000000000000000000000000000..1fa93c5f35f19998dea5b1d5c39d9492f4c3a5c2 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_sample_non_existing_module.tix @@ -0,0 +1 @@ +Tix [ TixModule "NonExistingModule" 2454134535 5 [1,0,1,1,1]] diff --git a/testsuite/tests/hpc/simple/tixs/hpc_show.stdout b/testsuite/tests/hpc/simple/tixs/hpc_show.stdout new file mode 100644 index 0000000000000000000000000000000000000000..0d255db3822f43c65b6cd8efec5f844d8f192ef1 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_show.stdout @@ -0,0 +1,5 @@ + 0 1 Main 1:21-1:27 ExpBox False + 1 0 Main 1:29-1:35 ExpBox False + 2 1 Main 1:14-1:36 ExpBox False + 3 1 Main 1:8-1:36 ExpBox False + 4 1 Main 1:1-1:36 TopLevelBox ["main"] diff --git a/testsuite/tests/hpc/simple/tixs/hpc_show_error_001.stdout b/testsuite/tests/hpc/simple/tixs/hpc_show_error_001.stdout new file mode 100644 index 0000000000000000000000000000000000000000..184957b17c1ca2bf146bd3b72bfbab72801f5fba --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_show_error_001.stdout @@ -0,0 +1,19 @@ +Error: no .tix file or executable name specified +Usage: hpc show [OPTION] .. <TIX_FILE> [<MODULE> [<MODULE> ..]] +Show .tix file in readable, verbose format + + +Options: + + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --output=FILE output FILE + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/hpc_show_error_002.stdout b/testsuite/tests/hpc/simple/tixs/hpc_show_error_002.stdout new file mode 100644 index 0000000000000000000000000000000000000000..50f6a250a1e9bbf3eeb2c5ccc5893946bbe6e35a --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/hpc_show_error_002.stdout @@ -0,0 +1,19 @@ +Error: could not read .tix file : hpc001.hs +Usage: hpc show [OPTION] .. <TIX_FILE> [<MODULE> [<MODULE> ..]] +Show .tix file in readable, verbose format + + +Options: + + --exclude=[PACKAGE:][MODULE] exclude MODULE and/or PACKAGE + --include=[PACKAGE:][MODULE] include MODULE and/or PACKAGE + --srcdir=DIR path to source directory of .hs files + multi-use of srcdir possible + --hpcdir=DIR append sub-directory that contains .mix files + default .hpc [rarely used] + --reset-hpcdirs empty the list of hpcdir's + [rarely used] + --output=FILE output FILE + --verbosity=[0-2] verbosity level, 0-2 + default 1 + diff --git a/testsuite/tests/hpc/simple/tixs/sample_overlay.ovr b/testsuite/tests/hpc/simple/tixs/sample_overlay.ovr new file mode 100644 index 0000000000000000000000000000000000000000..24b41fa0250a774ee1e64cf0f60ef87042251864 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/sample_overlay.ovr @@ -0,0 +1,6 @@ +module "Main" { + inside "main" { + tick "\"World\"" on line 1; + } +} + diff --git a/testsuite/tests/hpc/simple/tixs/test.T b/testsuite/tests/hpc/simple/tixs/test.T new file mode 100644 index 0000000000000000000000000000000000000000..ab6937703329bb595be47bfa1771b2d96b025181 --- /dev/null +++ b/testsuite/tests/hpc/simple/tixs/test.T @@ -0,0 +1,84 @@ +setTestOpts([when(fast(), skip), js_skip]) + +test('hpc_help', normal, run_command, ["{hpc} help"]) +test('hpc_help_help', normal, run_command, ["{hpc} help help"]) + +test('hpc_help_report', normal, run_command, ["{hpc} help report"]) +test('hpc_report_001', extra_files(['.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} report hpc_sample.tix --xml-output"]) +test('hpc_report_002', extra_files(['.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} report hpc_sample.tix --xml-output --per-module"]) +test('hpc_report_003', extra_files(['.hpc/', 'hpc_sample.tix']), run_command, + ["{hpc} report hpc_sample.tix --per-module --decl-list"]) +test('hpc_report_error_001', exit_code(1), run_command, + ["{hpc} report"]) # no .tix file +test('hpc_report_error_002', exit_code(1), run_command, + ["{hpc} report hpc001.hs"]) # bad .tix file + +test('hpc_help_markup', normal, run_command, ["{hpc} help markup"]) +test('hpc_markup_error_001', exit_code(1), run_command, + ["{hpc} markup"]) # no .tix file +test('hpc_markup_error_002', exit_code(1), run_command, + ["{hpc} markup hpc001.hs"]) # bad .tix file +test('hpc_markup_001', extra_files(['.hpc/', 'hpc001.hs', 'hpc_sample.tix']), run_command, + ["{hpc} markup --verbosity=0 --destdir=markup_001" + " hpc_sample.tix --highlight-covered; cat markup_001/Main.hs.html"]) +test('hpc_markup_002', extra_files(['.hpc/', 'hpc001.hs', 'hpc_sample.tix']), run_command, + ["{hpc} markup --verbosity=0 --destdir=markup_002" + " hpc_sample.tix --fun-entry-count; cat markup_002/Main.hs.html"]) + +test('hpc_help_show', normal, run_command, ["{hpc} help show"]) +test('hpc_show', extra_files(['.hpc', 'hpc_sample.tix']), run_command, ["{hpc} show hpc_sample.tix"]) +test('hpc_show_error_001', exit_code(1), run_command, + ["{hpc} show"]) # no .tix file +test('hpc_show_error_002', exit_code(1), run_command, + ["{hpc} show hpc001.hs"]) # bad .tix file + +test('hpc_help_version', normal, run_command, ["{hpc} help version"]) + +test('hpc_help_draft', normal, run_command, ["{hpc} help draft"]) +test('hpc_draft', extra_files(['.hpc/', 'hpc001.hs', 'hpc_sample.tix']), run_command, ["{hpc} draft hpc_sample.tix"]) + +test('hpc_help_overlay', normal, run_command, ["{hpc} help overlay"]) + +test('hpc_overlay', + extra_files(['.hpc/', 'hpc001.hs', 'hpc_sample.tix', 'sample_overlay.ovr']), + run_command, + ["({hpc} overlay sample_overlay.ovr > sample_overlay1.tix; " + "cat sample_overlay1.tix; echo; " + "{hpc} combine hpc_sample.tix sample_overlay1.tix > total1.tix; " + "{hpc} report total1.tix)"]) + +test('hpc_overlay2', + extra_files(['.hpc/', 'hpc001.hs', 'hpc_sample.tix', 'sample_overlay.ovr']), + run_command, + ["({hpc} overlay sample_overlay.ovr --output=sample_overlay2.tix; " + "cat sample_overlay2.tix; echo; " + "{hpc} combine hpc_sample.tix sample_overlay2.tix --output=total2.tix; " + "{hpc} report total2.tix)"]) + +test('hpc_hand_overlay', + extra_files(['.hpc/', 'hand_overlay.ovr', 'hpc001.hs', 'hpc_sample.tix']), + run_command, + ["({hpc} overlay hand_overlay.ovr --output=sample_overlay3.tix; " + "cat sample_overlay3.tix; echo; " + "{hpc} combine hpc_sample.tix sample_overlay3.tix --output=total3.tix; " + "{hpc} report total3.tix)"]) + +test('hpc_bad_001', exit_code(1), run_command, ["{hpc} bad arguments"]) + +test('T9619', [extra_files(['.hpc', '.hpc.copy', 'hpc_sample.tix']), + ignore_stdout], run_command, + # Having the same mix file in two different hpcdirs should work. + ["{hpc} report hpc_sample.tix --hpcdir=.hpc --hpcdir=.hpc.copy"]) + +# Show different error messages for different types of failures. +test('T10529a', [extra_files(['hpc_sample_non_existing_module.tix']), + exit_code(1)], run_command, + ["{hpc} report hpc_sample_non_existing_module.tix"]) +test('T10529b', [extra_files(['.hpc/', 'hpc_sample_incompatible_hash.tix']), + exit_code(1)], run_command, + ["{hpc} report hpc_sample_incompatible_hash.tix"]) +test('T10529c', [extra_files(['.hpc/', 'hpc_sample_no_parse.tix']), + exit_code(1)], run_command, + ["{hpc} report hpc_sample_no_parse.tix"])