!l      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~            None"#2=>?@AEHMSUVWXe !"None"#2=>?@AEHMSUVWXsnapXAppConfig contains the config options for command line arguments in snaplet-based apps.snap.Command line options for snaplet applications.snaprCalls snap-server's extendedCommandLineConfig to add snaplet options to the built-in server command line options.None"#2=>?@AEHMSUVWX #$%&'()*+,-.None"#2=>?@AEHMSUVWX/0123456None"#2=>?@AEHMSUVWX 789:;<=>?@None"#2=>?@AEHMSTUVWX{,snapAn opaque data type holding internal snaplet configuration data. It is exported publicly because the getOpaqueConfig function in MonadSnaplet makes implementing new instances of MonadSnaplet more convenient.AsnapHolds the actual route pattern passed to addRoutes for the current handler. Nothing during initialization and before route dispatech.BsnapThis is the universal reload action for the top-level site. We can't update this in place to be a reloader for each individual snaplet because individual snaplets can't be reloaded in isolation without losing effects that subsequent hooks may have had.snapSnaplet's type parameter sE here is user-defined and can be any Haskell type. A value of type  Snaplet s countains a couple of things:a value of type s, called the "user state".some bookkeeping data the framework uses to plug things together, like the snaplet's configuration, the snaplet's root directory on the filesystem, the snaplet's root URL, and so on.CsnapjSee the _reloader comment for why we have to use this to reload single snaplets in isolation. This action won't actually run the initializer at all. It will only modify the existing state. It is the responsibility of the snaplet author to avoid using this in situations where it will destroy data in its state that was created by subsequent hook actions.Dsnap1Joins a reversed list of directories into a path.Esnap1Joins a reversed list of directories into a path. snap%Monad used for initializing snaplets.FsnapTWrapper around IO actions that modify state elements created during initialization. snapvInformation about a partially constructed initializer. Used to automatically aggregate handlers and cleanup actions.Gsnap,Handler routes built up and passed to route.HsnapGeneric filtering of handlersIsnapkThis snaplet config is the incrementally built config for whatever snaplet is currently being constructed.JsnapFWe can't just hae a simple MVar here because MVars can't be chrooted. snapSnaplet infrastructure is available during runtime request processing through the Handler monad. There aren't very many standalone functions to read about here, but this is deceptive. The key is in the type class instances. Handler is an instance of Kb, which means it is the monad you will use to write all your application routes. It also has a  B instance, which gives you all the functionality described above. snapThe m type parameter used in the MonadSnaplet type signatures will usually be either Initializer or Handler, but other monads may sometimes be useful.Minimal complete definition:, , , and . snapRuns a child snaplet action in the current snaplet's context. If you think about snaplet lenses using a filesystem path metaphor, the lens supplied to this snaplet must be a relative path. In other words, the lens's base state must be the same as the current snaplet.snapLike   but doesn't impose the requirement that the action being run be a descendant of the current snaplet. Using our filesystem metaphor again, the lens for this function must be an absolute path--it's base must be the same as the current base.snap A variant of  O accepting a lens from snaplet to snaplet. Unlike the lens used in the above  } function, this lens formulation has an identity, which makes it useful in certain circumstances. The lenses generated by LA will not work with this function, however the lens returned by  will. with = with' . subSnapletsnapThe absolute version of snap&Gets the lens for the current snaplet.snapxGets the current snaplet's opaque config data type. You'll only use this function when writing MonadSnaplet instances.snapqTransforms a lens of the type you get from makeLenses to an similar lens that is more suitable for internal use.snapWGets a list of the names of snaplets that are direct ancestors of the current snaplet.snap*Gets the snaplet's path on the filesystem.snapGets the current snaple's name.snap1Gets a human readable description of the snaplet.snap7Gets the config data structure for the current snaplet.snapkGets the base URL for the current snaplet. Directories get added to the current snaplet path by calls to  nestSnaplet.snap1Constructs a url relative to the current snaplet.snap Gets the  Snaplet v" from the current snaplet's state.snap Puts a new  Snaplet v in the current snaplet's state. snap Modifies the  Snaplet v in the current snaplet's state.!snap Gets the  Snaplet v@ from the current snaplet's state and applies a function to it.MsnapLike runBase0, but it doesn't require an MVar to be executed."snapGets the route pattern that matched for the handler. This lets you find out exactly which of the strings you used in addRoutes matched.#snapSets the route pattern that matched for the handler. Use this when to override the default pattern which is the key to the alist passed to addRoutes.Nsnap/Check whether the request comes from localhost.$snap1Pass if the request is not coming from localhost.%snapHandler that reloads the site.&snapTThis function brackets a Handler action in resource acquisition and release. Like O,, this is provided because MonadCatchIO's bracketg function doesn't work properly in the case of a short-circuit return from the action being bracketed.In order to prevent confusion regarding the effects of the aquisition and release actions on the Handler state, this function doesn't accept Handler actions for the acquire or release actions.This function will run the release action in all cases where the acquire action succeeded. This includes the following behaviors from the bracketed Snap action. Normal completion.Short-circuit completion, either from calling P or  finishWithAn exception being thrown.Qsnap8Lets you access the current snaplet's state through the R interface.Ssnap8Lets you access the current snaplet's state through the T interface.'snapOpaque newtype which gives us compile-time guarantees that the user is using makeSnaplet and either nestSnaplet or embedSnaplet correctly. snap%A relative lens identifying a snapletsnapAction from the lense's snapletsnap(An "absolute" lens identifying a snapletsnapAction from the lense's snapletTUBAVWXYZ[\]C^_`abcdefDE gFh iJjkIHGlmnop qr  s !M"#N$%&'tuvwxyz{None"#2=>?@AEHMPSUVWX$|snap} for InitializerState.~snap for InitializerState.snapgets for InitializerState.(snapjLets you retrieve the list of routes currently set up by an Initializer. This can be useful in debugging.)snapOReturn the current environment string. This will be the environment given to 5& or from the command line when using 7@. Useful for changing behavior during development and testing.snap*Converts a plain hook into a Snaplet hook.*snapWAdds an IO action that modifies the current snaplet state to be run at the end of initialization on the state that was created. This makes it easier to allow one snaplet's state to be modified by another snaplet's initializer. A good example of this is when a snaplet has templates that define its views. The Heist snaplet provides the  addTemplatesG function which allows other snaplets to set up their own templates.  addTemplates% is implemented using this function.+snapIVariant of addPostInitHook for when you have things wrapped in a Snaplet.snap'Helper function for transforming hooks.snap'Helper function for transforming hooks.snap)Modifies the Initializer's SnapletConfig.snappIf a snaplet has a filesystem presence, this function creates and copies the files if they dont' already exist.,snap6All snaplet initializers must be wrapped in a call to  makeSnapletp, which handles standardized housekeeping common to all snaplets. Common usage will look something like this: fooInit :: SnapletInit b Foo fooInit = makeSnaplet "foo" "An example snaplet" Nothing $ do -- Your initializer code here return $ Foo 42 Note that you're writing your initializer code in the Initializer monad, and makeSnaplet converts it into an opaque SnapletInit type. This allows us to use the type system to ensure that the API is used correctly.snappInternal function that gets the SnapletConfig out of the initializer state and uses it to create a (Snaplet a).snapXBrackets an initializer computation, restoring curConfig after the computation returns.snapHandles modifications to InitializerState that need to happen before a snaplet is called with either nestSnaplet or embedSnaplet.-snap8Runs another snaplet's initializer and returns the initialized Snaplet value. Calling an initializer with nestSnaplet gives the nested snaplet access to the same base state that the current snaplet has. This makes it possible for the child snaplet to make use of functionality provided by sibling snaplets..snappRuns another snaplet's initializer and returns the initialized Snaplet value. The difference between this and - is the first type parameter in the third argument. The "v1 v1" makes the child snaplet think that it is the top-level state, which means that it will not be able to use functionality provided by snaplets included above it in the snaplet tree. This strongly isolates the child snaplet, and allows you to eliminate the b type variable. The embedded snaplet can still get functionality from other snaplets, but only if it nests or embeds the snaplet itself.Note that this function does not change where this snaplet is located in the filesystem. The snaplet directory structure convention stays the same. Also, embedSnaplet limits the ways that snaplets can interact, so we usually recommend using nestSnaplet instead. However, we provide this function because sometimes reduced flexibility is useful. In short, if you don't understand what this function does for you from looking at its type, you probably don't want to use it.snap)Changes the base state of an initializer.snap$Changes the base state of a handler./snapYSets a snaplet's name. All snaplets have a default name set by the snaplet author. This function allows you to override that name. You will have to do this if you have more than one instance of the same kind of snaplet because snaplet names must be unique. This function must immediately surround the snaplet's initializer. For example: >fooState <- nestSnaplet "fooA" $ nameSnaplet "myFoo" $ fooInit0snapAdds routing to the current  . The new routes are merged with the main routing section and take precedence over existing routing that was previously defined.1snap Wraps the baseo snaplet's routing in another handler, allowing you to run code before and after all routes in an application..Here are some examples of things you might do: mwrapSite (\site -> logHandlerStart >> site >> logHandlerFinished) wrapSite (\site -> ensureAdminUser >> site)2snapzAttaches an unload handler to the snaplet. The unload handler will be called when the server shuts down, or is reloaded.snap3snapInitializers should use this function for all informational or error messages to be displayed to the user. On application startup they will be sent to the console. When executed from the reloader, they will be sent back to the user in the HTTP response.snap;Builds an IO reload action for storage in the SnapletState.snap+Runs a top-level snaplet in the Snap monad.4snapLets you change a snaplet's initial state. It's almost like a reload, except that it doesn't run the initializer. It just modifies the result of the initializer. This can be used to let you define actions for reloading individual snaplets.snapNInternal function for running Initializers. If any exceptions were thrown by the initializer, this function catches them, runs any cleanup actions that had been registered, and returns an expanded error message containing the exception details as well as all messages generated by the initializer before the exception was thrown.5snapGiven an environment and a Snaplet initializer, produce a concatenated log of all messages generated during initialization, a snap handler, and a cleanup action. The environment is an arbitrary string such as "devel" or "production". This string is used to determine the name of the configuration files used by each snaplet. If an environment of Nothing is used, then runSnaplet defaults to "devel".6snapGiven a configuration and a snap handler, complete it and produce the completed configuration as well as a new toplevel handler with things like compression and a 500 handler set up.7snapInitialize and run a Snaplet. This function parses command-line arguments, runs the given Snaplet initializer, and starts an HTTP server running the Snaplet's toplevel  .8snapLike 70, but don't try to parse command-line arguments.9snapgAllows you to get all of your app's config data in the IO monad without the web server infrastructure.snap#Recursive worker for loadAppConfig. snapThe directory where the snaplet's reference files are stored. Nothing if the snaplet doesn't come with any files that need to be installed.snap+Directory where the files should be copied.,snapA default id for this snaplet. This is only used when the end-user has not already set an id using the nameSnaplet function.snap-A human readable description of this snaplet.snapThe path to the directory holding the snaplet's reference filesystem content. This will almost always be the directory returned by Cabal's getDataDir command, but it has to be passed in because it is defined in a package-specific import. Setting this value to Nothing doesn't preclude the snaplet from having files in in the filesystem, it just means that they won't be copied there automatically.snapSnaplet initializer.-snap|The root url for all the snaplet's routes. An empty string gives the routes the same root as the parent snaplet's routes.snapLens identifying the snapletsnap,The initializer function for the subsnaplet..snap|The root url for all the snaplet's routes. An empty string gives the routes the same root as the parent snaplet's routes.NOTE: Because of the stronger isolation provided by embedSnaplet, you should be more careful about using an empty string here.snapLens identifying the snapletsnap,The initializer function for the subsnaplet./snapThe snaplet namesnap The snaplet initializer function1snapHandler modifier function7snapBThe configuration of the server - you can usually pass a default  via .snap!The snaplet initializer function.8snapBThe configuration of the server - you can usually pass a default  via .snap!The snaplet initializer function.9snaptThe name of the config file to look for. In snap applications, this is something based on the environment...i.e.  devel.cfg.snap+Path to the root directory of your project.()*+,-./0123456789None"#2=>?@AEHMSUVWX 2  !"#$%&'()*+,-./01234567892 "# ! ',-./2*+3()01 $%4&56789None"#2=>?@AEHMSUVWX:snapwThe state for the Heist snaplet. To use the Heist snaplet in your app include this in your application state and use  heistInitf to initialize it. The type parameter b will typically be the base state type for your application.snapnGeneric initializer function that allows compiled/interpreted template serving to be specified by the caller.snapInternal worker function used by variants of heistInit. This is necessary because of the divide between SnapletInit and Initializer.snap\Hook that converts the Heist type from Configuring to Running at the end of initialization.>snapHandler that triggers a template reload. For large sites, this can be desireable because it may be much quicker than the full site reload provided at the adminreload route. This allows you to reload only the heist templates This handler is automatically set up by heistInit, but if you use heistInit', then you can create your own route with it.:;=<>None"#2=>?@ACEHMSUVWXHQBsnapClears data stored by the cache tag. The cache tag automatically reloads its data when the specified TTL expires, but sometimes you may want to trigger a manual reload. This function lets you do that.CsnapThe   for :1. This function is a convenience wrapper around D that uses defaultHeistState and sets up routes for all the templates. It sets up a "heistReload" route that reloads the heist templates when you request it from localhost.DsnapA lower level   for :. This initializer requires you to specify the initial HeistConfig. It also does not add any routes for templates, allowing you complete control over which templates get routed.EsnapSets the snaplet to default to interpreted mode. Initially, the initializer sets the value to compiled mode. This function allows you to override that setting. Note that this is just a default. It only has an effect if you use one of the generic functions: X, Y, Z, or [. If you call the non-generic versions directly, then this value will not be checked and you will get the mode implemented by the function you called.FsnapAdds templates to the Heist HeistConfig. Other snaplets should use this function to add their own templates. The templates are automatically read from the templates directory in the current snaplet's filesystem root.GsnapAdds templates to the Heist HeistConfig, and lets you specify where they are found in the filesystem. Note that the path to the template directory is an absolute path. This allows you more flexibility in where your templates are located, but means that you have to explicitly call getSnapletFilePath if you want your snaplet to use templates within its normal directory structure.NsnapAdds more HeistConfig data using mappend with whatever is currently there. This is the preferred method for adding all four kinds of splices as well as new templates.snap'Internal helper function for rendering.snap'Internal helper function for rendering.Wsnap]Chooses between a compiled action and an interpreted action based on the configured default.XsnapZLike render/cRender, but chooses between the two appropriately based on the default mode.Ysnap^Like renderAs/cRenderAs, but chooses between the two appropriately based on the default mode.ZsnapbLike heistServe/cHeistServe, but chooses between the two appropriately based on the default mode.[snapnLike heistServeSingle/cHeistServeSingle, but chooses between the two appropriately based on the default mode.bsnaphThis instance is here because we don't want the heist package to depend on anything from snap packages. CsnapPath to templatesDsnapPath to templatessnapInitial HeistConfigFsnap&The url prefix for the template routesGsnapURL prefix for template routessnapPath to templatesOsnapName of the templatePsnap Content typesnapName of the templateSsnapName of the templateTsnap Content typesnapName of the templateWsnapA compiled actionsnapAn interpreted actionXsnapName of the templateYsnap Content typesnapName of the template(:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a(:;<=CD>EHBFGIKJMLXYZ[WNSTUVOPQR]_a\^`A?@None"#2=>?@AEHMSUVWX0csnapA single snaplet should never need more than one instance of Heist as a subsnaplet. This type class allows you to make it easy for other snaplets to get the lens that identifies the heist snaplet. Here's an example of how the heist snaplet might be declared: "data App = App { _heist :: Snaplet (Heist App) } makeLenses ''App instance HasHeist App where heistLens = subSnaplet heist appInit = makeSnaplet "app" "" Nothing $ do h <- nestSnaplet "heist" heist $ heistInit "templates" addConfig h heistConfigWithMyAppSplices return $ App hdsnapmA lens to the Heist snaplet. The b parameter to Heist will typically be the base state of your application.esnapAdds templates to the Heist HeistState. Other snaplets should use this function to add their own templates. The templates are automatically read from the templates directory in the current snaplet's filesystem root.fsnapAdds templates to the Heist HeistState, and lets you specify where they are found in the filesystem. Note that the path to the template directory is an absolute path. This allows you more flexibility in where your templates are located, but means that you have to explicitly call getSnapletFilePath if you want your snaplet to use templates within its normal directory structure.gsnapAMore general function allowing arbitrary HeistState modification.hsnapAMore general function allowing arbitrary HeistState modification.isnap,Runs a function on with the Heist snaplet's .jsnapGeneric version of 'render'/'cRender'.ksnapGeneric version of 'renderAs'/'cRenderAs'.lsnapGeneric version of 'heistServe'/'cHeistServe'.msnapGeneric version of &'heistServeSingle'/'cHeistServeSingle'.nsnap]Chooses between a compiled action and an interpreted action based on the configured default.osnap\Renders a compiled template as text/html. If the given template is not found, this returns empty.psnapjRenders a compiled template as the given content type. If the given template is not found, this returns empty.qsnapA compiled version of u.rsnap Analogous to fileServeSingle<. If the given template is not found, this throws an error.ssnapSRenders a template as text/html. If the given template is not found, this returns empty.tsnapaRenders a template as the given content type. If the given template is not found, this returns empty.usnap4A handler that serves all the templates (similar to serveDirectoryL). If the template specified in the request path is not found, it returns empty. Also, this function does not serve any templates beginning with an underscore. This gives you a way to prevent some templates from being served. For example, you might have a template that contains only the navbar of your pages, and you probably wouldn't want that template to be visible to the user as a standalone template. So if you put it in a file called "_nav.tpl", this function won't serve it.vsnap2Handler for serving a single template (similar to fileServeSingle=). If the given template is not found, this throws an error.wsnapRenders a template with a given set of splices. This is syntax sugar for a common combination of heistLocal, bindSplices, and render.xsnap=Runs an action with additional splices bound into the Heist .ysnapRuns a handler with a modified . You might want to use this if you had a set of splices which were customised for a specific action. To do that you would do: :heistLocal (bindSplices mySplices) handlerThatNeedsSplicesesnap&The url prefix for the template routesfsnapURL prefix for template routessnapPath to templateshsnapHeistState modifying functionisnapHeistState function to runjsnap Template nameksnapContent type to render withsnap Template namemsnap Template namensnapA compiled actionsnapAn interpreted actionosnap Template namepsnapContent type to render withsnap Template namersnap Template namessnap Template nametsnapContent type to render withsnap Template namevsnap Template namewsnap Template namesnapSplices to bindxsnapSplices to bindsnapHandler to runysnapHeistState modifying functionsnapHandler to run":>?@ABCDEHNcdefghijklmnopqrstuvwxy":cdCD>EHefNghijklmnopqrstuvyxwA@?BNone"#2=>?@AEHMSUVWX6:?ABCDNcdefghistuvwxy:cdA?CDefNghistuvyxwBNone"#2=>?@AEHMSUVWX:@ABNcdefghijklmn:cdA@efNghijklmnBNone"#2=>?@AEHMSUVWXzsnapThe   for :1. This function is a convenience wrapper around  heistInit' that uses defaultHeistState and sets up routes for all the templates. It sets up a "heistReload" route that reloads the heist templates when you request it from localhost.{snap\Renders a compiled template as text/html. If the given template is not found, this returns empty.|snapjRenders a compiled template as the given content type. If the given template is not found, this returns empty.}snap4A handler that serves all the templates (similar to serveDirectoryL). If the template specified in the request path is not found, it returns empty. Also, this function does not serve any templates beginning with an underscore. This gives you a way to prevent some templates from being served. For example, you might have a template that contains only the navbar of your pages, and you probably wouldn't want that template to be visible to the user as a standalone template. So if you put it in a file called "_nav.tpl", this function won't serve it.~snap2Handler for serving a single template (similar to fileServeSingle=). If the given template is not found, this throws an error.zsnapPath to templates{snap Template name|snapContent type to render withsnap Template name~snap Template name:>@ABDNcdefghiz{|}~:cdA@zD>efNghi{|}~BNone"#12=>?@AEHMSUVWX#snap6Authentication settings defined at initialization timesnapCurrently not used/checkedsnap#Name of the desired remember cookiesnapBHow long to remember when the option is used in rest of the API. % means remember until end of session.snap4Lockout strategy: ([MaxAttempts], [LockoutDuration])snap Location of app's encryption keysnap<Type representing the concept of a User in your application.snap8This will be replaced by a role-based permission system.snapInternal representation of a UserM. By convention, we demand that the application is able to directly fetch a User using this identifier.Think of this type as a secure, authenticated user. You should normally never see this type unless a user has been authenticated.snapAuthentication failures indicate what went wrong during authentication. They may provide useful information to the developer, although it is generally not advisable to show the user the exact details about why login failed.snapLocked out until given timesnap[Password is clear when supplied by the user and encrypted later when returned from the db.snap1Default strength level to pass into makePassword.snapQThe underlying encryption function, in case you need it for external processing.snapMThe underlying verify function, in case you need it for external processing.snapTurn a  password into an 0 password, ready to be stuffed into a database.snap+Default AuthUser that has all empty values.snapiSet a new password for the given user. Given password should be clear-text; it will be encrypted into a .snapDefault settings for Auth. asMinPasswdLen = 8 asRememberCookieName = "_remember" asRememberPeriod = Just (2*7*24*60*60) = 2 weeks asLockout = Nothing asSiteKey = "site_key.txt"snapbFunction to get auth settings from a config file. This function can be used by the authors of auth snaplet backends in the initializer to let the user configure the auth snaplet from a config file. All options are optional and default to what's in defAuthSettings if not supplied. Here's what the default options would look like in the config file: minPasswordLen = 8 rememberCookie = "_remember" rememberPeriod = 1209600 # 2 weeks lockout = [5, 86400] # 5 attempts locks you out for 86400 seconds siteKey = "site_key.txt"snap CleartextsnapEncrypted reference8None"#2=>?@AEHMSUVWXOK      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu  !"#$%&'()*+,-./0123456789None"#2=>?@AEHMSUVWXZsnap1High speed, mutable random number generator statesnap,Perform given action, mutating the RNG statesnapCreate a new RNGsnap'Generates a random salt of given lengthsnap Generate a randomized CSRF tokenNone"#2=>?@AEHMSUVWXsnap!Arbitrary payload with timestamp.snapGet the cookie payload.snap%Decode secure cookie payload wih key.snapInject the payload.snap4Encode SecureCookie with key into injectable payloadsnapExpire secure cookiesnap(Validate session against timeout policy.If timeout is set to , never trigger a time-out.TOtherwise, do a regular time-out check based on current time and given timestamp.snap Cookie namesnapEncryption keysnapTimeout in secondssnapEncryption keysnapEncrypted payloadsnap Cookie namesnap Cookie domainsnapEncryption keysnapMax age in secondssnapSerializable payloadsnapEncryption keysnapPayloadsnap Cookie namesnap Cookie domain None"#2=>?@AEHMSUVWX snap"Load a session from given payload.Will always be called before any other operation. If possible, cache and do nothing when called multiple times within the same request cycle.snap1Commit session, return a possibly updated paylaodsnap Reset sessionsnap Touch sessionsnap$Insert a key-value pair into sessionsnapLookup a key in sessionsnapDelete a key in sessionsnap5Return a session-specific CSRF protection token. See  mkCSRFToken! for help in creating the value.snap1Return all key-value pairs as an association listsnap+Any Haskell record that is a member of the $ typeclass can be stuffed inside a . to enable all session-related functionality.hTo use sessions in your application, just find a Backend that would produce one for you inside of your  Initializer. See initCookieSessionManager in 3 for a built-in option that would get you started. None"#2=>?@AEHMSUVWX_ snapGWrap around a handler, committing any changes in the session at the endsnap:Commit changes to session within the current request cyclesnap+Set a key-value pair in the current sessionsnap"Get a key from the current sessionsnap%Remove a key from the current sessionsnap2Returns a CSRF Token unique to the current sessionsnap.Return session contents as an association listsnap=Deletes the session cookie, effectively resetting the sessionsnap/Touch the session so the timeout gets refreshedvsnap!Load the session into the manager None"#2=>?@AEHMSUVWX  wsnap1A session payload to be stored in a SecureCookie.xsnap)The manager data type to be stuffed into ysnapPer request cache for z{snap6A long encryption key used for secure cookie transport|snap"Cookie name for the session system}snapCookie domain for session system. You may want to set it to dot prefixed domain name like ".example.com", so the cookie is available to sub domains.~snapDSession cookies will be considered "stale" after this many seconds.snap#handle to a random number generatorzsnapThis is what the w& will be for the CookieSession backendsnapSession data are kept in a  for this backendsnap0Initialize a cookie-backed session, returning a 6 to be stuffed inside your application's state. This G will enable the use of all session storage functionality defined in snap!Get the current client-side valuesnapSet the client-side valuesnap Path to site-wide encryption keysnapSession cookie namesnapSession cookie domainsnap+Session time-out (replay attack protection)None"#2=>?@AEHMSUVWXRsnapGAbstract data type holding all necessary information for auth operationsnapStorage back-endsnap"A lens pointer to a SessionManagersnap"A per-request logged-in user cachesnapPassword length rangesnap"Cookie name for the remember tokensnap1Domain for which remember cookie will be created.snap0Remember period in seconds. Defaults to 2 weeks.snap7A unique encryption key used to encrypt remember cookiesnap5Lockout after x tries, re-allow entry after y secondssnapRandom number generatorsnap5All storage backends need to implement this typeclasssnapCreate or update the given  record. A | of Nothing indicates that a new user should be created, otherwise the user information for that userId should be updated.snap0Creates a new user from a username and password.snapAn auth backendsnapUsernamesnapPasswordNone"#2=>?@AEHMSUVWX\ysnap3Create a new user from just a username and passwordsnap4Check whether a user with the given username exists.snapELookup a user by her username, check given password and perform loginsnapCRemember user from the remember token if possible and perform loginsnapLogout the active usersnapDReturn the current user; trying to remember from cookie if possible.snapConvenience wrapper around  rememberUser that returns a bool resultsnapCreate or update a given usersnapDestroy the given usersnap Mutate an , marking failed authentication'This will save the user to the backend.snap Mutate an #, marking successful authentication'This will save the user to the backend.snapEAuthenticate and log the user into the current session if successful.iThis is a mid-level function exposed to allow roll-your-own ways of looking up a user from the database.This function will: Check the password'Login the user into the current sessionCMark success/failure of the authentication trial on the user recordsnapLogin and persist the given  in the active session_Meant to be used if you have other means of being sure that the person is who she says she is.snapSet the current user's  in the active sessionsnapRemove 7 from active session, effectively logging the user out.snapGet the current user's  from the active sessionsnap Check password for a given user.Returns Nothing if check is successful and an IncorrectPassword error otherwisesnap'Wrap lookups around request-local cachesnap5Register a new user by specifying login and password Param fieldssnapA K% handler that processes a login form.%The request paremeters are passed to  performLoginWTo make your users stay logged in for longer than the session replay prevention timeout, you must pass a field name as the third parameter and that field must be set to a value of "1" by the submitting form. This lets you use a user selectable check box. Or if you want user remembering always turned on, you can use a hidden form field.snap>Simple handler to log the user out. Deletes user from session.snapRequire that an authenticated $ is present in the current session.bThis function has no DB cost - only checks to see if a user_id is present in the current session.snap5Run a function on the backend, and return the result.@This uses an existential type so that the backend type doesn't escape AuthManager. The reason that the type is Handler b (AuthManager v) a and not a is because anything that uses the backend will return an IO something, which you can liftIO, or a Handler b (AuthManager v) a if it uses other handler things.snapAThis function generates a random password reset token and stores it in the database for the user. Call this function when a user forgets their password. Then use the token to autogenerate a link that the user can visit to reset their password. This function also sets a timestamp so the reset token can be expired.snapClears a user's password reset token. Call this when the user successfully changes their password to ensure that the password reset link cannot be used again.snapaHelper function used for setting and clearing the password reset token and associated timestamp. snapUsernamesnapPasswordsnapThe username to be checkedsnapUsername/login for usersnapShould be ClearTextsnapSet remember token?snap+An existing user, somehow looked up from dbsnapA ClearText passwordsnap+An existing user, somehow looked up from dbsnapLooked up from the back-endsnapCheck against this passwordsnap8Lookup action to perform if request local cache is emptysnap Login fieldsnapPassword fieldsnapUsername fieldsnapPassword fieldsnap9Remember field; Nothing if you want no remember function.snap Upon failuresnap Upon successsnapWhat to do after logging outsnapLens reference to an  AuthManagersnap,Do this if no authenticated user is present.snap,Do this if an authenticated user is present.snap%The function to run with the handler. None"#2=>?@AEHMSUVWXr snap=Add all standard auth splices to a Heist-enabled application.MThis adds the following splices: <ifLoggedIn> <ifLoggedOut> <loggedInUser> snapPList containing compiled splices for ifLoggedIn, ifLoggedOut, and loggedInUser. snap:Function to generate interpreted splices from an AuthUser. snapCompiled splices for AuthUser. snapzA splice that can be used to check for existence of a user. If a user is present, this will run the contents of the node. C<ifLoggedIn> Show this when there is a logged in user </ifLoggedIn>snapzA splice that can be used to check for existence of a user. If a user is present, this will run the contents of the node. C<ifLoggedIn> Show this when there is a logged in user </ifLoggedIn> snap|A splice that can be used to check for absence of a user. If a user is not present, this will run the contents of the node. E<ifLoggedOut> Show this when there is a logged in user </ifLoggedOut>snap|A splice that can be used to check for absence of a user. If a user is not present, this will run the contents of the node. E<ifLoggedOut> Show this when there is a logged in user </ifLoggedOut>snapKA splice that will simply print the current user's login, if there is one.snapKA splice that will simply print the current user's login, if there is one.snapA lens reference to        None"#2=>?@AEHMSUVWX|JsnapVJSON user back-end stores the user data and indexes for login and token based logins.snapthe actual datastoresnapfast lookup for login fieldsnapfast lookup for email fieldsnapfast lookup for remember tokenssnapuser id countersnapInitialize a JSON file backed snap@Load/create a datafile into memory cache and return the manager.FThis data type can be used by itself for batch/non-handler processing.snap$Authentication settings for your appsnap Lens into a  auth snaplet will usesnap Where to store user data as JSONNone"#2=>?@AEHMSUVWX}Pf     f     None"#2=>?@AEHMSUVWX( snapVRemove the given file after running an IO computation. Obviously it can be used with  Assertion.snap!Utility function taken from Darcssnap2Helper to keep "runHandler" and "evalHandler" DRY.snapbHelper to allow multiple calls to "runHandler" or "evalHandler" without multiple initializations.snapGiven a Snaplet Handler and a ? defining a test request, runs the Handler, producing an HTTP 2.BNote that the output of this function is slightly different from O defined in Snap.Test, because due to the fact running the initializer inside ' can throw an exception.snapA variant of runHandler that takes the Snaplet and InitializerState as produced by getSnaplet, so those can be re-used across requests. It does not run cleanup actions, so closeSnaplet should be used when finished.snapGiven a Snaplet Handler, a '' specifying the initial state, and a V defining a test request, runs the handler, returning the monadic value it produces.Throws an exception if the  handler early-terminates with  or mzero.Note that the output of this function is slightly different from 'evalHandler defined in Snap.Test, because due to the fact running the initializer inside ' can throw an exception.snapA variant of evalHandler that takes the Snaplet and InitializerState as produced by getSnaplet, so those can be re-used across requests. It does not run cleanup actions, so closeSnaplet should be used when finished.snapJRun the given initializer, yielding a tuple where the first element is a  Snaplet be, or an error message whether the initializer threw an exception. This is only needed for runHandler'/evalHandler'.snapRun cleanup for an initializer. Should be run after finished using the state that getSnaplet returned. Only needed if using getSnaplet and evalHandler '/runHandler'.  !!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~fgikmxyz{wstuvopqr}copqr                       ! "##$%&'(.-)*+,,-./01233(45678.-9:;<=>?@ABCDEFGHIJCDKLMNOPQRSPTU'VWXYZ[(\]^_`abcde)>*fghijjk+lmGnopqrstuPTvwPTxyz{|}~LCCCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C C CCCCCCCCCCCCCCCCCCCC C!C"C#C$C%C&C'C(C)C*C+C,C-C.C/C0C1C2345464748494:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs t u v    w xyz { |}~         C#snap-1.1.3.0-18BriVddA1U2H1ZuRmBehzSnap.Snaplet.Config Snap.SnapletSnap.Snaplet.TestSnap.Snaplet.HeistNoClassSnap.Snaplet.HeistSnap.Snaplet.Heist.CompiledSnap.Snaplet.AuthSnap.Snaplet.Session.CommonSnap.Snaplet.Session#Snap.Snaplet.Session.SessionManager+Snap.Snaplet.Session.Backends.CookieSession#Snap.Snaplet.Auth.Backends.JsonFile Paths_snapSnap.Snaplet.Internal.LensedSnap.Snaplet.Internal.RSTSnap.Snaplet.Internal.LensTSnap.Snaplet.Internal.Types!Snap.Snaplet.Internal.InitializerSnap.Http.Server.Config defaultConfigSnap.Snaplet.Heist.InternalSnap.Snaplet.Heist.InterpretedSnap.Snaplet.Heist.GenericSnap.Snaplet.Auth.TypesSnap!Snap.Snaplet.Session.SecureCookieSnap.Snaplet.Session.Backends CookieSessionSessionSnap.Snaplet.Auth.AuthManagerSnap.Snaplet.Auth.HandlersSnap.Snaplet.Auth.SpliceHelpers AppConfigappEnvironmentappOptscommandLineAppConfig$fMonoidAppConfig$fSemigroupAppConfig SnapletConfigSnaplet InitializerInitializerStateHandler MonadSnapletwithwithTopwith'withTop'getLensgetOpaqueConfig SnapletLens snapletConfig snapletValue subSnapletgetSnapletAncestrygetSnapletFilePathgetSnapletNamegetSnapletDescriptiongetSnapletUserConfiggetSnapletRootURL snapletURLgetSnapletStateputSnapletStatemodifySnapletStategetsSnapletStategetRoutePatternsetRoutePatternfailIfNotLocal reloadSitebracketHandler SnapletInit getRoutesgetEnvironmentaddPostInitHookaddPostInitHookBase makeSnaplet nestSnaplet embedSnaplet nameSnaplet addRouteswrapSiteonUnload printInfo modifyMaster runSnaplet combineConfig serveSnapletserveSnapletNoArgParsing loadAppConfigHeist DefaultModeCompiled Interpreted heistReloaderSnapletISpliceSnapletCSplice SnapletHeistclearHeistCache heistInit heistInit'setInterpreted addTemplatesaddTemplatesAtgetCurHeistConfig getHeistStatemodifyHeistState'modifyHeistStatewithHeistState'withHeistState addConfigrenderrenderAs heistServeheistServeSinglecRender cRenderAs cHeistServecHeistServeSingle chooseModegRender gRenderAs gHeistServegHeistServeSingle heistLocal' heistLocal withSplices' withSplicesrenderWithSplices'renderWithSplices$fMonadSnapHeistTHasHeist heistLens AuthSettingsasMinPasswdLenasRememberCookieNameasRememberPeriod asLockout asSiteKeyAuthUseruserId userLogin userEmail userPassworduserActivatedAtuserSuspendedAtuserRememberTokenuserLoginCountuserFailedLoginCountuserLockedOutUntiluserCurrentLoginAtuserLastLoginAtuserCurrentLoginIpuserLastLoginIp userCreatedAt userUpdatedAtuserResetTokenuserResetRequestedAt userRolesuserMetaRoleUserIdunUid AuthFailure AuthError BackendErrorDuplicateLoginEncryptedPasswordIncorrectPassword LockedOutPasswordMissingUsernameMissing UserNotFoundPassword ClearText EncryptedencryptverifyencryptPassword checkPassword defAuthUser setPassworddefAuthSettingsauthSettingsFromConfigRNGwithRNGmkRNG randomToken mkCSRFToken SecureCookiegetSecureCookiedecodeSecureCookiesetSecureCookieencodeSecureCookieexpireSecureCookie checkTimeoutISessionManagerloadcommitresettouchinsertlookupdeletecsrftoListSessionManager withSession commitSession setInSessiongetFromSessiondeleteFromSession csrfToken sessionToList resetSession touchSessioninitCookieSessionManager$fSerializeCookieSession%$fISessionManagerCookieSessionManager$fEqCookieSession$fShowCookieSession $fEqPayload $fShowPayload $fOrdPayload$fSerializePayload AuthManagerbackendsession activeUser minPasswdLenrememberCookieNamerememberCookieDomainrememberPeriodsiteKeylockoutrandomNumberGenerator IAuthBackendsavelookupByUserId lookupByLogin lookupByEmaillookupByRememberTokendestroy createUserusernameExistsloginByUsernameloginByRememberTokenlogout currentUser isLoggedInsaveUser destroyUser markAuthFailmarkAuthSuccesscheckPasswordAndLogin forceLoginauthenticatePassword registerUser loginUser logoutUser requireUser withBackendsetPasswordResetTokenclearPasswordResetTokenaddAuthSplicescompiledAuthSplices userISplices userCSplices ifLoggedIn ifLoggedOut loggedInUserinitJsonFileAuthManager mkJsonAuthMgr$fFromJSONUserCache$fToJSONUserCache!$fIAuthBackendJsonFileAuthManagerwithTemporaryFile runHandler runHandler' evalHandler evalHandler' getSnaplet closeSnapletversion getBinDir getLibDir getDynLibDir getDataDir getLibexecDir getSysconfDirgetDataFileNameLensedunlensed lensedLocalglobally lensedAsStategetBaseembedlocally runLensedRSTrunRSTevalRSTexecRSTwithRSTmapRSTrwsBindLensTputBaselGetlPutrunLensT withLensT_scRoutePattern _reloader_snapletModifier buildPath getRootURLHook _handlers_hFilter _curConfigmasterReloader'snap-core-1.0.4.1-YzUfS5lgxp8lLYmzvkoETSnap.Internal.Core MonadSnap"lens-4.18.1-BUbzUE4M6TrKadx9FaPnqVControl.Lens.TH makeLenses runPureBase isLocalhost bracketSnapbaseGHC.Basefail$fMonadReadervHandler mtl-2.2.2Control.Monad.Reader.Class MonadReader$fMonadStatevHandlerControl.Monad.State.Class MonadState_scRouteContext _scUserConfig_scDescription_scId _scFilePath _scAncestry _snapletValue_snapletConfigreloader scAncestry scDescription scFilePathscIdscRouteContextscRoutePattern scUserConfig _environment _initMessages_cleanup _isTopLevel StMHandler unStMHandler _unHandlersnapletModifiercleanup curConfig environmenthFilterhandlers initMessages isTopLeveliGetgetiModifymodifyiGets toSnapletHookupHookupHook' modifyCfgsetupFilesystem mkSnaplet bracketInitsetupSnapletCallchroot chrootHandler logInitMsg mkReloaderrunBaserunInitializerloadAppConfig'*snap-server-1.1.1.1-3gkbt1cYtOJ9zugZ0gsblQ Snap.Internal.Http.Server.ConfigConfig gHeistInitheistInitWorker finalLoadHookRunning Configuring_defMode _heistCTS _heistState _masterConfig _heistConfigdefModeheistCTS heistConfig heistState masterConfigmapBoth iRenderHelper cRenderHelper$heist-1.1.0.1-9HCJj3lK7X68pZofK81PUNHeist.Internal.Types.HeistState HeistState GHC.MaybeNothingdefaultStrengthSnap.Internal.Routing routeLocalroutegetTimeoutModifier modifyTimeout extendTimeout setTimeout expireCookie readCookie getCookiegetQueryParams getPostParams getParams getQueryParam getPostParamgetParamrunSnap escapeHttpterminateConnectionipHeaderFilter'ipHeaderFilter withResponse withRequest localRequestsendFilePartialsendFile writeLazyText writeTextwriteLBSwriteBS writeBuilder addToOutputlogError redirect'redirectmodifyResponse modifyRequest putRequest putResponse getsResponse getResponse getsRequest getRequestifToppathArgpathdirmethodsmethodpasscatchFinishWith finishWithtransformRequestBodyreadRequestBodyrunRequestBodyliftSnapEscapeHttpHandler EscapeSnapTerminateConnection EscapeHttpNoHandlerExceptionSnap.Internal.ParsingprintUrlEncodedbuildUrlEncodedparseUrlEncodedurlEncodeBuilder urlEncode urlDecodeSnap.Internal.Http.Types rqRemotePort rqRemoteAddr parseHttpTimeformatHttpTimeclearContentLengthsetContentLengthmodifyResponseCookiedeleteResponseCookiegetResponseCookiesgetResponseCookieaddResponseCookiesetContentTypemodifyResponseBodysetResponseCodesetResponseStatussetResponseBody emptyResponse rqSetParamrqModifyParams rqQueryParam rqPostParamrqParam deleteHeader listHeaders getHeader setHeader addHeader HasHeadersheaders updateHeadersMethodGETHEADPOSTPUTDELETETRACEOPTIONSCONNECTPATCH HttpVersionCookie cookieName cookieValue cookieExpires cookieDomain cookiePath cookieSecurecookieHttpOnlyParamsRequest rqHostName rqClientAddr rqClientPort rqServerAddr rqServerPortrqLocalHostname rqIsSecure rqHeadersrqContentLengthrqMethod rqVersion rqCookies rqPathInfo rqContextPathrqURI rqQueryStringrqParams rqQueryParams rqPostParamsResponse rspStatusrspStatusReasonSnap.Types.HeadersHeadersSnap.Http.ServersetUnicodeLocalequickHttpServe httpServesimpleHttpServe rawHttpServesnapServerVersionhaProxy xForwardedFornoProxyfmapOptextendedCommandLineConfigcommandLineConfig optDescrscompleteConfiggetStartupConfiggetStartupSocketssetStartupHook setProxyTypesetOthersetDefaultTimeoutsetErrorHandler setVerbosesetCompressionsetUnixSocketAccessMode setUnixSocket setSSLKeysetSSLChainCert setSSLCert setSSLBind setSSLPortsetBindsetPort setLocale setErrorLog setAccessLog setHostnamegetStartupHook getProxyTypegetOthergetDefaultTimeoutgetErrorHandler getVerbosegetCompressiongetUnixSocketAccessMode getUnixSocket getSSLKeygetSSLChainCert getSSLCert getSSLBind getSSLPortgetBindgetPort getLocale getErrorLog getAccessLog getHostname emptyConfig ProxyType ConfigLog ConfigNoLog ConfigFileLog ConfigIoLog StartupInfo loadSessionPayloadCookieSessionManagertimeOut3unordered-containers-0.2.10.0-b9YJCQLkMeLUf311RZkQDData.HashMap.BaseHashMap getPayload setPayload buildAuthUsersetSessionUserIdremoveSessionUserIdgetSessionUserId cacheOrLookupmodPasswordResetTokengetRememberTokensetRememberToken loginUser' cIfLoggedIn cIfLoggedOut cLoggedInUser UserCacheuidCache loginCache emailCache tokenCache uidCounterremoveFileMayNotExistexecHandlerComputationexecHandlerSnaplet!Snap.Internal.Test.RequestBuilderRequestBuilder