!j      !" # $ % &' ( ) *+,-./0123456789:; < = >?@A B CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu v w x y z {|}~          !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst uvwxyz{|}~                                        !"#$%&'( )*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   !!"""""##$$$- V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe'.reludeShorter alias for pure ().pass :: Maybe ()Just ();(');(')V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Unsafe* *LK+ MNPO,-)('&%$#"! . ED/CBA@?>2xy  wv356JIHGF78>?@DE_FaGHIJKLMOghiPQRSTUVWYZ[\]^jklmnrst*+,-6789:;<=Quz{|-DQGHIJKSTUVW*+,M,3OghiRj ]YZ8rstmn{|*LK+ MNPOkl-)('&%$#"! E_Fa>2xy  wvLu. ED/CBA@?>56JIHGFPQ6789:;<=7?[\@^zV(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe18 C`d. C`d.V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>None3 !qrsqrs !V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>None;<=FT;relude>Typeclass for data types that can be created from one element.one True :: [Bool][True]one 'a' :: Text"a"&one (3, "hello") :: HashMap Int StringfromList [(3,"hello")]relude(Type of single element of the structure.reludeCreate a list, map, Text, etc from a single element.%V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>None=8 !qrs (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe><=<=V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafeB&reludeRenamed version of &'. /01}~ /01}~V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafeD1qpo}|~235}|~1235qpoV(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafeIrelude Alias for  fmap . fmap%. Convenient to work with two nested 1s.negate <<$>> Just [1,2,3]Just [-1,-2,-3]444(V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafeK@1qpo}|~2345 V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafeTi relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .relude Lifted to  version of .ttV(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafeZreludeLifted version of )*. reludeLifted version of )+. reludeLifted version of ),. reludeLifted version of )-. \ is available since base-4.8, but it's more convenient to redefine it instead of using CPP.      V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe_8 reludeLifted version of ./. reludeLifted version of .0.reludeLifted version of .1.reludeLifted version of .2.reludeLifted version of 34.     V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safee5reludeLifted version of .reludeLifted version of .reludeLifted version of .reludeLifted version of .reludeLifted version of .reludeLifted version of .reludeLifted version of .reludeLifted version of .  5V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safeg%t     V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com> Trustworthyjg/{RSTUWXYZ[\]^_`abc/RSTUWXYZ[\]^_`abc{V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafemU&09NbcXef     hijklnopU&09NbchijklnopXef     V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Saferelude Similar to l but with flipped arguments.readMaybe "True" ?: FalseTruereadMaybe "Tru" ?: FalseFalsereludeSpecialized version of for_ for NC. It's used for code readability. Also helps to avoid space leaks:  Ohttp://www.snoyman.com/blog/2017/01/foldable-mapm-maybe-and-recursive-functionsFoldable.mapM_ space leak.&whenJust Nothing $ \b -> print (not b)*whenJust (Just True) $ \b -> print (not b)FalsereludeMonadic version of .reludePerforms default ; action if b) is given. Otherwise returns content of c pured to ;.!whenNothing Nothing [True, False] [True,False]%whenNothing (Just True) [True, False][True]reludePerforms default ; action if b is given. Do nothing for c. Convenient for discarding c content.+whenNothing_ Nothing $ putTextLn "Nothing!"Nothing!/whenNothing_ (Just True) $ putTextLn "Nothing!"reludeMonadic version of .reludeMonadic version of .0V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafeL relude$Shorter and more readable alias for flip runReaderT.!relude$Shorter and more readable alias for flip runReader."relude$Shorter and more readable alias for flip runStateT.#relude$Shorter and more readable alias for  flip runState.$relude Alias for flip evalStateTF. It's not shorter but sometimes more readable. Done by analogy with using* functions family.%relude Alias for flip evalStateF. It's not shorter but sometimes more readable. Done by analogy with using* functions family.&relude Alias for flip execStateTF. It's not shorter but sometimes more readable. Done by analogy with using* functions family.'relude Alias for flip execStateF. It's not shorter but sometimes more readable. Done by analogy with using* functions family. !"#$%&'! %$'&#" V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe(relude Extracts B value from N returning # if Nothing.+maybeToMonoid (Just [1,2,3] :: Maybe [Int])[1,2,3]&maybeToMonoid (Nothing :: Maybe [Int])[]-A"B#$%uvwzyx(-B#$%A"uvwzyx(V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe!)reludeLike &6 but runs in  O(n * log n) time and requires 3.ordNub [3, 3, 3, 2, 2, -1, 1] [3,2,-1,1]*reludeLike &6 but runs in O(n * log_16(n)) time and requires .hashNub [3, 3, 3, 2, 2, -1, 1] [3,2,-1,1]+reludeLike ) but also sorts a list.sortNub [3, 3, 3, 2, 2, -1, 1] [-1,1,2,3],reludeLike *< but has better performance and also doesn't save the order."unstableNub [3, 3, 3, 2, 2, -1, 1] [1,2,3,-1])*+,*)+,V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com> Trustworthy;<=VP-relude%Polymorfic over string and lifted to  printing functions.0reludeLifted version of .1reludeSpecialized to  version of . or forcing type inference.2reludeSpecialized to  version of / or forcing type inference.3reludeSpecialized to  version of . or forcing type inference.4reludeSpecialized to  version of / or forcing type inference.-./01234-./01234V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe4::4V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe;=>?AV1 :relude'Type class for lazy-strict conversions.=relude+Type class for converting other strings to .?relude+Type class for converting other strings to .Arelude+Type class for converting other strings to .Crelude9Type class for conversion to utf8 representation of text.DreludeEncode as utf8 string (usually ).$encodeUtf8 @Text @ByteString "?0B0:"*"\208\191\208\176\209\130\208\176\208\186"EreludeDecode from utf8 string.GdecodeUtf8 @Text @ByteString "\208\191\208\176\209\130\208\176\208\186""\1087\1072\1090\1072\1082"RputStrLn $ decodeUtf8 @Text @ByteString "\208\191\208\176\209\130\208\176\208\186"?0B0:FreludeLDecode as utf8 string but returning execption if byte sequence is malformed.CdecodeUtf8 @Text @ByteString "\208\208\176\209\130\208\176\208\186""\65533\1072\1090\1072\1082"IdecodeUtf8Strict @Text @ByteString "\208\208\176\209\130\208\176\208\186"\Left Cannot decode byte '\xd0': Data.Text.Internal.Encoding.decodeUtf8: Invalid UTF-8 streamGreludeType synonym for 78.HreludeType synonym for 9:.IreludePolymorhpic version of .readEither @Text @Int "123" Right 123readEither @Text @Int "aa"Left "Prelude.read: no parse"JreludeGeneralized version of &;.:<;=>?@ABCEDFGHIJKLHGCEDF=>?@AB:<;KLIJ<V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe%4::<;=>?@ABCEDFGHIJKLV(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe ^reludeMaps left part of X to N.leftToMaybe (Left True) Just TrueleftToMaybe (Right "aba")Nothing_reludeMaps right part of X to N.rightToMaybe (Left True)NothingrightToMaybe (Right "aba") Just "aba"`reludeMaps N to X wrapping default value into e.maybeToRight True (Just "aba") Right "aba"maybeToRight True Nothing Left TrueareludeMaps N to X wrapping default value into f.maybeToLeft True (Just "aba") Left "aba"maybeToLeft True Nothing Right TruebreludeApplies given action to X content if e. is given and returns the result. In case of f$ the default value will be returned.creludeApplies given action to X content if e is given.dreludeMonadic version of b.ereludeMonadic version of c.freludeApplies given action to X content if f. is given and returns the result. In case of e$ the default value will be returned.greludeApplies given action to X content if f is given.hreludeMonadic version of f.ireludeMonadic version of g.^_`abcdefghia`^_bcdefghi=V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safepr&09NbcXef     hijklnop !"#$%&'^_`abcdefghiV(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safeekrelude.For safe work with lists using functinons for .viaNonEmpty head [1]Just 1viaNonEmpty head []NothinglreludeNDestructuring list into its head and tail if possible. This function is total. uncons []Nothing uncons [1..5]Just (1,[2,3,4,5])7uncons (5 : [1..5]) >>= \(f, l) -> pure $ f == length l Just TruemreludePerforms given action over ! list if given list is non empty.+whenNotNull [] $ \(b :| _) -> print (not b)5whenNotNull [False,True] $ \(b :| _) -> print (not b)TruenreludeMonadic version of m.klmnklmn>V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe3{RSTUWXYZ[\]^_`abcklmnV(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe%>?eoreludeType that represents exceptions used in cases when a particular codepath is not meant to be ever executed, but happens to be executed anyway.qreludeaPattern synonym to easy pattern matching on exceptions. So intead of writing something like this: isNonCriticalExc :: SomeException -> Bool isNonCriticalExc e | Just (_ :: NodeAttackedError) <- fromException e = True | Just DialogUnexpected{} <- fromException e = True | otherwise = False  you can use q pattern synonym: isNonCriticalExc :: SomeException -> Bool isNonCriticalExc = case Exc (_ :: NodeAttackedError) -> True -- matching all exceptions of type NodeAttackedError3 Exc DialogUnexpected{} -> True _ -> False +This pattern is bidirectional. You can use Exc e instead of  toException e.reludeHGenerate a pure value which, when forced, will throw the given exceptionrrelude_Generate a pure value which, when forced, will synchronously throw the exception wrapped into o data type. opqr oprqV(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>None&ureludeLifted alias for  with clearer name.vreludeLike  evaluateWNHF but discards value.wrelude Alias for evaluateWHNF . force with clearer name.xrelude Alias for evaluateWHNF . rnf . Similar to w but discards resulting value. uvwx wxuvV(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe LyreludeMonadic version of .+whenM (pure False) $ putTextLn "No text :(",whenM (pure True) $ putTextLn "Yes text :)" Yes text :)whenM (Just True) (pure ())Just ()whenM (Just False) (pure ())Just ()whenM Nothing (pure ())NothingzreludeMonadic version of .-unlessM (pure False) $ putTextLn "No text :(" No text :(-unlessM (pure True) $ putTextLn "Yes text :)"{reludeMonadic version of  if-then-else.@ifM (pure True) (putTextLn "True text") (putTextLn "False text") True text|reludeMonadic version of @. Occasionally useful. Here some complex but real-life example: findSomePath :: IO (Maybe FilePath) somePath :: MaybeT IO FilePath somePath = do path <- MaybeT findSomePath guardM $ liftIO $ doesDirectoryExist path return path yz{||{zy?V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe C`d.yz{|V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>None ,-FSTV2k relude Similar to 1 but takes a function with its arguments flipped."flipfoldl' (/) 5 [2,3] :: Rational15 % 2reludePolymorphic version of  concatMapA function.+foldMapA @[Int] (Just . replicate 3) [1..3]Just [1,1,1,2,2,2,3,3,3]reludePolymorphic version of  concatMapM function.+foldMapM @[Int] (Just . replicate 3) [1..3]Just [1,1,1,2,2,2,3,3,3]reludeStricter version of . sum [1..10]55reludeStricter version of .product [1..10]3628800reludeLike  but doesn't work on  and  for performance reasons.elem 'x' ("abc" :: String)False!elem False (one True :: Set Bool) ...D " Do not use 'elem' and 'notElem' methods from 'Foldable' on Set Suggestions: Instead of< elem :: (Foldable t, Eq a) => a -> t a -> Bool use# member :: ??? -- TODO... Instead of? notElem :: (Foldable t, Eq a) => a -> t a -> Bool use& notMember :: ??? -- TODO...reludeLike  but doesn't work on  and  for performance reasons.notElem 'x' ("abc" :: String)True$notElem False (one True :: Set Bool) ...D " Do not use 'elem' and 'notElem' methods from 'Foldable' on Set Suggestions: Instead of< elem :: (Foldable t, Eq a) => a -> t a -> Bool use# member :: ??? -- TODO... Instead of? notElem :: (Foldable t, Eq a) => a -> t a -> Bool use& notMember :: ??? -- TODO...reludeMonadic version of .andM [Just True, Just False] Just FalseandM [Just True] Just True%andM [Just True, Just False, Nothing] Just FalseandM [Just True, Nothing]NothingZandM [putTextLn "1" >> pure True, putTextLn "2" >> pure False, putTextLn "3" >> pure True]12FalsereludeMonadic version of .orM [Just True, Just False] Just TrueorM [Just True, Nothing] Just TrueorM [Nothing, Just True]NothingreludeMonadic version of .,allM (readMaybe >=> pure . even) ["6", "10"] Just True-allM (readMaybe >=> pure . even) ["5", "aba"] Just False.allM (readMaybe >=> pure . even) ["aba", "10"]NothingreludeMonadic version of .,anyM (readMaybe >=> pure . even) ["5", "10"] Just True.anyM (readMaybe >=> pure . even) ["10", "aba"] Just True.anyM (readMaybe >=> pure . even) ["aba", "10"]Nothing }~ ~}@(c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>None3,<=}~(c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>NoneFTBreludeModifiable Map.reludeWRead-only map or set. Contains polymorphic functions which work for both sets and maps.reludeOperator version of  function.relude Inverse of  function.reludexReturn the value to which the specified key is mapped, or the default value if this map contains no mapping for the key.relude:Converts the structure to the list of the key-value pairs.7toPairs (HashMap.fromList [('a', "xxx"), ('b', "yyy")])[('a',"xxx"),('b',"yyy")]relude/Converts the structure to the list of the keys.4keys (HashMap.fromList [('a', "xxx"), ('b', "yyy")])"ab"relude1Converts the structure to the list of the values.5elems (HashMap.fromList [('a', "xxx"), ('b', "yyy")]) ["xxx","yyy"]reludeDefault value to return.relude Key to searchreludeContainer to search9 V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com> Trustworthy ,-16FQVL* relude Similar to  but data type.relude#Generalized over string version of AB that leaves warnings.relude that takes  as an argument.relude Version of AC that leaves warning.relude Version of AC that leaves warning.relude Version of AD that leaves warning.relude Version of AE that leaves warning and takes .relude Version of AF that leaves warning and takes .relude, that leaves warning in code on every usage.  GV(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com> TrustworthyNh  !&*LK+ MNPO,-)('&%$#"! . ED/CBA@?>012xy  wv3456JIHGF789:;(')<=>?@A"B#$%C`dDE_FaGHIJKLMNbcOghiPQRSTUVWXefYZ[\]^jklmnqporstuvwzyx{}|~     *+,-./0123456789:;<=QRSTUWXYZ[\]^_`abchijklnopqrstuz{|}~      !"#$%&'()*+,-./01234:<;=>?@ABCEDFGHIJKL^_`abcdefghiklmnopqruvwxyz{|}~ (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafeVcreludeUnwraps value from newtype.%newtype Size = Size Int deriving Showun @Int (Size 5)5%un (Size 5) == length ['a', 'x', 'b']FalsereludeWraps value to newtype. Behaves exactly as I but has more meaningnful name in case you need to convert some value to newtype.,newtype Flag = Flag Bool deriving (Show, Eq)wrap False == Flag TrueFalserelude#Applies function to the content of newtype.. This function is not supposed to be used on newtype7s that are created with the help of smart constructors.$newtype Foo = Foo Bool deriving Showunder not (Foo True) Foo False&newtype Bar = Bar String deriving Show'under (filter (== 'a')) (Bar "abacaba") Bar "aaaa"!(c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>NoneFTVirelude<Groups elements using results of the given function as keys.2groupBy even [1..6] :: HashMap Bool (NonEmpty Int)/fromList [(False,5 :| [3,1]),(True,6 :| [4,2])]relude Similar to % but keeps only one element as value.,groupOneBy even [1 .. 6] :: HashMap Bool IntfromList [(False,1),(True,2)]"(c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>SafeVi}reludeReturns all values of some * + in ascending order.Edata TrafficLight = Red | Blue | Green deriving (Show, Enum, Bounded)universe :: [TrafficLight][Red,Blue,Green]universe :: [Bool] [False,True]relude inverseMap f< creates a function that is the inverse of a given function f. It does so by constructing  for every value f a). The implementation makes sure that the 9 is constructed only once and then shared for every call.-The complexity of reversed mapping though is \mathcal{O}(\log n).Usually you want to use  to inverse J function.>data Color = Red | Green | Blue deriving (Show, Enum, Bounded)0parse = inverseMap show :: String -> Maybe Color parse "Red"Just Red parse "Black"NothingreludeLike P, but doesn't fail on K. Instead it returns L. next FalseTrue next TrueFalse succ True3*** Exception: Prelude.Enum.Bool.succ: bad argumentreludeLike O, but doesn't fail on L. Instead it returns K. prec FalseTrue prec TrueFalse pred False3*** Exception: Prelude.Enum.Bool.pred: bad argumentreludeReturns b if given G outside range.safeToEnum @Bool 0 Just FalsesafeToEnum @Bool 1 Just TruesafeToEnum @Bool 2NothingsafeToEnum @Bool (-1)Nothing#(c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe,reludedThis function returns the name of its caller function, but it requires that the caller function has # constraint. Otherwise, it returns " unknown".,foo :: HasCallStack => String; foo = ownNamefoo"foo"(bar :: HasCallStack => String; bar = foobar"foo"reludeThis function returns the name of its caller of the caller function, but it requires that the caller function and caller of the caller function have # constraint. Otherwise, it returns " unkown". It's useful for logging:Qlog :: HasCallStack => String -> IO (); log s = putStrLn $ callerName ++ ":" ++ sggreeting :: HasCallStack => IO (); greeting = log "Starting..." >> putStrLn "Hello!" >> log "Ending..."greetinggreeting:Starting...Hello!greeting:Ending...$(c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Safe*relude0Fmaps functions for nested bifunctor. Short for fmap (bimap f g).,bimapF not length $ Just (False, ['a', 'b']) Just (True,2)relude Short for  fmap . first.%firstF not $ Just (False, ['a', 'b'])Just (True,"ab")relude Short for  fmap . second.*secondF length $ Just (False, ['a', 'b'])Just (False,2)V(c) 2016 Stephen Diehl (c) 20016-2018 Serokell (c) 2018 KowainikMITKowainik <xrom.xkov@gmail.com>Unsafe.relude Similar to V but with flipped arguments.VdefgmVdefgmHIJKLMHNOHNPHQRHQSHITHIUHIVKLWHXYHXZH[\H]^H]_H]`H]aKbcKbdHXeHIfHIgHIhHIiHjkHlmH[nH[oH[pH[qHrsHtuHtvHtwHIxHIyHIzHI{HI|HI}HI~HIH]H]KbHH[H[HIHIHXKbHH[H[HHHjHlHIHHHHHHIHIKKKKKHHHHHHIKH[H[KKHHHHHKKKHKHKKKHIHIKHHKKKHH]H]HIHIHHHHHHHHHHHHHtHHHHHHHHHHHHHHHrHrHrHrHrHrHrHrHrHrHrHrHHHHHHH H  H  H  H  HHHHH3HHHHHHHHHH H!"H#$H%&H%'H%(H%)H%*H%+H%,H-.H-/H-/H0H1H2H3H4H5H6H7H8H9H:H;H<H=H>H?H@HAHBHCHDHEHFGHFHHFHHFIHFJHFJHKLHKMHKNHKOHKOHKPHKQHKQHKRHKSHKSHKTHKUHKUHKVHKWHKWHKXHKYHKYHKZHK[HK[H\H]H^H^H_`H_aH_bH_cH_dH_eH_fH_gH_hH_iH_jH_kH_lH_mH_nH_oH_pH_qHrsHrtHuHvHwHxHyHzH{H|H}~H}H}HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H[H]H]H]H]H]H]HHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHHHHHHHHHHQHQHQHHXHXHXHXHXHHIHIHIHIHIHI'HIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIH%(HH HK Kb Kb Kb KbKbKbKbKbKbKb8 !"#$"#%"#&"#'"#()*+)*,-./-.0-12-1345645745845945:45;45<4=>4=?4=@4=A4=B-CD-CD-CE-FG-FG-FH-FI-FJ-FK-FL-MN-MN-MO-MP-MQ-MR-MS-MT-MU-MVWXYZ.[Z.\Z.]Z.^Z_`Z_aZb:ZcdZceZcfZcgZch-ij-ik-il-im-imnopnqr stuvwxyz{|}~            *+,-/0124         ;      !"##B$C%DEF&'()*+,-. / 0 1!2!3"4"5"6"7"8#9#:$;$<$=>HHHHH?HHHHHHHH)-H!H!H!H@H@H@H@H@H3ZA:HrBH#CHHHHHD$HD&E#relude-0.2.0-BHP0MZwhE9sFixVgqKn0hrRelude.List.Reexport Relude.BaseRelude.Container.ReexportRelude.Bool.ReexportRelude.FunctionRelude.Monad.ReexportRelude.Functor.ReexportRelude.String.Reexport Relude.MonoidRelude.ApplicativeRelude.Foldable.ReexportRelude.Lifted.ConcurrentRelude.Lifted.IORefRelude.ExceptionRelude.Monad.EitherRelude.Functor.Fmap Relude.UnsafeRelude.DeepSeqRelude.Container.OneRelude.Lifted.ExitRelude.Lifted.FileRelude.Monad.MaybeRelude.Monad.Trans Relude.Nub Relude.PrintRelude.String.ConversionRelude.List.NonEmptyRelude.Bool.GuardRelude.Foldable.FoldRelude.Extra.Map Relude.DebugRelude.Extra.NewtypeRelude.Extra.GroupRelude.Extra.EnumRelude.Extra.CallStackRelude.Extra.BifunctorRelude.ContainerPreludeidRelude.Functor System.ExitexitWith exitFailure exitSuccessdie Data.Text appendFilegetLinereadFile writeFile System.IOopenFile Relude.LiftednubData.ByteString.Lazy ByteStringData.Text.LazyTextshow Relude.String Relude.Monad Relude.List Relude.BoolRelude.Foldable Debug.Tracetrace traceShow traceShowMtraceMtraceIdReludebaseGHC.Base++ghc-primGHC.PrimseqGHC.Listfilterzip Data.Tuplefstsnd otherwisemap$coerceGHC.Num fromInteger-GHC.Real fromRationalGHC.EnumenumFrom enumFromThen enumFromToenumFromThenTo GHC.Classes==>=negate>>=>>fmapreturnControl.Monad.Failfail Data.String fromString fromIntegral realToFrac toInteger toRational Control.MonadguardGHC.ExtsIsListfromList fromListN<>memptymappendmconcatjoin<*>pure*>BoundedEnumEq GHC.FloatFloating FractionalIntegralMonadFunctorNumOrdGHC.ReadReadRealRealFracGHC.ShowShowData.Typeable.InternalTypeable MonadFailIsString Applicative Data.FoldableFoldableData.Traversable Traversable GHC.GenericsGeneric GHC.TypeNatsKnownNatGHC.OverloadedLabelsIsLabel SemigroupMonoid GHC.TypesBoolCharDoubleFloatIntGHC.IntInt8Int16Int32Int64 integer-gmpGHC.Integer.TypeInteger GHC.NaturalNaturalMaybeOrderingRatioRationalIOWordGHC.WordWord8Word16Word32Word64 Data.EitherEitherType ConstraintNatCmpNat CoercibleGHC.Stack.Types CallStackD#FalseF#NothingJustTrueLeftRightLTEQGTGHC.IO.Handle.TypesHandleboundedEnumFromThenboundedEnumFrommaxIntminIntData.Functor.Compose getComposeCompose Data.VoidvacuousabsurdVoidData.Semigroup mtimesDefaultcycle1 WrappedMonoid getOptionOptionsortWithData.Bifunctorsecondfirstbimap BifunctorData.List.NonEmptyinitlasttailheadnonEmptyGHC.ExecutionStackshowStackTrace getStackTraceControl.Monad.IO.ClassliftIOMonadIO fromLabelmfilter<$!>unless replicateM_ replicateM zipWithM_zipWithM mapAndUnzipMforever<=<>=>filterM mapAccumR mapAccumLforMsequencemapM sequenceAtraverseControl.Applicativeoptional getZipListZipList Control.Arrow&&&Data.Functor.Identity runIdentityIdentitywithFileGHC.IO.Handle.FDstderrstdin GHC.StackwithFrozenCallStack callStack GHC.Conc.Sync writeTVarreadTVarnewTVarSTMTVarstdout GHC.IORefIORefGHC.IOFilePath GHC.ExceptionprettyCallStack prettySrcLoc SomeExceptiondisplayException fromException toException ExceptionData.Functor.ConstgetConstConstfindallanyorand concatMapconcatasum sequence_ sequenceA_forM_mapM_for_ traverse_foldlMlengthnulltoListfoldl'foldrfoldMapfold Data.MonoidgetFirstFirstgetLastLastData.Semigroup.Internal stimesMonoidstimesIdempotentgetDualDualappEndoEndogetAllAllgetAnyAnygetSumSum getProductProductgetAltAlt someNatValnatValSomeNat Data.OldListunfoldrsortOnsortBysort permutations subsequencestailsinitsgroupgenericReplicategenericSplitAt genericDrop genericTake genericLength transpose intercalate intersperse isPrefixOf Text.Read readMaybereads fromRightfromLeftisRightisLeftpartitionEithersrightsleftseitherData.Ord comparingDown Data.ProxyProxy GHC.IO.IOMode ReadWriteMode AppendMode WriteModeReadModeIOModeatanhacoshasinhtanhcoshsinhatanacosasintancossinlogBase**sqrtexppi byteSwap64 byteSwap32 byteSwap16 Data.Bitsxor Data.Boolbool Data.Function&onfix Data.Functorvoid$><&><$>lcmgcd^^^oddeven denominator numeratordivModquotRemmoddivremquotrecip/floorceilingroundtruncateproperFractionmaxBoundminBoundfromEnumtoEnumpredsuccGHC.Charchrunzip3unzipzipWithzip3!!reversebreaksplitAtdroptake dropWhile takeWhilecycle replicaterepeatiteratescanrscanl Data.MaybemapMaybe catMaybes listToMaybe maybeToList fromMaybefromJust isNothingisJustmaybeswapuncurrycurryGHC.MVarMVarsubtractsignumabs*+ GHC.Stack.CCScurrentCallStackasTypeOf$!flip.constordwhen=<<liftA3<**>stimessconcat<$<*liftA2manysome<|>empty Alternativemplusmzero MonadPlus:|NonEmptyString getCallStack HasCallStackstimesIdempotentMonoid/=compare<=&&||not<>maxminbytestring-0.10.8.2Data.ByteString.Internalcontainers-0.5.11.0Data.IntMap.InternalIntMapData.IntSet.InternalIntSetData.Map.InternalMapData.Sequence.InternalSeqData.Set.InternalSetdeepseq-1.4.3.0Control.DeepSeqforce$!!deepseqrnfNFData&hashable-1.2.7.0-Q2TKVDwk4GBEHmizb4teZData.Hashable.Class hashWithSaltHashabletransformers-0.5.5.0Control.Monad.Trans.Classlift MonadTransControl.Monad.Trans.Identity runIdentityT IdentityT mtl-2.2.2Control.Monad.State.Classgetsmodify'modifystateputget MonadStateControl.Monad.Reader.Classasksreaderlocalask MonadReaderControl.Monad.Trans.ExceptExceptT runExceptTControl.Monad.Trans.ReaderReaderT runReaderTReader runReader withReader withReaderT Control.Monad.Trans.State.StrictStateT runStateTStaterunState evalState execState withState evalStateT execStateT stm-2.4.5.0Control.Concurrent.STM.TVar modifyTVar' text-1.2.3.0unwordsunlineslineswordsData.Text.Encoding decodeUtf8'decodeUtf8WithData.Text.InternalData.Text.Encoding.Error lenientDecode strictDecodeOnError OnDecodeErrorUnicodeExceptionControl.Monad.Trans.MaybeexceptToMaybeTmaybeToExceptT runMaybeTMaybeT3unordered-containers-0.2.9.0-HQtYJEH7265DslRAJ09vVD Data.HashSetHashSetData.HashMap.BaseHashMappassOneOneItemone $fOneIntSet $fOneHashSet$fOneSet $fOneIntMap $fOneHashMap$fOneMap$fOneByteString$fOneByteString0 $fOneText $fOneText0$fOneSeq $fOneNonEmpty$fOne[]identity<<$>> newEmptyMVarnewMVarputMVarreadMVarswapMVartakeMVar tryPutMVar tryReadMVar tryTakeMVar atomically newTVarIO readTVarIOnewIORef readIORef writeIORef modifyIORef modifyIORef'atomicModifyIORefatomicModifyIORef'atomicWriteIORef?:whenJust whenJustM whenNothing whenNothing_ whenNothingM whenNothingM_ usingReaderT usingReader usingStateT usingStateevaluatingStateTevaluatingStateexecutingStateTexecutingState maybeToMonoidordNubhashNubsortNub unstableNubPrintputStrputStrLnprintputText putTextLnputLText putLTextLn $fPrint[]$fPrintByteString$fPrintByteString0 $fPrintText $fPrintText0 LazyStricttoLazytoStrictToStringtoStringToLTexttoLTextToTexttoText ConvertUtf8 encodeUtf8 decodeUtf8decodeUtf8Strict LByteStringLText readEitherfromLazy fromStrict$fConvertUtf8TextByteString$fConvertUtf8TextByteString0$fConvertUtf8[]ByteString$fConvertUtf8TextByteString1$fConvertUtf8TextByteString2$fConvertUtf8[]ByteString0 $fToTextText $fToTextText0 $fToText[] $fToLTextText$fToLTextText0 $fToLText[]$fToStringText$fToStringText0 $fToString[]$fLazyStrictTextText $fLazyStrictByteStringByteString leftToMaybe rightToMaybe maybeToRight maybeToLeftwhenLeft whenLeft_ whenLeftM whenLeftM_ whenRight whenRight_ whenRightM whenRightM_$fMonadFailEither viaNonEmptyuncons whenNotNull whenNotNullMBugExcbug$fExceptionBug $fShowBug evaluateWHNF evaluateWHNF_ evaluateNF evaluateNF_whenMunlessMifMguardMElemErrorMessage DisallowElem flipfoldl'foldMapAfoldMapMsumproductelemnotElemandMorMallManyM DynamicMapinsert insertWithdeletealter StaticMapKeyValsizelookupmember!? notMember lookupDefaulttoPairskeyselems$fStaticMapIntSet$fStaticMapHashSet$fStaticMapSet$fStaticMapIntMap$fStaticMapHashMap$fStaticMapMap$fDynamicMapIntMap$fDynamicMapHashMap$fDynamicMapMap Undefinederror traceShowId undefined $fEqUndefined$fOrdUndefined$fShowUndefined$fReadUndefined$fEnumUndefined$fBoundedUndefined$fDataUndefined$fGenericUndefinedunwrapundergroupBy groupOneByuniverse inverseMapnextprec safeToEnumownName callerNamebimapFfirstFsecondFatControl.Concurrent.MVar Data.IORefData.Text.Internal.Lazy impureThrowevaluateGHC.Err