{-# LANGUAGE ScopedTypeVariables, TypeSynonymInstances, FlexibleInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  TaskMonad.Utils
-- Copyright   :  Max Magorsch <max@magorsch.de>
-- License     :  BSD-style (see LICENSE)
--
-- Maintainer  :  Max Magorsch <max@magorsch.de>
-- Stability   :  unstable
-- Portability :  unportable
--
-- TaskMonad.Utils bundles a number of help functions that can be used to
-- interact with the taskwarrior command line application. 
--
-----------------------------------------------------------------------------

module TaskMonad.Utils
  ( getTaskwarriorTaskList
  , getTaskwarriorIds
  , isTWReport
  , defaulttwreports
  , execCommand
  , execCommandWithOutput
  , twicon
  )
where

import           Data.List
import           Data.Maybe
import           System.Process
import           System.IO
import           Control.Monad                  ( filterM )

import           XMonad                  hiding ( liftX )
import           XMonad.Util.Font
import qualified XMonad.StackSet               as W
import           XMonad.Layout.Decoration
import           XMonad.Prompt
import           XMonad.Prompt.Input
import           XMonad.Util.Image
import           XMonad.Util.NamedWindows
import           XMonad.Util.XUtils
import           XMonad.Util.NamedScratchpad
import           XMonad.Util.Run
import           XMonad.Actions.GridSelect




-- | Returns a filtered list of all properties that belong to a given category. For example
--
-- > getTaskwarriorIds "status:pending" "tags"
--
-- returns a list of all tags of the pending tasks. Likewise
--
-- > getTaskwarriorIds "status:pending" "ids"
--
-- returns the ids of all pending tasks.
getTaskwarriorIds
  :: String -- ^ A filter that is applied, e.g. "+INBOX" or "status:pending". Please refer to the [taskwarrior documentation](https://taskwarrior.org/docs/filter.html) for further information.
  -> String -- ^ The category of properties that should be returned, e.g. "ids" or "tags"
  -> IO [String] -- ^ A filtered list of all properties that belong to the specified category
getTaskwarriorIds filter category = do
  result <- execCommandWithOutput "task" (filter ++ " _" ++ category)
  return $ lines result


-- | Get a tuple containing the id and the description of a task with a specified id
getTaskwarriorTaskDescription
  :: String -- ^ the id of the task 
  -> IO (String, String) -- ^ (the id of the task, the description)
getTaskwarriorTaskDescription id = do
  result <- execCommandWithOutput "task" ("_get " ++ id ++ ".description")
  return (id, result)


-- | Get the description of a task with a specified id
getTaskDescription
  :: String -- ^ the id of the task
  -> IO String -- ^ the description of the task
getTaskDescription id =
  execCommandWithOutput "task" ("_get " ++ id ++ ".description")


-- | Returns a filtered list of tasks that contains the specified properties of each task
getTaskwarriorTaskList
  :: String -- ^ A filter that is applied, e.g. "+INBOX" or "status:pending". Please refer to the [taskwarrior documentation](https://taskwarrior.org/docs/filter.html) for further information.
  -> [String] -- ^ A list of properties that should be retrieved for each task, e.g. ["id", "description", "tags"] 
  -> IO [[String]] -- ^ A filtered list of tasks that contains the specified properties of each task
getTaskwarriorTaskList filter taskproperties = do
  ids <- getTaskwarriorIds filter "ids"
  traverse (getTaskwarriorTaskProperties taskproperties) ids


-- | Get a list of specified properties of a task with a specified id
getTaskwarriorTaskProperties
  :: Traversable t
  => t String -- ^ a list of properties
  -> String -- ^ the id of the task
  -> IO (t String) -- ^ the list containing the values of the specified properties
getTaskwarriorTaskProperties properties id =
  traverse (getTaskwarriorTaskProperty id) properties


-- | Get a specified property of a task with a specified id
getTaskwarriorTaskProperty
  :: String -- ^ the id of the task
  -> String -- ^ the desired property
  -> IO String -- ^ the value of the desired property of the specified task
getTaskwarriorTaskProperty id property = do
  result <- execCommandWithOutput "task" ("_get " ++ id ++ "." ++ property)
  return $ filter (/= '\n') result


-- | Checks whether a given taskwarrior command is a report or not
isTWReport :: String -> Bool
isTWReport command = head (words command) `elem` defaulttwreports


-- | A list containing all taskwarrior reports. For further information, please refer to [https://taskwarrior.org/docs/report.html](https://taskwarrior.org/docs/report.html) 
defaulttwreports :: [String]
defaulttwreports =
  [ "dailyreview"
  , "weeklyreview"
  , "inbox"
  , "processInbox"
  , "process"
  , "active"
  , "all"
  , "blocked"
  , "blocking"
  , "completed"
  , "done"
  , "list"
  , "long"
  , "ls"
  , "minimal"
  , "newest"
  , "next"
  , "oldest"
  , "overdue"
  , "ready"
  , "recurring"
  , "unblocked"
  , "waiting"
  , "burndown.daily"
  , "burndown.monthly"
  , "burndown.weekly"
  , "calendar"
  , "colors"
  , "columns"
  , "commands"
  , "diagnostics"
  , "ghistory.annual"
  , "ghistory.monthly"
  , "ghistory.weekly"
  , "ghistory.daily"
  , "history.annual"
  , "history.monthly"
  , "history.weekly"
  , "history.daily"
  , "ids"
  , "information"
  , "projects"
  , "reports"
  , "show"
  , "stats"
  , "summary"
  , "tags"
  , "timesheet"
  , "udas"
  , "uuids"
  ]


-- | Executes a shell command.
execCommand :: MonadIO m => String -> m ()
execCommand = unsafeSpawn


-- | Executes an executable with args and returns the output.
execCommandWithOutput :: FilePath -> String -> IO String
execCommandWithOutput executable args = do
  (_, Just hout, _, _) <- createProcess (proc executable (words args))
    { std_out = CreatePipe
    }
  hGetContents hout


-- | The Taskwarrior icon
twicon :: [[Bool]]
twicon =
  [ [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , True
    , True
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , True
    , False
    , False
    , False
    , False
    , True
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  , [ False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    , False
    ]
  ]