-- Copyright (c) 2016-present, Facebook, Inc.
-- All rights reserved.
--
-- This source code is licensed under the BSD-style license found in the
-- LICENSE file in the root directory of this source tree. An additional grant
-- of patent rights can be found in the PATENTS file in the same directory.

module Duckling.Time.Computed
  ( chanukah, chineseNewYear, dhanteras, easterSunday, eidalAdha, eidalFitr
  , lagBaOmer, mawlid, muharram, navaratri, orthodoxEaster, passover, rajab
  , rakshaBandhan, ramadan, roshHashana, thaiPongal, thiruOnam, tishaBAv
  , tuBishvat, vasantPanchami, yomHaatzmaut
  ) where

import Data.Maybe
import Prelude
import qualified Data.Time as Time

import Duckling.Time.Helpers (timeComputed)
import Duckling.Time.Types (TimeData(..), TimeObject(..), timedata')
import qualified Duckling.TimeGrain.Types as TG

toTimeObjectM :: (Integer, Int, Int) -> Maybe TimeObject
toTimeObjectM (year, month, day) = do
  day <- Time.fromGregorianValid year month day
  return TimeObject
    { start = Time.UTCTime day 0
    , grain = TG.Day
    , end = Nothing
    }

computedDays :: [TimeObject] -> TimeData
computedDays xs = timedata'
  { timePred = timeComputed xs
  , timeGrain = TG.Day
  }

chanukah :: TimeData
chanukah = computedDays chanukah'

chanukah' :: [TimeObject]
chanukah' = mapMaybe toTimeObjectM
  [ (1950, 12, 3)
  , (1951, 12, 23)
  , (1952, 12, 12)
  , (1953, 12, 1)
  , (1954, 12, 19)
  , (1955, 12, 9)
  , (1956, 11, 28)
  , (1957, 12, 17)
  , (1958, 12, 6)
  , (1959, 12, 25)
  , (1960, 12, 13)
  , (1961, 12, 2)
  , (1962, 12, 21)
  , (1963, 12, 10)
  , (1964, 11, 29)
  , (1965, 12, 18)
  , (1966, 12, 7)
  , (1967, 12, 26)
  , (1968, 12, 15)
  , (1969, 12, 4)
  , (1970, 12, 22)
  , (1971, 12, 12)
  , (1972, 11, 30)
  , (1973, 12, 19)
  , (1974, 12, 8)
  , (1975, 11, 28)
  , (1976, 12, 16)
  , (1977, 12, 4)
  , (1978, 12, 24)
  , (1979, 12, 14)
  , (1980, 12, 2)
  , (1981, 12, 20)
  , (1982, 12, 10)
  , (1983, 11, 30)
  , (1984, 12, 18)
  , (1985, 12, 7)
  , (1986, 12, 26)
  , (1987, 12, 15)
  , (1988, 12, 3)
  , (1989, 12, 22)
  , (1990, 12, 11)
  , (1991, 12, 1)
  , (1992, 12, 19)
  , (1993, 12, 8)
  , (1994, 11, 27)
  , (1995, 12, 17)
  , (1996, 12, 5)
  , (1997, 12, 23)
  , (1998, 12, 13)
  , (1999, 12, 3)
  , (2000, 12, 21)
  , (2001, 12, 9)
  , (2002, 11, 29)
  , (2003, 12, 19)
  , (2004, 12, 7)
  , (2005, 12, 25)
  , (2006, 12, 15)
  , (2007, 12, 4)
  , (2008, 12, 21)
  , (2009, 12, 11)
  , (2010, 12, 1)
  , (2011, 12, 20)
  , (2012, 12, 8)
  , (2013, 11, 27)
  , (2014, 12, 16)
  , (2015, 12, 6)
  , (2016, 12, 24)
  , (2017, 12, 12)
  , (2018, 12, 2)
  , (2019, 12, 22)
  , (2020, 12, 10)
  , (2021, 11, 28)
  , (2022, 12, 18)
  , (2023, 12, 7)
  , (2024, 12, 25)
  , (2025, 12, 14)
  , (2026, 12, 4)
  , (2027, 12, 24)
  , (2028, 12, 12)
  , (2029, 12, 1)
  , (2030, 12, 20)
  , (2031, 12, 9)
  , (2032, 11, 27)
  , (2033, 12, 16)
  , (2034, 12, 6)
  , (2035, 12, 25)
  , (2036, 12, 13)
  , (2037, 12, 2)
  , (2038, 12, 21)
  , (2039, 12, 11)
  , (2040, 11, 29)
  , (2041, 12, 17)
  , (2042, 12, 7)
  , (2043, 12, 26)
  , (2044, 12, 14)
  , (2045, 12, 3)
  , (2046, 12, 23)
  , (2047, 12, 12)
  , (2048, 11, 29)
  , (2049, 12, 19)
  , (2050, 12, 9)
  ]

chineseNewYear :: TimeData
chineseNewYear = computedDays chineseNewYear'

chineseNewYear' :: [TimeObject]
chineseNewYear' = mapMaybe toTimeObjectM
  [ (1950, 2, 17)
  , (1951, 2, 6)
  , (1952, 1, 27)
  , (1953, 2, 14)
  , (1954, 2, 3)
  , (1955, 1, 24)
  , (1956, 2, 12)
  , (1957, 1, 31)
  , (1958, 2, 18)
  , (1959, 2, 8)
  , (1960, 1, 28)
  , (1961, 2, 15)
  , (1962, 2, 5)
  , (1963, 1, 25)
  , (1964, 2, 13)
  , (1965, 2, 2)
  , (1966, 1, 21)
  , (1967, 2, 9)
  , (1968, 1, 30)
  , (1969, 2, 17)
  , (1970, 2, 6)
  , (1971, 1, 27)
  , (1972, 2, 15)
  , (1973, 2, 3)
  , (1974, 1, 23)
  , (1975, 2, 11)
  , (1976, 1, 31)
  , (1977, 2, 18)
  , (1978, 2, 7)
  , (1979, 1, 28)
  , (1980, 2, 16)
  , (1981, 2, 5)
  , (1982, 1, 25)
  , (1983, 2, 13)
  , (1984, 2, 2)
  , (1985, 2, 20)
  , (1986, 2, 9)
  , (1987, 1, 29)
  , (1988, 2, 17)
  , (1989, 2, 6)
  , (1990, 1, 27)
  , (1991, 2, 15)
  , (1992, 2, 4)
  , (1993, 1, 23)
  , (1994, 2, 10)
  , (1995, 1, 31)
  , (1996, 2, 19)
  , (1997, 2, 7)
  , (1998, 1, 28)
  , (1999, 2, 16)
  , (2000, 2, 5)
  , (2001, 1, 24)
  , (2002, 2, 12)
  , (2003, 2, 1)
  , (2004, 1, 22)
  , (2005, 2, 9)
  , (2006, 1, 29)
  , (2007, 2, 18)
  , (2008, 2, 7)
  , (2009, 1, 26)
  , (2010, 2, 14)
  , (2011, 2, 3)
  , (2012, 1, 23)
  , (2013, 2, 10)
  , (2014, 1, 31)
  , (2015, 2, 19)
  , (2016, 2, 8)
  , (2017, 1, 28)
  , (2018, 2, 16)
  , (2019, 2, 5)
  , (2020, 1, 25)
  , (2021, 2, 12)
  , (2022, 2, 1)
  , (2023, 1, 22)
  , (2024, 2, 10)
  , (2025, 1, 29)
  , (2026, 2, 17)
  , (2027, 2, 6)
  , (2028, 1, 26)
  , (2029, 2, 13)
  , (2030, 2, 3)
  , (2031, 1, 23)
  , (2032, 2, 11)
  , (2033, 1, 31)
  , (2034, 2, 19)
  , (2035, 2, 8)
  , (2036, 1, 28)
  , (2037, 2, 15)
  , (2038, 2, 4)
  , (2039, 1, 24)
  , (2040, 2, 12)
  , (2041, 2, 1)
  , (2042, 1, 22)
  , (2043, 2, 10)
  , (2044, 1, 30)
  , (2045, 2, 17)
  , (2046, 2, 6)
  , (2047, 1, 26)
  , (2048, 2, 14)
  , (2049, 2, 2)
  , (2050, 1, 23)
  ]

easterSunday :: TimeData
easterSunday = computedDays easterSunday'

easterSunday' :: [TimeObject]
easterSunday' = mapMaybe toTimeObjectM
  [ (1950, 4, 9)
  , (1951, 3, 25)
  , (1952, 4, 13)
  , (1953, 4, 5)
  , (1954, 4, 18)
  , (1955, 4, 10)
  , (1956, 4, 1)
  , (1957, 4, 21)
  , (1958, 4, 6)
  , (1959, 3, 29)
  , (1960, 4, 17)
  , (1961, 4, 2)
  , (1962, 4, 22)
  , (1963, 4, 14)
  , (1964, 3, 29)
  , (1965, 4, 18)
  , (1966, 4, 10)
  , (1967, 3, 26)
  , (1968, 4, 14)
  , (1969, 4, 6)
  , (1970, 3, 29)
  , (1971, 4, 11)
  , (1972, 4, 2)
  , (1973, 4, 22)
  , (1974, 4, 14)
  , (1975, 3, 30)
  , (1976, 4, 18)
  , (1977, 4, 10)
  , (1978, 3, 26)
  , (1979, 4, 15)
  , (1980, 4, 6)
  , (1981, 4, 19)
  , (1982, 4, 11)
  , (1983, 4, 3)
  , (1984, 4, 22)
  , (1985, 4, 7)
  , (1986, 3, 30)
  , (1987, 4, 19)
  , (1988, 4, 3)
  , (1989, 3, 26)
  , (1990, 4, 15)
  , (1991, 3, 31)
  , (1992, 4, 19)
  , (1993, 4, 11)
  , (1994, 4, 3)
  , (1995, 4, 16)
  , (1996, 4, 7)
  , (1997, 3, 30)
  , (1998, 4, 12)
  , (1999, 4, 4)
  , (2000, 4, 23)
  , (2001, 4, 15)
  , (2002, 3, 31)
  , (2003, 4, 20)
  , (2004, 4, 11)
  , (2005, 3, 27)
  , (2006, 4, 16)
  , (2007, 4, 8)
  , (2008, 3, 23)
  , (2009, 4, 12)
  , (2010, 4, 4)
  , (2011, 4, 24)
  , (2012, 4, 8)
  , (2013, 3, 31)
  , (2014, 4, 20)
  , (2015, 4, 5)
  , (2016, 3, 27)
  , (2017, 4, 16)
  , (2018, 4, 1)
  , (2019, 4, 21)
  , (2020, 4, 12)
  , (2021, 4, 4)
  , (2022, 4, 17)
  , (2023, 4, 9)
  , (2024, 3, 31)
  , (2025, 4, 20)
  , (2026, 4, 5)
  , (2027, 3, 28)
  , (2028, 4, 16)
  , (2029, 4, 1)
  , (2030, 4, 21)
  , (2031, 4, 13)
  , (2032, 3, 28)
  , (2033, 4, 17)
  , (2034, 4, 9)
  , (2035, 3, 25)
  , (2036, 4, 13)
  , (2037, 4, 5)
  , (2038, 4, 25)
  , (2039, 4, 10)
  , (2040, 4, 1)
  , (2041, 4, 21)
  , (2042, 4, 6)
  , (2043, 3, 29)
  , (2044, 4, 17)
  , (2045, 4, 9)
  , (2046, 3, 25)
  , (2047, 4, 14)
  , (2048, 4, 5)
  , (2049, 4, 18)
  , (2050, 4, 10)
  ]

lagBaOmer :: TimeData
lagBaOmer = computedDays lagBaOmer'

lagBaOmer' :: [TimeObject]
lagBaOmer' = mapMaybe toTimeObjectM
  [ (1950, 5, 4)
  , (1951, 5, 23)
  , (1952, 5, 12)
  , (1953, 5, 2)
  , (1954, 5, 20)
  , (1955, 5, 9)
  , (1956, 4, 28)
  , (1957, 5, 18)
  , (1958, 5, 7)
  , (1959, 5, 25)
  , (1960, 5, 14)
  , (1961, 5, 3)
  , (1962, 5, 21)
  , (1963, 5, 11)
  , (1964, 4, 29)
  , (1965, 5, 19)
  , (1966, 5, 7)
  , (1967, 5, 27)
  , (1968, 5, 15)
  , (1969, 5, 5)
  , (1970, 5, 23)
  , (1971, 5, 12)
  , (1972, 5, 1)
  , (1973, 5, 19)
  , (1974, 5, 9)
  , (1975, 4, 28)
  , (1976, 5, 17)
  , (1977, 5, 5)
  , (1978, 5, 24)
  , (1979, 5, 14)
  , (1980, 5, 3)
  , (1981, 5, 21)
  , (1982, 5, 10)
  , (1983, 4, 30)
  , (1984, 5, 19)
  , (1985, 5, 8)
  , (1986, 5, 26)
  , (1987, 5, 16)
  , (1988, 5, 4)
  , (1989, 5, 22)
  , (1990, 5, 12)
  , (1991, 5, 1)
  , (1992, 5, 20)
  , (1993, 5, 8)
  , (1994, 4, 28)
  , (1995, 5, 17)
  , (1996, 5, 6)
  , (1997, 5, 24)
  , (1998, 5, 13)
  , (1999, 5, 3)
  , (2000, 5, 22)
  , (2001, 5, 10)
  , (2002, 4, 29)
  , (2003, 5, 19)
  , (2004, 5, 8)
  , (2005, 5, 26)
  , (2006, 5, 15)
  , (2007, 5, 5)
  , (2008, 5, 22)
  , (2009, 5, 11)
  , (2010, 5, 1)
  , (2011, 5, 21)
  , (2012, 5, 9)
  , (2013, 4, 27)
  , (2014, 5, 17)
  , (2015, 5, 6)
  , (2016, 5, 25)
  , (2017, 5, 13)
  , (2018, 5, 2)
  , (2019, 5, 22)
  , (2020, 5, 11)
  , (2021, 4, 29)
  , (2022, 5, 18)
  , (2023, 5, 8)
  , (2024, 5, 25)
  , (2025, 5, 15)
  , (2026, 5, 4)
  , (2027, 5, 24)
  , (2028, 5, 13)
  , (2029, 5, 2)
  , (2030, 5, 20)
  , (2031, 5, 10)
  , (2032, 4, 28)
  , (2033, 5, 16)
  , (2034, 5, 6)
  , (2035, 5, 26)
  , (2036, 5, 14)
  , (2037, 5, 2)
  , (2038, 5, 22)
  , (2039, 5, 11)
  , (2040, 4, 30)
  , (2041, 5, 18)
  , (2042, 5, 7)
  , (2043, 5, 27)
  , (2044, 5, 14)
  , (2045, 5, 4)
  , (2046, 5, 23)
  , (2047, 5, 13)
  , (2048, 4, 30)
  , (2049, 5, 19)
  , (2050, 5, 9)
  ]

orthodoxEaster :: TimeData
orthodoxEaster = computedDays orthodoxEaster'

orthodoxEaster' :: [TimeObject]
orthodoxEaster' = mapMaybe toTimeObjectM
  [ (1950, 4, 9)
  , (1951, 4, 29)
  , (1952, 4, 20)
  , (1953, 4, 5)
  , (1954, 4, 25)
  , (1955, 4, 17)
  , (1956, 5, 6)
  , (1957, 4, 21)
  , (1958, 4, 13)
  , (1959, 5, 3)
  , (1960, 4, 17)
  , (1961, 4, 9)
  , (1962, 4, 29)
  , (1963, 4, 14)
  , (1964, 5, 3)
  , (1965, 4, 25)
  , (1966, 4, 10)
  , (1967, 4, 30)
  , (1968, 4, 21)
  , (1969, 4, 13)
  , (1970, 4, 26)
  , (1971, 4, 18)
  , (1972, 4, 9)
  , (1973, 4, 29)
  , (1974, 4, 14)
  , (1975, 5, 4)
  , (1976, 4, 25)
  , (1977, 4, 10)
  , (1978, 4, 30)
  , (1979, 4, 22)
  , (1980, 4, 6)
  , (1981, 4, 26)
  , (1982, 4, 18)
  , (1983, 5, 8)
  , (1984, 4, 22)
  , (1985, 4, 14)
  , (1986, 5, 4)
  , (1987, 4, 19)
  , (1988, 4, 10)
  , (1989, 4, 30)
  , (1990, 4, 15)
  , (1991, 4, 7)
  , (1992, 4, 26)
  , (1993, 4, 18)
  , (1994, 5, 1)
  , (1995, 4, 23)
  , (1996, 4, 14)
  , (1997, 4, 27)
  , (1998, 4, 19)
  , (1999, 4, 11)
  , (2000, 4, 30)
  , (2001, 4, 15)
  , (2002, 5, 5)
  , (2003, 4, 27)
  , (2004, 4, 11)
  , (2005, 5, 1)
  , (2006, 4, 23)
  , (2007, 4, 8)
  , (2008, 4, 27)
  , (2009, 4, 19)
  , (2010, 4, 4)
  , (2011, 4, 24)
  , (2012, 4, 15)
  , (2013, 5, 5)
  , (2014, 4, 20)
  , (2015, 4, 12)
  , (2016, 5, 1)
  , (2017, 4, 16)
  , (2018, 4, 8)
  , (2019, 4, 28)
  , (2020, 4, 19)
  , (2021, 5, 2)
  , (2022, 4, 24)
  , (2023, 4, 16)
  , (2024, 5, 5)
  , (2025, 4, 20)
  , (2026, 4, 12)
  , (2027, 5, 2)
  , (2028, 4, 16)
  , (2029, 4, 8)
  , (2030, 4, 28)
  , (2031, 4, 13)
  , (2032, 5, 2)
  , (2033, 4, 24)
  , (2034, 4, 9)
  , (2035, 4, 29)
  , (2036, 4, 20)
  , (2037, 4, 5)
  , (2038, 4, 25)
  , (2039, 4, 17)
  , (2040, 5, 6)
  , (2041, 4, 21)
  , (2042, 4, 13)
  , (2043, 5, 3)
  , (2044, 4, 24)
  , (2045, 4, 9)
  , (2046, 4, 29)
  , (2047, 4, 21)
  , (2048, 4, 5)
  , (2049, 4, 25)
  , (2050, 4, 17)
  ]

passover :: TimeData
passover = computedDays passover'

passover' :: [TimeObject]
passover' = mapMaybe toTimeObjectM
  [ (1950, 4, 1)
  , (1951, 4, 20)
  , (1952, 4, 9)
  , (1953, 3, 30)
  , (1954, 4, 17)
  , (1955, 4, 6)
  , (1956, 3, 26)
  , (1957, 4, 15)
  , (1958, 4, 4)
  , (1959, 4, 22)
  , (1960, 4, 11)
  , (1961, 3, 31)
  , (1962, 4, 18)
  , (1963, 4, 8)
  , (1964, 3, 27)
  , (1965, 4, 16)
  , (1966, 4, 4)
  , (1967, 4, 24)
  , (1968, 4, 12)
  , (1969, 4, 2)
  , (1970, 4, 20)
  , (1971, 4, 9)
  , (1972, 3, 29)
  , (1973, 4, 16)
  , (1974, 4, 6)
  , (1975, 3, 26)
  , (1976, 4, 14)
  , (1977, 4, 2)
  , (1978, 4, 21)
  , (1979, 4, 11)
  , (1980, 3, 31)
  , (1981, 4, 18)
  , (1982, 4, 7)
  , (1983, 3, 28)
  , (1984, 4, 16)
  , (1985, 4, 5)
  , (1986, 4, 23)
  , (1987, 4, 13)
  , (1988, 4, 1)
  , (1989, 4, 19)
  , (1990, 4, 9)
  , (1991, 3, 29)
  , (1992, 4, 17)
  , (1993, 4, 5)
  , (1994, 3, 26)
  , (1995, 4, 14)
  , (1996, 4, 3)
  , (1997, 4, 21)
  , (1998, 4, 10)
  , (1999, 3, 31)
  , (2000, 4, 19)
  , (2001, 4, 7)
  , (2002, 3, 27)
  , (2003, 4, 16)
  , (2004, 4, 5)
  , (2005, 4, 23)
  , (2006, 4, 12)
  , (2007, 4, 2)
  , (2008, 4, 19)
  , (2009, 4, 8)
  , (2010, 3, 29)
  , (2011, 4, 18)
  , (2012, 4, 6)
  , (2013, 3, 25)
  , (2014, 4, 14)
  , (2015, 4, 3)
  , (2016, 4, 22)
  , (2017, 4, 10)
  , (2018, 3, 30)
  , (2019, 4, 19)
  , (2020, 4, 8)
  , (2021, 3, 27)
  , (2022, 4, 15)
  , (2023, 4, 5)
  , (2024, 4, 22)
  , (2025, 4, 12)
  , (2026, 4, 1)
  , (2027, 4, 21)
  , (2028, 4, 10)
  , (2029, 3, 30)
  , (2030, 4, 17)
  , (2031, 4, 7)
  , (2032, 3, 26)
  , (2033, 4, 13)
  , (2034, 4, 3)
  , (2035, 4, 23)
  , (2036, 4, 11)
  , (2037, 3, 30)
  , (2038, 4, 19)
  , (2039, 4, 8)
  , (2040, 3, 28)
  , (2041, 4, 15)
  , (2042, 4, 4)
  , (2043, 4, 24)
  , (2044, 4, 11)
  , (2045, 4, 1)
  , (2046, 4, 20)
  , (2047, 4, 10)
  , (2048, 3, 28)
  , (2049, 4, 16)
  , (2050, 4, 6)
  ]

roshHashana :: TimeData
roshHashana = computedDays roshHashana'

roshHashana' :: [TimeObject]
roshHashana' = mapMaybe toTimeObjectM
  [ (1950, 9, 11)
  , (1951, 9, 30)
  , (1952, 9, 19)
  , (1953, 9, 9)
  , (1954, 9, 27)
  , (1955, 9, 16)
  , (1956, 9, 5)
  , (1957, 9, 25)
  , (1958, 9, 14)
  , (1959, 10, 2)
  , (1960, 9, 21)
  , (1961, 9, 10)
  , (1962, 9, 28)
  , (1963, 9, 18)
  , (1964, 9, 6)
  , (1965, 9, 26)
  , (1966, 9, 14)
  , (1967, 10, 4)
  , (1968, 9, 22)
  , (1969, 9, 12)
  , (1970, 9, 30)
  , (1971, 9, 19)
  , (1972, 9, 8)
  , (1973, 9, 26)
  , (1974, 9, 16)
  , (1975, 9, 5)
  , (1976, 9, 24)
  , (1977, 9, 12)
  , (1978, 10, 1)
  , (1979, 9, 21)
  , (1980, 9, 10)
  , (1981, 9, 28)
  , (1982, 9, 17)
  , (1983, 9, 7)
  , (1984, 9, 26)
  , (1985, 9, 15)
  , (1986, 10, 3)
  , (1987, 9, 23)
  , (1988, 9, 11)
  , (1989, 9, 29)
  , (1990, 9, 19)
  , (1991, 9, 8)
  , (1992, 9, 27)
  , (1993, 9, 15)
  , (1994, 9, 5)
  , (1995, 9, 24)
  , (1996, 9, 13)
  , (1997, 10, 1)
  , (1998, 9, 20)
  , (1999, 9, 10)
  , (2000, 9, 29)
  , (2001, 9, 17)
  , (2002, 9, 6)
  , (2003, 9, 26)
  , (2004, 9, 15)
  , (2005, 10, 3)
  , (2006, 9, 22)
  , (2007, 9, 12)
  , (2008, 9, 29)
  , (2009, 9, 18)
  , (2010, 9, 8)
  , (2011, 9, 28)
  , (2012, 9, 18)
  , (2013, 9, 4)
  , (2014, 9, 24)
  , (2015, 9, 13)
  , (2016, 10, 2)
  , (2017, 9, 20)
  , (2018, 9, 9)
  , (2019, 9, 29)
  , (2020, 9, 18)
  , (2021, 9, 6)
  , (2022, 9, 25)
  , (2023, 9, 15)
  , (2024, 10, 2)
  , (2025, 9, 22)
  , (2026, 9, 11)
  , (2027, 10, 1)
  , (2028, 9, 20)
  , (2029, 9, 9)
  , (2030, 9, 27)
  , (2031, 9, 17)
  , (2032, 9, 5)
  , (2033, 9, 23)
  , (2034, 9, 13)
  , (2035, 10, 3)
  , (2036, 9, 21)
  , (2037, 9, 9)
  , (2038, 9, 29)
  , (2039, 9, 18)
  , (2040, 9, 7)
  , (2041, 9, 25)
  , (2042, 9, 14)
  , (2043, 10, 4)
  , (2044, 9, 21)
  , (2045, 9, 11)
  , (2046, 9, 30)
  , (2047, 9, 20)
  , (2048, 9, 7)
  , (2049, 9, 26)
  , (2050, 9, 16)
  ]

tishaBAv :: TimeData
tishaBAv = computedDays tishaBAv'

tishaBAv' :: [TimeObject]
tishaBAv' = mapMaybe toTimeObjectM
  [ (1950, 7, 22)
  , (1951, 8, 11)
  , (1952, 7, 30)
  , (1953, 7, 20)
  , (1954, 8, 7)
  , (1955, 7, 27)
  , (1956, 7, 16)
  , (1957, 8, 5)
  , (1958, 7, 26)
  , (1959, 8, 12)
  , (1960, 8, 1)
  , (1961, 7, 22)
  , (1962, 8, 8)
  , (1963, 7, 29)
  , (1964, 7, 18)
  , (1965, 8, 7)
  , (1966, 7, 25)
  , (1967, 8, 14)
  , (1968, 8, 3)
  , (1969, 7, 23)
  , (1970, 8, 10)
  , (1971, 7, 31)
  , (1972, 7, 19)
  , (1973, 8, 6)
  , (1974, 7, 27)
  , (1975, 7, 16)
  , (1976, 8, 4)
  , (1977, 7, 23)
  , (1978, 8, 12)
  , (1979, 8, 1)
  , (1980, 7, 21)
  , (1981, 8, 8)
  , (1982, 7, 28)
  , (1983, 7, 18)
  , (1984, 8, 6)
  , (1985, 7, 27)
  , (1986, 8, 13)
  , (1987, 8, 3)
  , (1988, 7, 23)
  , (1989, 8, 9)
  , (1990, 7, 30)
  , (1991, 7, 20)
  , (1992, 8, 8)
  , (1993, 7, 26)
  , (1994, 7, 16)
  , (1995, 8, 5)
  , (1996, 7, 24)
  , (1997, 8, 11)
  , (1998, 8, 1)
  , (1999, 7, 21)
  , (2000, 8, 9)
  , (2001, 7, 28)
  , (2002, 7, 17)
  , (2003, 8, 6)
  , (2004, 7, 26)
  , (2005, 8, 13)
  , (2006, 8, 2)
  , (2007, 7, 23)
  , (2008, 8, 9)
  , (2009, 7, 29)
  , (2010, 7, 19)
  , (2011, 8, 8)
  , (2012, 7, 28)
  , (2013, 7, 15)
  , (2014, 8, 4)
  , (2015, 7, 25)
  , (2016, 8, 13)
  , (2017, 7, 31)
  , (2018, 7, 21)
  , (2019, 8, 10)
  , (2020, 7, 29)
  , (2021, 7, 17)
  , (2022, 8, 6)
  , (2023, 7, 26)
  , (2024, 8, 12)
  , (2025, 8, 2)
  , (2026, 7, 22)
  , (2027, 8, 11)
  , (2028, 7, 31)
  , (2029, 7, 21)
  , (2030, 8, 7)
  , (2031, 7, 28)
  , (2032, 7, 17)
  , (2033, 8, 3)
  , (2034, 7, 24)
  , (2035, 8, 13)
  , (2036, 8, 2)
  , (2037, 7, 20)
  , (2038, 8, 9)
  , (2039, 7, 30)
  , (2040, 7, 18)
  , (2041, 8, 5)
  , (2042, 7, 26)
  , (2043, 8, 15)
  , (2044, 8, 1)
  , (2045, 7, 22)
  , (2046, 8, 11)
  , (2047, 7, 31)
  , (2048, 7, 18)
  , (2049, 8, 7)
  , (2050, 7, 27)
  ]

yomHaatzmaut :: TimeData
yomHaatzmaut = computedDays yomHaatzmaut'

yomHaatzmaut' :: [TimeObject]
yomHaatzmaut' = mapMaybe toTimeObjectM
  [ (1950, 4, 19)
  , (1951, 5, 9)
  , (1952, 4, 29)
  , (1953, 4, 19)
  , (1954, 5, 5)
  , (1955, 4, 26)
  , (1956, 4, 15)
  , (1957, 5, 5)
  , (1958, 4, 23)
  , (1959, 5, 12)
  , (1960, 5, 1)
  , (1961, 4, 19)
  , (1962, 5, 8)
  , (1963, 4, 28)
  , (1964, 4, 15)
  , (1965, 5, 5)
  , (1966, 4, 24)
  , (1967, 5, 14)
  , (1968, 5, 1)
  , (1969, 4, 22)
  , (1970, 5, 10)
  , (1971, 4, 28)
  , (1972, 4, 18)
  , (1973, 5, 6)
  , (1974, 4, 24)
  , (1975, 4, 15)
  , (1976, 5, 4)
  , (1977, 4, 20)
  , (1978, 5, 10)
  , (1979, 5, 1)
  , (1980, 4, 20)
  , (1981, 5, 6)
  , (1982, 4, 27)
  , (1983, 4, 17)
  , (1984, 5, 6)
  , (1985, 4, 24)
  , (1986, 5, 13)
  , (1987, 5, 3)
  , (1988, 4, 20)
  , (1989, 5, 9)
  , (1990, 4, 29)
  , (1991, 4, 17)
  , (1992, 5, 6)
  , (1993, 4, 25)
  , (1994, 4, 13)
  , (1995, 5, 3)
  , (1996, 4, 23)
  , (1997, 5, 11)
  , (1998, 4, 29)
  , (1999, 4, 20)
  , (2000, 5, 9)
  , (2001, 4, 25)
  , (2002, 4, 16)
  , (2003, 5, 6)
  , (2004, 4, 26)
  , (2005, 5, 11)
  , (2006, 5, 2)
  , (2007, 4, 23)
  , (2008, 5, 7)
  , (2009, 4, 28)
  , (2010, 4, 19)
  , (2011, 5, 9)
  , (2012, 4, 25)
  , (2013, 4, 15)
  , (2014, 5, 5)
  , (2015, 4, 22)
  , (2016, 5, 11)
  , (2017, 5, 1)
  , (2018, 4, 18)
  , (2019, 5, 8)
  , (2020, 4, 28)
  , (2021, 4, 14)
  , (2022, 5, 4)
  , (2023, 4, 25)
  , (2024, 5, 13)
  , (2025, 4, 30)
  , (2026, 4, 21)
  , (2027, 5, 11)
  , (2028, 5, 1)
  , (2029, 4, 18)
  , (2030, 5, 7)
  , (2031, 4, 28)
  , (2032, 4, 14)
  , (2033, 5, 3)
  , (2034, 4, 24)
  , (2035, 5, 14)
  , (2036, 4, 30)
  , (2037, 4, 20)
  , (2038, 5, 10)
  , (2039, 4, 27)
  , (2040, 4, 17)
  , (2041, 5, 6)
  , (2042, 4, 23)
  , (2043, 5, 13)
  , (2044, 5, 2)
  , (2045, 4, 19)
  , (2046, 5, 9)
  , (2047, 4, 30)
  , (2048, 4, 15)
  , (2049, 5, 5)
  , (2050, 4, 26)
  ]

eidalAdha :: TimeData
eidalAdha = computedDays eidalAdha'

eidalAdha' :: [TimeObject]
eidalAdha' = mapMaybe toTimeObjectM
  [ (2000, 3, 16)
  , (2001, 3, 5)
  , (2002, 2, 22)
  , (2003, 2, 11)
  , (2004, 2, 1)
  , (2005, 1, 21)
  , (2006, 1, 10)
  , (2006, 12, 31)
  , (2007, 12, 20)
  , (2008, 12, 8)
  , (2009, 11, 27)
  , (2011, 11, 6)
  , (2012, 10, 26)
  , (2013, 10, 15)
  , (2014, 10, 4)
  , (2015, 8, 23)
  , (2016, 9, 11)
  , (2017, 9, 1)
  , (2018, 8, 21)
  , (2019, 8, 11)
  , (2020, 7, 31)
  , (2021, 7, 20)
  , (2022, 7, 9)
  , (2023, 6, 28)
  , (2024, 6, 16)
  , (2025, 6, 6)
  , (2026, 5, 27)
  , (2027, 5, 16)
  , (2028, 5, 5)
  , (2029, 4, 24)
  ]

eidalFitr :: TimeData
eidalFitr = computedDays eidalFitr'

eidalFitr' :: [TimeObject]
eidalFitr' = mapMaybe toTimeObjectM
  [ (2000, 1, 8)
  , (2000, 12, 27)
  , (2001, 12, 16)
  , (2002, 12, 5)
  , (2003, 11, 25)
  , (2004, 11, 14)
  , (2005, 11, 3)
  , (2006, 10, 23)
  , (2007, 10, 13)
  , (2008, 10, 1)
  , (2009, 9, 20)
  , (2010, 9, 10)
  , (2011, 8, 30)
  , (2012, 8, 19)
  , (2013, 8, 8)
  , (2014, 7, 28)
  , (2015, 7, 17)
  , (2016, 7, 6)
  , (2017, 6, 25)
  , (2018, 6, 15)
  , (2019, 6, 4)
  , (2020, 5, 24)
  , (2021, 5, 13)
  , (2022, 5, 2)
  , (2023, 4, 21)
  , (2024, 4, 10)
  , (2025, 3, 30)
  , (2026, 3, 20)
  , (2027, 3, 9)
  , (2028, 2, 26)
  , (2029, 2, 14)
  ]

rajab :: TimeData
rajab = computedDays rajab'

rajab' :: [TimeObject]
rajab' = mapMaybe toTimeObjectM
  [ (1999, 10, 10)
  , (2000, 9, 28)
  , (2001, 9, 18)
  , (2002, 9, 8)
  , (2003, 8, 29)
  , (2004, 8, 17)
  , (2005, 8, 6)
  , (2006, 7, 26)
  , (2007, 7, 15)
  , (2008, 7, 4)
  , (2009, 6, 24)
  , (2010, 6, 13)
  , (2011, 6, 3)
  , (2012, 5, 22)
  , (2013, 5, 11)
  , (2014, 4, 30)
  , (2015, 4, 20)
  , (2016, 4, 8)
  , (2017, 3, 29)
  , (2018, 3, 18)
  , (2019, 3, 8)
  , (2020, 2, 25)
  , (2021, 2, 13)
  , (2022, 2, 2)
  , (2023, 1, 23)
  , (2024, 1, 13)
  , (2025, 1, 1)
  , (2025, 12, 21)
  , (2026, 12, 10)
  , (2027, 11, 29)
  , (2028, 11, 18)
  ]

muharram :: TimeData
muharram = computedDays muharram'

muharram' :: [TimeObject]
muharram' = mapMaybe toTimeObjectM
  [ (1998, 4, 27)
  , (1999, 4, 17)
  , (2000, 4, 6)
  , (2001, 3, 26)
  , (2002, 3, 15)
  , (2003, 4, 4)
  , (2004, 2, 21)
  , (2005, 2, 10)
  , (2006, 1, 31)
  , (2007, 1, 20)
  , (2008, 1, 10)
  , (2009, 12, 18)
  , (2010, 12, 7)
  , (2011, 11, 26)
  , (2012, 11, 15)
  , (2013, 11, 4)
  , (2014, 10, 25)
  , (2015, 10, 14)
  , (2016, 10, 2)
  , (2017, 9, 21)
  , (2018, 9, 11)
  , (2019, 8, 31)
  , (2020, 8, 20)
  , (2021, 8, 9)
  , (2022, 7, 30)
  , (2023, 7, 19)
  , (2024, 7, 7)
  , (2025, 6, 26)
  , (2026, 6, 16)
  , (2027, 6, 6)
  , (2028, 5, 25)
  ]

ramadan :: TimeData
ramadan = computedDays ramadan'

ramadan' :: [TimeObject]
ramadan' = mapMaybe toTimeObjectM
  [ (1999, 12, 9)
  , (2000, 11, 27)
  , (2001, 11, 16)
  , (2002, 11, 6)
  , (2003, 10, 26)
  , (2004, 10, 15)
  , (2005, 10, 4)
  , (2006, 9, 24)
  , (2007, 9, 13)
  , (2008, 9, 1)
  , (2009, 8, 22)
  , (2010, 8, 11)
  , (2011, 8, 1)
  , (2012, 7, 20)
  , (2013, 7, 9)
  , (2014, 6, 28)
  , (2015, 6, 18)
  , (2016, 6, 6)
  , (2017, 5, 27)
  , (2018, 5, 16)
  , (2019, 5, 6)
  , (2020, 4, 24)
  , (2021, 4, 13)
  , (2022, 4, 2)
  , (2023, 3, 23)
  , (2024, 3, 11)
  , (2025, 3, 1)
  , (2026, 2, 18)
  , (2027, 2, 8)
  , (2028, 1, 28)
  , (2029, 1, 16)
  ]

mawlid :: TimeData
mawlid = computedDays mawlid'

mawlid' :: [TimeObject]
mawlid' = mapMaybe toTimeObjectM
  [ (1999, 6, 26)
  , (2000, 6, 14)
  , (2001, 6, 4)
  , (2002, 5, 24)
  , (2003, 5, 13)
  , (2004, 5, 1)
  , (2005, 4, 21)
  , (2006, 4, 10)
  , (2007, 3, 31)
  , (2008, 3, 20)
  , (2009, 3, 9)
  , (2010, 2, 26)
  , (2011, 2, 15)
  , (2012, 2, 4)
  , (2013, 1, 24)
  , (2014, 1, 13)
  , (2015, 1, 3)
  , (2015, 12, 23)
  , (2016, 12, 11)
  , (2017, 11, 30)
  , (2018, 11, 20)
  , (2019, 11, 9)
  , (2020, 10, 29)
  , (2021, 10, 18)
  , (2022, 10, 8)
  , (2023, 9, 27)
  , (2024, 9, 15)
  , (2025, 9, 4)
  , (2026, 8, 25)
  , (2027, 8, 14)
  , (2028, 8, 3)
  ]

tuBishvat :: TimeData
tuBishvat = computedDays tuBishvat'

tuBishvat' :: [TimeObject]
tuBishvat' = mapMaybe toTimeObjectM
  [ (1950, 2, 1)
  , (1951, 1, 21)
  , (1952, 2, 10)
  , (1953, 1, 30)
  , (1954, 1, 18)
  , (1955, 2, 6)
  , (1956, 1, 27)
  , (1957, 1, 16)
  , (1958, 2, 4)
  , (1959, 1, 23)
  , (1960, 2, 12)
  , (1961, 1, 31)
  , (1962, 1, 19)
  , (1963, 2, 8)
  , (1964, 1, 28)
  , (1965, 1, 17)
  , (1966, 2, 4)
  , (1967, 1, 25)
  , (1968, 2, 13)
  , (1969, 2, 2)
  , (1970, 1, 21)
  , (1971, 2, 9)
  , (1972, 1, 30)
  , (1973, 1, 17)
  , (1974, 2, 6)
  , (1975, 1, 26)
  , (1976, 1, 16)
  , (1977, 2, 2)
  , (1978, 1, 22)
  , (1979, 2, 11)
  , (1980, 2, 1)
  , (1981, 1, 19)
  , (1982, 2, 7)
  , (1983, 1, 28)
  , (1984, 1, 18)
  , (1985, 2, 5)
  , (1986, 1, 24)
  , (1987, 2, 13)
  , (1988, 2, 2)
  , (1989, 1, 20)
  , (1990, 2, 9)
  , (1991, 1, 29)
  , (1992, 1, 19)
  , (1993, 2, 5)
  , (1994, 1, 26)
  , (1995, 1, 15)
  , (1996, 2, 4)
  , (1997, 1, 22)
  , (1998, 2, 10)
  , (1999, 1, 31)
  , (2000, 1, 21)
  , (2001, 2, 7)
  , (2002, 1, 27)
  , (2003, 1, 17)
  , (2004, 2, 6)
  , (2005, 1, 24)
  , (2006, 2, 12)
  , (2007, 2, 2)
  , (2008, 1, 21)
  , (2009, 2, 8)
  , (2010, 1, 29)
  , (2011, 1, 19)
  , (2012, 2, 7)
  , (2013, 1, 25)
  , (2014, 1, 15)
  , (2015, 2, 3)
  , (2016, 1, 24)
  , (2017, 2, 10)
  , (2018, 1, 30)
  , (2019, 1, 20)
  , (2020, 2, 9)
  , (2021, 1, 27)
  , (2022, 1, 16)
  , (2023, 2, 5)
  , (2024, 1, 24)
  , (2025, 2, 12)
  , (2026, 2, 1)
  , (2027, 1, 22)
  , (2028, 2, 11)
  , (2029, 1, 30)
  , (2030, 1, 18)
  , (2031, 2, 7)
  , (2032, 1, 27)
  , (2033, 1, 14)
  , (2034, 2, 3)
  , (2035, 1, 24)
  , (2036, 2, 12)
  , (2037, 1, 30)
  , (2038, 1, 20)
  , (2039, 2, 8)
  , (2040, 1, 29)
  , (2041, 1, 16)
  , (2042, 2, 4)
  , (2043, 1, 25)
  , (2044, 2, 12)
  , (2045, 2, 1)
  , (2046, 1, 21)
  , (2047, 2, 10)
  , (2048, 1, 29)
  , (2049, 1, 17)
  , (2050, 2, 6)
  ]

dhanteras :: TimeData
dhanteras = computedDays dhanteras'

dhanteras' :: [TimeObject]
dhanteras' = mapMaybe toTimeObjectM
  [ (2000, 10, 24)
  , (2001, 11, 12)
  , (2002, 11, 2)
  , (2003, 10, 23)
  , (2004, 11, 10)
  , (2005, 10, 30)
  , (2006, 10, 19)
  , (2007, 11, 7)
  , (2008, 10, 26)
  , (2009, 10, 15)
  , (2010, 11, 3)
  , (2011, 10, 24)
  , (2012, 11, 11)
  , (2013, 11, 1)
  , (2014, 10, 21)
  , (2015, 11, 9)
  , (2016, 10, 28)
  , (2017, 10, 17)
  , (2018, 11, 5)
  , (2019, 10, 25)
  , (2020, 11, 13)
  , (2021, 11, 2)
  , (2022, 10, 22)
  , (2023, 11, 10)
  , (2024, 10, 29)
  , (2025, 10, 18)
  , (2026, 11, 6)
  , (2027, 10, 27)
  , (2028, 10, 15)
  , (2029, 11, 4)
  , (2030, 10, 24)
  ]

navaratri :: TimeData
navaratri = computedDays navaratri'

navaratri' :: [TimeObject]
navaratri' = mapMaybe toTimeObjectM
  [ (2000, 9, 28)
  , (2001, 10, 17)
  , (2002, 10, 7)
  , (2003, 9, 26)
  , (2004, 10, 14)
  , (2005, 10, 4)
  , (2006, 9, 23)
  , (2007, 10, 12)
  , (2008, 9, 30)
  , (2009, 9, 19)
  , (2010, 10, 8)
  , (2011, 9, 28)
  , (2012, 10, 16)
  , (2013, 10, 5)
  , (2014, 9, 25)
  , (2015, 10, 13)
  , (2016, 10, 1)
  , (2017, 9, 21)
  , (2018, 10, 9)
  , (2019, 9, 29)
  , (2020, 10, 17)
  , (2021, 10, 6)
  , (2022, 9, 26)
  , (2023, 10, 15)
  , (2024, 10, 3)
  , (2025, 9, 22)
  , (2026, 10, 11)
  , (2027, 9, 30)
  , (2028, 9, 19)
  , (2029, 10, 8)
  , (2030, 9, 27)
  ]

rakshaBandhan :: TimeData
rakshaBandhan = computedDays rakshaBandhan'

rakshaBandhan' :: [TimeObject]
rakshaBandhan' = mapMaybe toTimeObjectM
  [ (2000, 8, 15)
  , (2001, 8, 4)
  , (2002, 8, 22)
  , (2003, 8, 12)
  , (2004, 8, 29)
  , (2005, 8, 19)
  , (2006, 8, 9)
  , (2007, 8, 28)
  , (2008, 8, 16)
  , (2009, 8, 5)
  , (2010, 8, 24)
  , (2011, 8, 13)
  , (2012, 8, 2)
  , (2013, 8, 20)
  , (2014, 8, 10)
  , (2015, 8, 29)
  , (2016, 8, 18)
  , (2017, 8, 7)
  , (2018, 8, 26)
  , (2019, 8, 15)
  , (2020, 8, 3)
  , (2021, 8, 22)
  , (2022, 8, 11)
  , (2023, 8, 30)
  , (2024, 8, 19)
  , (2025, 8, 9)
  , (2026, 8, 28)
  , (2027, 8, 17)
  , (2028, 8, 5)
  , (2029, 8, 23)
  , (2030, 8, 13)
  ]

thaiPongal :: TimeData
thaiPongal = computedDays thaiPongal'

thaiPongal' :: [TimeObject]
thaiPongal' = mapMaybe toTimeObjectM
  [ (2000, 1, 15)
  , (2001, 1, 14)
  , (2002, 1, 14)
  , (2003, 1, 14)
  , (2004, 1, 15)
  , (2005, 1, 14)
  , (2006, 1, 14)
  , (2007, 1, 15)
  , (2008, 1, 15)
  , (2009, 1, 14)
  , (2010, 1, 14)
  , (2011, 1, 15)
  , (2012, 1, 15)
  , (2013, 1, 14)
  , (2014, 1, 14)
  , (2015, 1, 15)
  , (2016, 1, 15)
  , (2017, 1, 14)
  , (2018, 1, 14)
  , (2019, 1, 15)
  , (2020, 1, 15)
  , (2021, 1, 14)
  , (2022, 1, 14)
  , (2023, 1, 15)
  , (2024, 1, 15)
  , (2025, 1, 14)
  , (2026, 1, 14)
  , (2027, 1, 15)
  , (2028, 1, 15)
  , (2029, 1, 14)
  , (2030, 1, 14)
  ]

thiruOnam :: TimeData
thiruOnam = computedDays thiruOnam'

thiruOnam' :: [TimeObject]
thiruOnam' = mapMaybe toTimeObjectM
  [ (2000, 9, 10)
  , (2001, 8, 31)
  , (2002, 8, 21)
  , (2003, 9, 8)
  , (2004, 8, 28)
  , (2005, 9, 15)
  , (2006, 9, 5)
  , (2007, 8, 26)
  , (2008, 9, 12)
  , (2009, 9, 2)
  , (2010, 8, 23)
  , (2011, 9, 9)
  , (2012, 8, 29)
  , (2013, 8, 20)
  , (2014, 9, 6)
  , (2015, 8, 28)
  , (2016, 9, 13)
  , (2017, 9, 4)
  , (2018, 8, 24)
  , (2019, 9, 11)
  , (2020, 8, 31)
  , (2021, 8, 21)
  , (2022, 9, 8)
  , (2023, 8, 29)
  , (2024, 9, 15)
  , (2025, 9, 5)
  , (2026, 8, 26)
  , (2027, 9, 12)
  , (2028, 9, 1)
  , (2029, 8, 22)
  , (2030, 9, 9)
  ]

vasantPanchami :: TimeData
vasantPanchami = computedDays vasantPanchami'

vasantPanchami' :: [TimeObject]
vasantPanchami' = mapMaybe toTimeObjectM
  [ (2000, 2, 10)
  , (2001, 1, 29)
  , (2002, 2, 17)
  , (2003, 2, 6)
  , (2004, 1, 26)
  , (2005, 2, 13)
  , (2006, 2, 2)
  , (2007, 1, 23)
  , (2008, 2, 11)
  , (2009, 1, 31)
  , (2010, 1, 20)
  , (2011, 2, 8)
  , (2012, 1, 28)
  , (2013, 2, 15)
  , (2014, 2, 4)
  , (2015, 1, 24)
  , (2016, 2, 12)
  , (2017, 2, 1)
  , (2018, 1, 22)
  , (2019, 2, 10)
  , (2020, 1, 29)
  , (2021, 2, 16)
  , (2022, 2, 5)
  , (2023, 1, 26)
  , (2024, 2, 14)
  , (2025, 2, 2)
  , (2026, 1, 23)
  , (2027, 2, 11)
  , (2028, 1, 31)
  , (2029, 1, 19)
  , (2030, 2, 7)
  ]