úÎ!Żń¤—‘      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ „…†‡ˆ‰Š‹ŒŽ  Trustworthy* ‘simpleType alias for ’simpleCreates a 200 (OK) “/ with the given content-type and resposne body”simple6Helper to make responses with content-type "text/html"simpleCreates a 200 (OK) “; with content-type "text/html" and the given resposne body simpleCreates a 200 (OK) “B with content-type "application/json" and the given resposne body simpleCreates a 200 (OK) “A with content-type "application/xml" and the given resposne body simple.Given a URL returns a 301 (Moved Permanently) “ redirecting to that URL. simple&Given a URL returns a 303 (See Other) “ redirecting to that URL. simpleReturns a 400 (Bad Request) “.simple'Returns a 401 (Authorization Required) “4 requiring basic authentication in the given realm.simpleReturns a 403 (Forbidden) “.simpleReturns a 404 (Not Found) “.simpleReturns a 500 (Server Error) “.     Trustworthy 2=?@AHV@<simpleLike • , but with m as the underlying monadsimpleLike • , but with m as the underlying monadsimple?The class of types into which query parameters may be convertedsimpleUThe ControllerT Monad is both a State-like monad which, when run, computes either a “h or a result. Within the ControllerT Monad, the remainder of the computation can be short-circuited by ! ing with a “.simpleExtract the requestsimple,Modify the request for the given computationsimple&Extract the application-specific state simpleConvert the controller into an •!simpleProvide a response respond r >>= f === respond r"simple#Lift an application to a controller#simple!Matches on the hostname from the –,. The route only succeeds on exact matches.$simpleMatches if the path is empty.!Note that this route checks that —] is empty, so it works as expected in nested contexts that have popped components from the — list.%simple)Matches on the HTTP request method (e.g. ˜, ™, š)&simpleFMatches if the request's Content-Type exactly matches the given string'simplelRoutes the given URL pattern. Patterns can include directories as well as variable patterns (prefixed with :) to be added to › (see )) /posts/:id/posts/:id/new/:date/posts/:category/new(simple=Matches if the first directory in the path matches the given  ByteString)simple5Always matches if there is at least one directory in — but and adds a parameter to ›] where the key is the first parameter and the value is the directory consumed from the path.*simpleKLooks up the parameter name in the request's query string and returns the  Parseable value or œ.AFor example, for a request with query string: "?foo=bar&baz=7", queryParam "foo" would return  Just "bar", but queryParam "zap" would return Nothing.+simpleLike *:, but throws an exception if the parameter is not present.,simple0Selects all values with the given parameter name-simpleLike *1, but further processes the parameter value with read4. If that conversion fails, an exception is thrown..simpleLike -:, but throws an exception if the parameter is not present./simpleLike ,2, but further processes the parameter values with read8. If any read-conversion fails, an exception is thrown.1simple1Returns the value of the given request header or œ+ if it is not present in the HTTP request.2simple\Redirect back to the referer. If the referer header is not present redirect to root (i.e., /).3simpleZRedirect back to the referer. If the referer header is not present fallback on the given “.*simpleParameter name-simpleParameter name.simpleParameter name/simpleParameter name3simpleFallback response& !"#$%&'()*+,-./01234567& !"#$%&'()*+,-./01234567 TrustworthyGpsimple Helper methodHsimple/Matches the GET method on the given URL patternIsimple0Matches the POST method on the given URL patternJsimple/Matches the PUT method on the given URL patternKsimple1Matches the PATCH method on the given URL patternLsimple2Matches the DELETE method on the given URL patternMsimple3Matches the OPTIONS method on the given URL patternHIJKLMHIJKLM Trustworthy=?wčNsimpleTThe Controller Monad is both a State-like monad which, when run, computes either a “g or a result. Within the Controller Monad, the remainder of the computation can be short-circuited by U ing with a “.PsimpleExtract the requestQsimple,Modify the request for the given computationRsimple&Extract the application-specific stateTsimpleConvert the controller into an •UsimpleProvide a response respond r >>= f === respond rVsimple!Matches on the hostname from the –,. The route only succeeds on exact matches.WsimpleMatches if the path is empty.!Note that this route checks that —] is empty, so it works as expected in nested contexts that have popped components from the — list.Xsimple)Matches on the HTTP request method (e.g. ˜, ™, š)YsimpleFMatches if the request's Content-Type exactly matches the given stringZsimplelRoutes the given URL pattern. Patterns can include directories as well as variable patterns (prefixed with :) to be added to › (see \) /posts/:id/posts/:id/new/:date/posts/:category/new[simple=Matches if the first directory in the path matches the given  ByteString\simple5Always matches if there is at least one directory in — but and adds a parameter to ›] where the key is the first parameter and the value is the directory consumed from the path.]simpleKLooks up the parameter name in the request's query string and returns the  Parseable value or œ.AFor example, for a request with query string: "?foo=bar&baz=7", queryParam "foo" would return  Just "bar", but queryParam "zap" would return Nothing.^simpleLike ]:, but throws an exception if the parameter is not present._simple0Selects all values with the given parameter name`simpleLike ]1, but further processes the parameter value with read4. If that conversion fails, an exception is thrown.asimpleLike `:, but throws an exception if the parameter is not present.bsimpleLike _2, but further processes the parameter values with read8. If any read-conversion fails, an exception is thrown.csimple?Parses a HTML form from the request body. It returns a list of žs as well as a list of Ÿ)s, which are pairs mapping the name of a file form field to a  ? pointing to a temporary file with the contents of the upload. ˙2 myControllerT = do (prms, files) <- parseForm let mPicFile = lookup "profile_pic" files case mPicFile of Just (picFile) -> do sourceFile (fileContent picFile) $$ sinkFile ("images/" ++ (fileName picFile)) respond $ redirectTo "/" Nothing -> redirectBack dsimple/Reads and returns the body of the HTTP request.esimple1Returns the value of the given request header or œ+ if it is not present in the HTTP request.fsimple\Redirect back to the referer. If the referer header is not present redirect to root (i.e., /).gsimpleZRedirect back to the referer. If the referer header is not present fallback on the given “.]simpleParameter name`simpleParameter nameasimpleParameter namebsimpleParameter namegsimpleFallback responseNOPQRSTUVWXYZ[\]^_`abcdefgNTRSPQUeVWXYZ[\]^_`abcfgdOSafeyhijkhijkNone…nlsimpleAn l authenticates a –# and, if successful, forwards the – to the  Routeable.msimpleAn lV that uses HTTP basic authentication to authenticate a request in a particular realm.nsimple Wraps an lg to take a simpler authentication function (that just just takes a username and password, and returns Ą or ˘+). It also adds an "X-User" header to the –Y with the authenticated user's name (the first argument to the authentication function).osimpleA Route“ that uses HTTP basic authentication to authenticate a request for a realm with the given username ans password. The request is rewritten with an 'X-User'O header containing the authenticated username before being passed to the next Route.osimpleRealmsimpleUsernamesimplePasswordlmnolmon Trustworthy=?ŠO Łsimple5Monad used to encode a REST controller incrementally.qsimple&Type used to encode a REST controller.¤simpleDefault state, returns 404 for all verbs.|simpleGET /}simplePOST /~simple GET /:id/editsimpleGET /new€simpleGET /:idsimplePUT /:id‚simple DELETE /:idpqrstuvwxyz{|}~€‚qrstuvwxypz{|€}‚~ None‹%ƒƒ  Trustworthy‹]ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł•´ľ–śˇ¸šşťź˝ž—›żŔÁÂÓÄĹĆÇČÉĘËĚÍ NOPQRSTUVWXYZ[\]^_`abcdefghijkƒ Trustworthy8@AŁó …simple˙ The layout to use by default. Layouts are just templates that embed views. They are rendered with the a global object containing the rendered view in the "yield" field, and the object the view was rendered with in the "page" field. By default, no template is used.†simple*The directory to look for views passed to . This defaults to "views", so render "index.html.tmpl" ... 9will look for a view template in "views/index.html.tmpl".‡simpleHA map of pure functions that can be called from within a template. See  and  for details.ˆsimple@Function to use to get a template. By default, it looks in the †Œ for the given file name and compiles the file into a template. This can be overriden to, for example, cache compiled templates in memory.‰simpleThe Î… passed to a layout given the rendered view template and the value originally passed to the view template. By default, produces an Îm with "yield", containing the rendered view, and "page", containing the value originally passed to the view.‹simple;Render a view using the layout named by the first argument.ŒsimpleSame as ‹# but uses already compiled layouts.simpleiRenders a view template with the default layout and a global used to evaluate variables in the template.ŽsimpleSame as  but without a template.simpleTemplate to rendersimpleAeson Î to pass to the templateŽsimpleTemplate to rendersimpleAeson Î to pass to the template„…†‡ˆ‰Š‹ŒŽ„…†‡ˆ‰Ž‹ŒŠĎ   !"#$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ'()*+,-/0123456789:;[\=>?]^_`abcdeffghijklmnopqrstuX vwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ˆŒˆ‰Žˆ‰‘’‘“‘”ˆ‰•–—˜™š›œš›š›žŸ ĄŸ ˘Ł¤ˆŒĽˆŒŚˆŒ§ˆŒ¨ˆŒŠˆŒŞˆŒŤˆŒŹˆŒ­ˆŒŽˆŒŻˆŒ°ˆŒąˆŒ˛ˆŒłˆŒ´ˆ‰ľˆ‰śˆ‰ˇˆ‰¸ˆ‰šˆ‰şˆ‰ťˆ‰źˆ‰˝ˆ‰žˆ‰żˆ‰Ŕˆ‰Áˆ‰Âˆ‰Ăˆ‰Ĉ‰ň‰ƈ‰Lj‰Ȉ‰Ȉ‰Éˆ‰Ęˆ‰Ëˆ‰ĚÍÎĎĐ$simple-0.11.3-JKEn4jtTkEo2o4ahV4IcJOWeb.Simple.TemplatesWeb.Simple.ResponsesWeb.Simple.Controller.Trans Web.FrankWeb.Simple.ControllerWeb.Simple.Controller.ExceptionWeb.Simple.AuthWeb.RESTWeb.Simple.Static Web.Simple4unordered-containers-0.2.10.0-LgoTL3wbBEY5bZIDJiyxW4Data.HashMap.Strict.BasefromList.simple-templates-0.9.0.0-FpKL01I0iQ8hQgyelNZSJWeb.Simple.Templates.TypescallFunction toFunction ToFunction FunctionMapokokHtmlokJsonokXmlmovedTo redirectTo badRequestrequireBasicAuth forbiddennotFound serverErrorControllerExceptionSimpleMiddlewareSimpleApplication Parseableparse ControllerT runController hoistEitherrequest localRequestcontrollerStateputState controllerApprespondfromApp routeHostrouteTop routeMethod routeAccept routePattern routeNamerouteVar queryParam queryParam' queryParamsreadQueryParamreadQueryParam'readQueryParamsreadParamValue requestHeader redirectBackredirectBackOrguardguardMguardReqerr$fMonadBaseControlmControllerT$fMonadBasemControllerT$fMonadIOControllerT$fMonadReaderRequestControllerT$fMonadStatesControllerT$fMonadTransControllerT$fMonadPlusControllerT$fAlternativeControllerT$fMonadControllerT$fApplicativeControllerT$fFunctorControllerT$fParseableText $fParseable[]$fParseableByteString$fExceptionControllerException$fShowControllerExceptiongetpostputpatchdeleteoptions Controller parseFormbody onExceptionfinallybrackethandle AuthRouterbasicAuthRouteauthRewriteReq basicAuthRESTControllerREST restIndexrestShow restCreate restUpdate restDeleterestEditrestNewrest routeRESTindexcreateeditnewshowupdate serveStatic HasTemplates defaultLayout viewDirectory functionMap getTemplate layoutObjectdefaultLayoutObject renderLayoutrenderLayoutTmplrender renderPlaindefaultGetTemplatedefaultFunctionMap ContentTypebytestring-0.10.8.2Data.ByteString.Internal ByteString"wai-3.2.2.1-IpuKsiQfaVgAI2QqHD9LGdNetwork.Wai.InternalResponsemkHtmlResponse Network.Wai ApplicationRequestpathInfo(http-types-0.12.3-E5KSR7WXSnOHFYucAejn4UNetwork.HTTP.Types.MethodGETPOSTPUT queryStringbase GHC.MaybeNothing frankMethod'wai-extra-3.0.27-91Dw2PUIprj6n56GZ6gVaRNetwork.Wai.ParseParamFileFileInfoghc-prim GHC.TypesTrueFalseRESTControllerM defaultRESTlazyRequestBodystrictRequestBody ifRequestmodifyResponsedefaultRequestmapResponseStatusmapResponseHeadersresponseToStreamresponseHeadersresponseStatus responseRawresponseStream responseLBSresponseBuilder responseFile MiddlewaregetRequestBodyChunkvaultrequestHeaders requestBody requestMethod httpVersion rawPathInforawQueryStringisSecure remoteHostrequestBodyLengthrequestHeaderHostrequestHeaderRangerequestHeaderRefererrequestHeaderUserAgent StreamingBodyRequestBodyLength ChunkedBody KnownLengthFilePartfilePartOffsetfilePartByteCountfilePartFileSizeResponseReceived$aeson-1.4.4.0-HB9k66vrv0B9uTdwqdDf8TData.Aeson.Types.InternalValue