diff --git a/advanced/composing_routers.html b/advanced/composing_routers.html index cfbc08bf..1795f7c0 100644 --- a/advanced/composing_routers.html +++ b/advanced/composing_routers.html @@ -1,1236 +1,9 @@ - - - - - - Composing Routers · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - -
- -
- -
- - - - - - - - -
-
- -
-
- -
- -

Composing Routers

-

Data-driven approach in reitit allows us to compose routes, route data, route specs, middleware and interceptors chains. We can compose routers too. This is needed to achieve dynamic routing like in Compojure.

-

Immutability

-

Once a router is created, the routing tree is immutable and cannot be changed. To change the routing, we need to create a new router with changed routes and/or options. For this, the Router protocol exposes it's resolved routes via r/routes and options via r/options.

-

Adding routes

-

Let's create a router:

-
(require '[reitit.core :as r])
-
-(def router
-  (r/router
-    [["/foo" ::foo]
-     ["/bar/:id" ::bar]]))
-
-

We can query the resolved routes and options:

-
(r/routes router)
-;[["/foo" {:name :user/foo}]
-; ["/bar/:id" {:name :user/bar}]]
-
-(r/options router)
-;{:lookup #object[...]
-; :expand #object[...]
-; :coerce #object[...]
-; :compile #object[...]
-; :conflicts #object[...]}
-
-

Let's add a helper function to create a new router with extra routes:

-
(defn add-routes [router routes]
-  (r/router
-    (into (r/routes router) routes)
-    (r/options router)))
-
-

We can now create a new router with extra routes:

-
(def router2
-  (add-routes
-    router
-    [["/baz/:id/:subid" ::baz]]))
-
-(r/routes router2)
-;[["/foo" {:name :user/foo}]
-; ["/bar/:id" {:name :user/bar}]
-; ["/baz/:id/:subid" {:name :user/baz}]]
-
-

The original router was not changed:

-
(r/routes router)
-;[["/foo" {:name :user/foo}]
-; ["/bar/:id" {:name :user/bar}]]
-
-

When a new router is created, all rules are applied, including the conflict resolution:

-
(add-routes
-  router2
-  [["/:this/should/:fail" ::fail]])
-;CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route paths:
-;
-;   /baz/:id/:subid
-;-> /:this/should/:fail
-
-

Merging routers

-

Let's create a helper function to merge routers:

-
(defn merge-routers [& routers]
-  (r/router
-    (apply merge (map r/routes routers))
-    (apply merge (map r/options routers))))
-
-

We can now merge multiple routers into one:

-
(def router
-  (merge-routers
-    (r/router ["/route1" ::route1])
-    (r/router ["/route2" ::route2])
-    (r/router ["/route3" ::route3])))
-
-(r/routes router)
-;[["/route1" {:name :user/route1}]
-; ["/route2" {:name :user/route2}]
-; ["/route3" {:name :user/route3}]]
-
-

Nesting routers

-

Routers can be nested using the catch-all parameter.

-

Here's a router with deeply nested routers under a :router key in the route data:

-
(def router
-  (r/router
-    [["/ping" :ping]
-     ["/olipa/*" {:name :olipa
-                  :router (r/router
-                            [["/olut" :olut]
-                             ["/makkara" :makkara]
-                             ["/kerran/*" {:name :kerran
-                                           :router (r/router
-                                                     [["/avaruus" :avaruus]
-                                                      ["/ihminen" :ihminen]])}]])}]]))
-
-

Matching by path:

-
(r/match-by-path router "/olipa/kerran/iso/kala")
-;#Match{:template "/olipa/*"
-;       :data {:name :olipa
-;              :router #object[reitit.core$mixed_router]}
-;       :result nil
-;       :path-params {: "kerran/iso/kala"}
-;       :path "/olipa/iso/kala"}
-
-

That didn't work as we wanted, as the nested routers don't have such a route. The core routing doesn't understand anything the :router key, so it only matched against the top-level router, which gave a match for the catch-all path.

-

As the Match contains all the route data, we can create a new matching function that understands the :router key. Below is a function that does recursive matching using the subrouters. It returns either nil or a vector of matches.

-
(require '[clojure.string :as str])
-
-(defn recursive-match-by-path [router path]
-  (if-let [match (r/match-by-path router path)]
-    (if-let [subrouter (-> match :data :router)]
-      (let [subpath (subs path (str/last-index-of (:template match) "/"))]
-        (if-let [submatch (recursive-match-by-path subrouter subpath)]
-          (cons match submatch)))
-      (list match))))
-
-

With invalid nested path we get now nil as expected:

-
(recursive-match-by-path router "/olipa/kerran/iso/kala")
-; nil
-
-

With valid path we get all the nested matches:

-
(recursive-match-by-path router "/olipa/kerran/avaruus")
-;[#reitit.core.Match{:template "/olipa/*"
-;                    :data {:name :olipa
-;                           :router #object[reitit.core$mixed_router]}
-;                    :result nil
-;                    :path-params {: "kerran/avaruus"}
-;                    :path "/olipa/kerran/avaruus"}
-; #reitit.core.Match{:template "/kerran/*"
-;                    :data {:name :kerran
-;                           :router #object[reitit.core$lookup_router]}
-;                    :result nil
-;                    :path-params {: "avaruus"}
-;                    :path "/kerran/avaruus"}
-; #reitit.core.Match{:template "/avaruus" 
-;                    :data {:name :avaruus} 
-;                    :result nil 
-;                    :path-params {} 
-;                    :path "/avaruus"}]
-
-

Let's create a helper to get only the route names for matches:

-
(defn name-path [router path]
-  (some->> (recursive-match-by-path router path)
-           (mapv (comp :name :data))))
-
-(name-path router "/olipa/kerran/avaruus")
-; [:olipa :kerran :avaruus]
-
-

So, we can nest routers, but why would we do that?

-

Dynamic routing

-

In all the examples above, the routers were created ahead of time, making the whole route tree effectively static. To have more dynamic routing, we can use router references allowing the router to be swapped over time. We can also create fully dynamic routers where the router is re-created for each request. Let's walk through both cases.

-

First, we need to modify our matching function to support router references:

-
(defn- << [x] 
-  (if (instance? clojure.lang.IDeref x) 
-    (deref x) x))
-
-(defn recursive-match-by-path [router path]
-  (if-let [match (r/match-by-path (<< router) path)]
-    (if-let [subrouter (-> match :data :router <<)]
-      (let [subpath (subs path (str/last-index-of (:template match) "/"))]
-        (if-let [submatch (recursive-match-by-path subrouter subpath)]
-          (cons match submatch)))
-      (list match))))
-
-

Then, we need some routers.

-

First, a reference to a router that can be updated on background, for example when a new entry in inserted into a database. We'll wrap the router into a atom:

-
(def beer-router
-  (atom
-    (r/router 
-      [["/lager" :lager]])))
-
-

Second, a reference to router, which is re-created on each routing request:

-
(def dynamic-router
-  (reify clojure.lang.IDeref
-    (deref [_]
-      (r/router
-        ["/duo" (keyword (str "duo" (rand-int 100)))]))))
-
-

We can compose the routers into a system-level static root router:

-
(def router
-  (r/router
-    [["/gin/napue" :napue]
-     ["/ciders/*" :ciders]
-     ["/beers/*" {:name :beers
-                  :router beer-router}]
-     ["/dynamic/*" {:name :dynamic
-                    :router dynamic-router}]]))
-
-

Matching root routes:

-
(name-path router "/vodka/russian")
-; nil
-
-(name-path router "/gin/napue")
-; [:napue]
-
-

Matching (nested) beer routes:

-
(name-path router "/beers/lager")
-; [:beers :lager]
-
-(name-path router "/beers/saison")
-; nil
-
-

No saison!? Let's add the route:

-
(swap! beer-router add-routes [["/saison" :saison]])
-
-

There we have it:

-
(name-path router "/beers/saison")
-; [:beers :saison]
-
-

We can't add conflicting routes:

-
(swap! beer-router add-routes [["/saison" :saison]])
-;CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route paths:
-;
-;   /saison
-;-> /saison
-
-

The dynamic routes are re-created on every request:

-
(name-path router "/dynamic/duo")
-; [:dynamic :duo71]
-
-(name-path router "/dynamic/duo")
-; [:dynamic :duo55]
-
-

Performance

-

With nested routers, instead of having to do just one route match, matching is recursive, which adds a small cost. All nested routers need to be of type catch-all at top-level, which is order of magnitude slower than fully static routes. Dynamic routes are the slowest ones, at least two orders of magnitude slower, as the router needs to be recreated for each request.

-

A quick benchmark on the recursive lookups:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtimetype
/gin/napue40nsstatic
/ciders/weston440nscatch-all
/beers/saison600nscatch-all + static
/dynamic/duo12000nscatch-all + dynamic
-

The non-recursive lookup for /gin/napue is around 23ns.

-

Comparing the dynamic routing performance with Compojure:

-
(require '[compojure.core :refer [context])
-
-(def app
-  (context "/dynamic" [] (constantly :duo)))
-
-(app {:uri "/dynamic/duo" :request-method :get})
-; :duo
-
- - - - - - - - - - - - - - - -
pathtimetype
/dynamic/duo20000nscompojure
-

Can we make the nester routing faster? Sure. We could use the Router :compile hook to compile the nested routers for better performance. We could also allow router creation rules to be disabled, to get the dynamic routing much faster.

-

When to use nested routers?

-

Nesting routers is not trivial and because of that, should be avoided. For dynamic (request-time) route generation, it's the only choice. For other cases, nested routes are most likely a better option.

-

Let's re-create the previous example with normal route nesting/composition.

-

A helper to the root router:

-
(defn create-router [beers]
-  (r/router
-    [["/gin/napue" :napue]
-     ["/ciders/*" :ciders]
-     ["/beers" (for [beer beers]
-                 [(str "/" beer) (keyword "beer" beer)])]
-     ["/dynamic/*" {:name :dynamic
-                    :router dynamic-router}]]))
-
-

New new root router reference and a helper to reset it:

-
(def router
-  (atom (create-router nil)))
-
-(defn reset-router! [beers]
-  (reset! router (create-router beers)))
-
-

The routing tree:

-
(r/routes @router)
-;[["/gin/napue" {:name :napue}]
-; ["/ciders/*" {:name :ciders}]
-; ["/dynamic/*" {:name :dynamic,
-;                :router #object[user$reify__24359]}]]
-
-

Let's reset the router with some beers:

-
(reset-router! ["lager" "sahti" "bock"])
-
-

We can see that the beer routes are now embedded into the core router:

-
(r/routes @router)
-;[["/gin/napue" {:name :napue}]
-; ["/ciders/*" {:name :ciders}]
-; ["/beers/lager" {:name :beer/lager}]
-; ["/beers/sahti" {:name :beer/sahti}]
-; ["/beers/bock" {:name :beer/bock}]
-; ["/dynamic/*" {:name :dynamic,
-;                :router #object[user$reify__24359]}]]
-
-

And the routing works:

-
(name-path @router "/beers/sahti")
-;[:beer/sahti]
-
-

All the beer-routes now match in constant time.

- - - - - - - - - - - - - - - -
pathtimetype
/beers/sahti40nsstatic
-

TODO

-
    -
  • add an example how to do dynamic routing with reitit-ring
  • -
  • maybe create a recursive-router into a separate ns with all Router functions implemented correctly? maybe not...
  • -
  • add reitit.core/merge-routes to effectively merge routes with route data
  • -
- - -
- -
-
-
- -

results matching ""

-
    - -
    -
    - -

    No results matching ""

    - -
    -
    -
    - -
    -
    - -
    - - - - - - - - - - - - - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

    Go to this page on cljdoc

    diff --git a/advanced/configuring_routers.html b/advanced/configuring_routers.html index db27941f..64c4bb9a 100644 --- a/advanced/configuring_routers.html +++ b/advanced/configuring_routers.html @@ -1,950 +1,9 @@ - - - - - - Configuring Routers · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - -
    - -
    - -
    - - - - - - - - -
    -
    - -
    -
    - -
    - -

    Configuring Routers

    -

    Routers can be configured via options. The following options are available for the reitit.core/router:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    keydescription
    :pathBase-path for routes
    :routesInitial resolved routes (default [])
    :dataInitial route data (default {})
    :specclojure.spec definition for a route data, see reitit.spec on how to use this
    :syntaxPath-parameter syntax as keyword or set of keywords (default #{:bracket :colon})
    :expandFunction of arg opts => data to expand route arg to route data (default reitit.core/expand)
    :coerceFunction of route opts => route to coerce resolved route, can throw or return nil
    :compileFunction of route opts => result to compile a route handler
    :validateFunction of routes opts => () to validate route (data) via side-effects
    :conflictsFunction of {route #{route}} => () to handle conflicting routes
    :exceptionFunction of Exception => Exception to handle creation time exceptions (default reitit.exception/exception)
    :routerFunction of routes opts => router to override the actual router implementation
    - - -
    - -
    -
    -
    - -

    results matching ""

    -
      - -
      -
      - -

      No results matching ""

      - -
      -
      -
      - -
      -
      - -
      - - - - - - - - - - - - - - -
      - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

      Go to this page on cljdoc

      diff --git a/advanced/dev_workflow.html b/advanced/dev_workflow.html index e51b4c45..eebb1e14 100644 --- a/advanced/dev_workflow.html +++ b/advanced/dev_workflow.html @@ -1,1001 +1,9 @@ - - - - - - Dev Workflow · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      - - - - - - - - -
      - -
      - -
      - - - - - - - - -
      -
      - -
      -
      - -
      - -

      Dev Workflow

      -

      Many applications will require the routes to span multiple namespaces. It is quite easy to do so with reitit, but we might hit a problem during development.

      -

      An example

      -

      Consider this sample routing :

      -
      (ns ns1)
      -
      -(def routes
      -  ["/bar" ::bar])
      -
      -(ns ns2)
      -(require '[ns1])
      -
      -(def routes
      -  [["/ping" ::ping]
      -   ["/more" ns1/routes]])
      -
      -(ns ns3)
      -(require '[ns1])
      -(require '[ns2])
      -(require '[reitit.core :as r])
      -
      -(def routes
      -  ["/api"
      -   ["/ns2" ns2/routes]
      -   ["/ping" ::ping]])
      -
      -(def router (r/router routes))
      -
      -

      We may query the top router and get the expected result :

      -
      (r/match-by-path router "/api/ns2/more/bar")
      -;#reitit.core.Match{:template "/api/ns2/more/bar", :data {:name :ns1/bar}, :result nil, :path-params {}, :path "/api/ns2/more/bar"}
      -
      -

      Notice the route name : :ns1/bar

      -

      When we change the routes in ns1 like this :

      -
      (ns ns1
      -  (:require [reitit.core :as r]))
      -
      -(def routes
      -  ["/bar" ::bar-with-new-name])
      -
      -

      After we recompile the ns1 namespace, and query again

      -
      ns1/routes
      -;["/bar" :ns1/bar-with-new-name]
      -;The routes var in ns1 was changed indeed
      -
      -(r/match-by-path router "/api/ns2/more/bar")
      -;#reitit.core.Match{:template "/api/ns2/more/bar", :data {:name :ns1/bar}, :result nil, :path-params {}, :path "/api/ns2/more/bar"}
      -
      -

      The route name is still :ns1/bar !

      -

      While we could use the reloaded workflow to reload the whole routing tree, it is not always possible, and quite frankly a bit slower than we might want for fast iterations.

      -

      A crude solution

      -

      In order to see the changes without reloading the whole route tree, we can use functions.

      -
      (ns ns1)
      -
      -(defn routes [] ;; Now a function !
      -  ["/bar" ::bar])
      -
      -(ns ns2)
      -(require '[ns1])
      -
      -(defn routes [] ;; Now a function !
      -  [["/ping" ::ping]
      -   ["/more" (ns1/routes)]]) ;; Now a function call
      -
      -(ns ns3)
      -(require '[ns1])
      -(require '[ns2])
      -(require '[reitit.core :as r])
      -
      -(defn routes [] ;; Now a function !
      -  ["/api"
      -   ["/ns2" (ns2/routes)] ;; Now a function call
      -   ["/ping" ::ping]])
      -
      -(def router #(r/router (routes))) ;; Now a function
      -
      -

      Let's query again

      -
      (r/match-by-path (router) "/api/ns2/more/bar") 
      -;#reitit.core.Match{:template "/api/ns2/more/bar", :data {:name :ns1/bar}, :result nil, :path-params {}, :path "/api/ns2/more/bar"}
      -
      -

      Notice that's we're now calling a function rather than just passing router to the matching function.

      -

      Now let's again change the route name in ns1, and recompile that namespace.

      -
      (ns ns1)
      -
      -(defn routes [] 
      -  ["/bar" ::bar-with-new-name])
      -
      -

      let's see the query result :

      -
      (r/match-by-path (router) "/api/ns2/more/bar")
      -;#reitit.core.Match{:template "/api/ns2/more/bar", :data {:name :ns1/bar-with-new-name}, :result nil, :path-params {}, :path "/api/ns2/more/bar"}
      -
      -

      Notice that the name is now correct, without reloading every namespace under the sun.

      -

      Why is this a crude solution ?

      -

      The astute reader will have noticed that we're recompiling the full routing tree on every invocation. While this solution is practical during development, it goes contrary to the performance goals of reitit.

      -

      We need a way to only do this once at production time.

      -

      An easy fix

      -

      Let's apply a small change to our ns3. We'll replace our router by two different routers, one for dev and one for production.

      -
      (ns ns3)
      -(require '[ns1])
      -(require '[ns2])
      -(require '[reitit.core :as r])
      -
      -(defn routes [] 
      -  ["/api"
      -   ["/ns2" (ns2/routes)] 
      -   ["/ping" ::ping]])
      -
      -(def dev-router #(r/router (routes))) ;; A router for dev
      -(def prod-router (constantly (r/router (routes)))) ;; A router for prod
      -
      -

      And there you have it, dynamic during dev, performance at production. We have it all !

      - - -
      - -
      -
      -
      - -

      results matching ""

      -
        - -
        -
        - -

        No results matching ""

        - -
        -
        -
        - -
        -
        - -
        - - - - - - - - - - - - - - -
        - - -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

        Go to this page on cljdoc

        diff --git a/advanced/different_routers.html b/advanced/different_routers.html index 4087377b..c34f5503 100644 --- a/advanced/different_routers.html +++ b/advanced/different_routers.html @@ -1,949 +1,9 @@ - - - - - - Different Routers · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -
        - - - - - - - - -
        - -
        - -
        - - - - - - - - -
        -
        - -
        -
        - -
        - -

        Different Routers

        -

        Reitit ships with several different implementations for the Router protocol, originally based on the Pedestal implementation. router function selects the most suitable implementation by inspecting the expanded routes. The implementation can be set manually using :router option, see configuring routers.

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        routerdescription
        :linear-routerMatches the routes one-by-one starting from the top until a match is found. Slow, but works with all route trees.
        :trie-routerRouter that creates a optimized search trie out of an route table. Much faster than :linear-router for wildcard routes. Valid only if there are no Route conflicts.
        :lookup-routerFast router, uses hash-lookup to resolve the route. Valid if no paths have path or catch-all parameters and there are no Route conflicts.
        :single-static-path-routerSuper fast router: string-matches a route. Valid only if there is one static route.
        :mixed-routerContains two routers: :trie-router for wildcard routes and a :lookup-router or :single-static-path-router for static routes. Valid only if there are no Route conflicts.
        :quarantine-routerContains two routers: :mixed-router for non-conflicting routes and a :linear-router for conflicting routes.
        -

        The router name can be asked from the router:

        -
        (require '[reitit.core :as r])
        -
        -(def router
        -  (r/router
        -    [["/ping" ::ping]
        -     ["/api/:users" ::users]]))
        -
        -(r/router-name router)
        -; :mixed-router
        -
        -

        Overriding the router implementation:

        -
        (require '[reitit.core :as r])
        -
        -(def router
        -  (r/router
        -    [["/ping" ::ping]
        -     ["/api/:users" ::users]]
        -    {:router r/linear-router}))
        -
        -(r/router-name router)
        -; :linear-router
        -
        - - -
        - -
        -
        -
        - -

        results matching ""

        -
          - -
          -
          - -

          No results matching ""

          - -
          -
          -
          - -
          -
          - -
          - - - - - - - - - - - - - - -
          - - -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

          Go to this page on cljdoc

          diff --git a/advanced/route_validation.html b/advanced/route_validation.html index df0be537..2481e1eb 100644 --- a/advanced/route_validation.html +++ b/advanced/route_validation.html @@ -1,1037 +1,9 @@ - - - - - - Route Validation · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          -
          - - - - - - - - -
          - -
          - -
          - - - - - - - - -
          -
          - -
          -
          - -
          - -

          Route validation

          -

          Namespace reitit.spec contains clojure.spec definitions for raw-routes, routes, router and router options.

          -

          Example

          -
          (require '[clojure.spec.alpha :as s])
          -(require '[reitit.spec :as spec])
          -
          -(def routes-from-db
          -  ["tenant1" ::tenant1])
          -
          -(s/valid? ::spec/raw-routes routes-from-db)
          -; false
          -
          -(s/explain ::spec/raw-routes routes-from-db)
          -; In: [0] val: "tenant1" fails spec: :reitit.spec/path at: [:route :path] predicate: (or (blank? %) (starts-with? % "/"))
          -; In: [0] val: "tenant1" fails spec: :reitit.spec/raw-route at: [:routes] predicate: (cat :path :reitit.spec/path :arg (? :reitit.spec/arg) :childs (* (and (nilable :reitit.spec/raw-route))))
          -; In: [1] val: :user/tenant1 fails spec: :reitit.spec/raw-route at: [:routes] predicate: (cat :path :reitit.spec/path :arg (? :reitit.spec/arg) :childs (* (and (nilable :reitit.spec/raw-route))))
          -; :clojure.spec.alpha/spec  :reitit.spec/raw-routes
          -; :clojure.spec.alpha/value  ["tenant1" :user/tenant1]
          -
          -

          At development time

          -

          reitit.core/router can be instrumented and use a tool like expound to pretty-print the spec problems.

          -

          First add a :dev dependency to:

          -
          [expound "0.4.0"] ; or higher
          -
          -

          Some bootstrapping:

          -
          (require '[clojure.spec.test.alpha :as stest])
          -(require '[expound.alpha :as expound])
          -(require '[clojure.spec.alpha :as s])
          -(require '[reitit.spec])
          -
          -(stest/instrument `reitit/router)
          -(set! s/*explain-out* expound/printer)
          -
          -

          And we are ready to go:

          -
          (require '[reitit.core :as r])
          -
          -(r/router
          -  ["/api"
          -   ["/public"
          -    ["/ping"]
          -    ["pong"]]])
          -
          -; CompilerException clojure.lang.ExceptionInfo: Call to #'reitit.core/router did not conform to spec:
          -;
          -; -- Spec failed --------------------
          -;
          -; Function arguments
          -;
          -; (["/api" ...])
          -;   ^^^^^^
          -;
          -;     should satisfy
          -;
          -; (clojure.spec.alpha/cat
          -;   :path
          -;   :reitit.spec/path
          -;   :arg
          -;   (clojure.spec.alpha/? :reitit.spec/arg)
          -;   :childs
          -;   (clojure.spec.alpha/*
          -;     (clojure.spec.alpha/and
          -;       (clojure.spec.alpha/nilable :reitit.spec/raw-route))))
          -;
          -; or
          -;
          -; (clojure.spec.alpha/cat
          -;   :path
          -;   :reitit.spec/path
          -;   :arg
          -;   (clojure.spec.alpha/? :reitit.spec/arg)
          -;   :childs
          -;   (clojure.spec.alpha/*
          -;     (clojure.spec.alpha/and
          -;       (clojure.spec.alpha/nilable :reitit.spec/raw-route))))
          -;
          -; -- Relevant specs -------
          -;
          -; :reitit.spec/raw-route:
          -; (clojure.spec.alpha/cat
          -;   :path
          -;   :reitit.spec/path
          -;   :arg
          -;   (clojure.spec.alpha/? :reitit.spec/arg)
          -;   :childs
          -;   (clojure.spec.alpha/*
          -;     (clojure.spec.alpha/and
          -;       (clojure.spec.alpha/nilable :reitit.spec/raw-route))))
          -; :reitit.spec/raw-routes:
          -; (clojure.spec.alpha/or
          -;   :route
          -;   :reitit.spec/raw-route
          -;   :routes
          -;   (clojure.spec.alpha/coll-of :reitit.spec/raw-route :into []))
          -;
          -; -- Spec failed --------------------
          -;
          -; Function arguments
          -;
          -; ([... [... ... ["pong"]]])
          -;                 ^^^^^^
          -;
          -;     should satisfy
          -;
          -; (fn
          -;   [%]
          -;   (or
          -;     (clojure.string/blank? %)
          -;     (clojure.string/starts-with? % "/")))
          -;
          -; or
          -;
          -; (fn
          -;   [%]
          -;   (or
          -;     (clojure.string/blank? %)
          -;     (clojure.string/starts-with? % "/")))
          -;
          -; -- Relevant specs -------
          -;
          -; :reitit.spec/path:
          -; (clojure.spec.alpha/and
          -;   clojure.core/string?
          -;   (clojure.core/fn
          -;     [%]
          -;     (clojure.core/or
          -;       (clojure.string/blank? %)
          -;       (clojure.string/starts-with? % "/"))))
          -; :reitit.spec/raw-route:
          -; (clojure.spec.alpha/cat
          -;   :path
          -;   :reitit.spec/path
          -;   :arg
          -;   (clojure.spec.alpha/? :reitit.spec/arg)
          -;   :childs
          -;   (clojure.spec.alpha/*
          -;     (clojure.spec.alpha/and
          -;       (clojure.spec.alpha/nilable :reitit.spec/raw-route))))
          -; :reitit.spec/raw-routes:
          -; (clojure.spec.alpha/or
          -;   :route
          -;   :reitit.spec/raw-route
          -;   :routes
          -;   (clojure.spec.alpha/coll-of :reitit.spec/raw-route :into []))
          -;
          -; -------------------------
          -; Detected 2 errors
          -
          - - -
          - -
          -
          -
          - -

          results matching ""

          -
            - -
            -
            - -

            No results matching ""

            - -
            -
            -
            - -
            -
            - -
            - - - - - - - - - - - - - - -
            - - -
            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

            Go to this page on cljdoc

            diff --git a/advanced/shared_routes.html b/advanced/shared_routes.html index f85d653c..6a38b8f8 100644 --- a/advanced/shared_routes.html +++ b/advanced/shared_routes.html @@ -1,958 +1,9 @@ - - - - - - Shared Routes · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            -
            - - - - - - - - -
            - -
            - -
            - - - - - - - - -
            -
            - -
            -
            - -
            - -

            Shared routes

            -

            As reitit-core works with both Clojure & ClojureScript, one can have a shared routing table for both the frontend and the backend application, using the Clojure Common Files.

            -

            For backend, you need to define a :handler for the request processing, for frontend, :name enables the use of reverse routing.

            -

            There are multiple options to use shared routing table.

            -

            Using reader conditionals

            -
            ;; define the handlers for clojure
            -#?(:clj (declare get-kikka))
            -#?(:clj (declare post-kikka))
            -
            -;; :name for both, :handler just for clojure
            -(def routes
            -  ["/kikka"
            -   {:name ::kikka
            -    #?@(:clj [:get {:handler get-kikka}])
            -    #?@(:clj [:post {:handler post-kikka}])}])
            -
            -

            Using custom expander

            -

            raw-routes can have any non-sequential data as a route argument, which gets expanded using the :expand option given to the reitit.core.router function. It defaults to reitit.core/expand multimethod.

            -

            First, define the common routes (in a .cljc file):

            -
            (def routes
            -  [["/kikka" ::kikka]
            -   ["/bar" ::bar]])
            -
            -

            Those can be used as-is from ClojureScript:

            -
            (require '[reitit.core :as r])
            -
            -(def router
            -  (r/router routes))
            -
            -(r/match-by-name router ::kikka)
            -;#Match{:template "/kikka"
            -;       :data {:name :user/kikka}
            -;       :result nil
            -;       :path-params nil
            -;       :path "/kikka"}
            -
            -

            For the backend, we can use a custom-expander to expand the routes:

            -
            (require '[reitit.ring :as ring])
            -(require '[reitit.core :as r])
            -
            -(defn my-expand [registry]
            -  (fn [data opts]
            -    (if (keyword? data)
            -      (some-> data
            -              registry
            -              (r/expand opts)
            -              (assoc :name data))
            -      (r/expand data opts))))
            -
            -;; the handler functions
            -(defn get-kikka [_] {:status 200, :body "get"})
            -(defn post-kikka [_] {:status 200, :body "post"})
            -(defn bar [_] {:status 200, :body "bar"})
            -
            -(def app
            -  (ring/ring-handler
            -    (ring/router
            -      [["/kikka" ::kikka]
            -       ["/bar" ::bar]]
            -      ;; use a custom expander
            -      {:expand (my-expand
            -                 {::kikka {:get get-kikka
            -                           :post post-kikka}
            -                  ::bar bar})})))
            -
            -(app {:request-method :post, :uri "/kikka"})
            -; {:status 200, :body "post"}
            -
            - - -
            - -
            -
            -
            - -

            results matching ""

            -
              - -
              -
              - -

              No results matching ""

              - -
              -
              -
              - -
              -
              - -
              - - - - - - - - - - - - - - -
              - - -
              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

              Go to this page on cljdoc

              diff --git a/basics/error_messages.html b/basics/error_messages.html index c71fe13f..ab685011 100644 --- a/basics/error_messages.html +++ b/basics/error_messages.html @@ -1,925 +1,9 @@ - - - - - - Error Messages · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
              -
              - - - - - - - - -
              - -
              - -
              - - - - - - - - -
              -
              - -
              -
              - -
              - -

              Error Messages

              -

              All exceptions thrown in router creation are caught, formatted and rethrown by the reitit.core/router function. Exception formatting is done by the exception formatter defined by the :exception router option.

              -

              Default Errors

              -

              The default exception formatting uses reitit.exception/exception. It produces single-color, partly human-readable, error messages.

              -
              (require '[reitit.core :as r])
              -
              -(r/router
              -  [["/ping"]
              -   ["/:user-id/orders"]
              -   ["/bulk/:bulk-id"]
              -   ["/public/*path"]
              -   ["/:version/status"]])
              -
              -

              Pretty error

              -

              Pretty Errors

              -
              [metosin/reitit-dev "0.5.5"]
              -
              -

              For human-readable and developer-friendly exception messages, there is reitit.dev.pretty/exception (in the reitit-dev module). It is inspired by the lovely errors messages of ELM and ETA and uses fipp, expound and spell-spec for most of heavy lifting.

              -
              (require '[reitit.dev.pretty :as pretty])
              -
              -(r/router
              -  [["/ping"]
              -   ["/:user-id/orders"]
              -   ["/bulk/:bulk-id"]
              -   ["/public/*path"]
              -   ["/:version/status"]]
              -  {:exception pretty/exception})
              -
              -

              Pretty error

              -

              Extending

              -

              Behind the scenes, both error formatters are backed by a multimethod, so they are easy to extend.

              -

              More examples

              -

              See the validating route data page.

              -

              Runtime Exception

              -

              See Exception Handling with Ring.

              - - -
              - -
              -
              -
              - -

              results matching ""

              -
                - -
                -
                - -

                No results matching ""

                - -
                -
                -
                - -
                -
                - -
                - - - - - - - - - - - - - - -
                - - -
                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                Go to this page on cljdoc

                diff --git a/basics/name_based_routing.html b/basics/name_based_routing.html index f04daa80..29fb45ec 100644 --- a/basics/name_based_routing.html +++ b/basics/name_based_routing.html @@ -1,960 +1,9 @@ - - - - - - Name-based Routing · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                -
                - - - - - - - - -
                - -
                - -
                - - - - - - - - -
                -
                - -
                -
                - -
                - -

                Name-based (reverse) Routing

                -

                All routes which have :name route data defined can also be matched by name.

                -

                Given a router:

                -
                (require '[reitit.core :as r])
                -
                -(def router
                -  (r/router
                -    ["/api"
                -     ["/ping" ::ping]
                -     ["/user/:id" ::user]]))
                -
                -

                Listing all route names:

                -
                (r/route-names router)
                -; [:user/ping :user/user]
                -
                -

                No match returns nil:

                -
                (r/match-by-name router ::kikka)
                -nil
                -
                -

                Matching a route:

                -
                (r/match-by-name router ::ping)
                -; #Match{:template "/api/ping"
                -;        :data {:name :user/ping}
                -;        :result nil
                -;        :path-params {}
                -;        :path "/api/ping"}
                -
                -

                If not all path-parameters are set, a PartialMatch is returned:

                -
                (r/match-by-name router ::user)
                -; #PartialMatch{:template "/api/user/:id",
                -;               :data {:name :user/user},
                -;               :result nil,
                -;               :path-params nil,
                -;               :required #{:id}}
                -
                -(r/partial-match? (r/match-by-name router ::user))
                -; true
                -
                -

                With provided path-parameters:

                -
                (r/match-by-name router ::user {:id "1"})
                -; #Match{:template "/api/user/:id"
                -;        :data {:name :user/user}
                -;        :path "/api/user/1"
                -;        :result nil
                -;        :path-params {:id "1"}}
                -
                -

                Path-parameters are automatically coerced into strings, with the help of (currently internal) Protocol reitit.impl/IntoString. It supports strings, numbers, booleans, keywords and objects:

                -
                (r/match-by-name router ::user {:id 1})
                -; #Match{:template "/api/user/:id"
                -;        :data {:name :user/user}
                -;        :path "/api/user/1"
                -;        :result nil
                -;        :path-params {:id "1"}}
                -
                -

                There is also an exception throwing version:

                -
                (r/match-by-name! router ::user)
                -; ExceptionInfo missing path-params for route /api/user/:id: #{:id}
                -
                -

                To turn a Match into a path, there is reitit.core/match->path:

                -
                (-> router
                -    (r/match-by-name ::user {:id 1})
                -    (r/match->path))
                -; "/api/user/1"
                -
                -

                It can take an optional map of query-parameters too:

                -
                (-> router
                -    (r/match-by-name ::user {:id 1})
                -    (r/match->path {:iso "möly"}))
                -; "/api/user/1?iso=m%C3%B6ly"
                -
                - - -
                - -
                -
                -
                - -

                results matching ""

                -
                  - -
                  -
                  - -

                  No results matching ""

                  - -
                  -
                  -
                  - -
                  -
                  - -
                  - - - - - - - - - - - - - - -
                  - - -
                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                  Go to this page on cljdoc

                  diff --git a/basics/path_based_routing.html b/basics/path_based_routing.html index e4c05883..e0efe54c 100644 --- a/basics/path_based_routing.html +++ b/basics/path_based_routing.html @@ -1,918 +1,9 @@ - - - - - - Path-based Routing · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                  -
                  - - - - - - - - -
                  - -
                  - -
                  - - - - - - - - -
                  -
                  - -
                  -
                  - -
                  - -

                  Path-based Routing

                  -

                  Path-based routing is done using the reitit.core/match-by-path function. It takes the router and path as arguments and returns one of the following:

                  -
                    -
                  • nil, no match
                  • -
                  • PartialMatch, path matched, missing path-parameters (only in reverse-routing)
                  • -
                  • Match, an exact match
                  • -
                  -

                  Given a router:

                  -
                  (require '[reitit.core :as r])
                  -
                  -(def router
                  -  (r/router
                  -    ["/api"
                  -     ["/ping" ::ping]
                  -     ["/user/:id" ::user]]))
                  -
                  -

                  No match returns nil:

                  -
                  (r/match-by-path router "/hello")
                  -; nil
                  -
                  -

                  Match provides the route information:

                  -
                  (r/match-by-path router "/api/user/1")
                  -; #Match{:template "/api/user/:id"
                  -;        :data {:name :user/user}
                  -;        :path "/api/user/1"
                  -;        :result nil
                  -;        :path-params {:id "1"}}
                  -
                  - - -
                  - -
                  -
                  -
                  - -

                  results matching ""

                  -
                    - -
                    -
                    - -

                    No results matching ""

                    - -
                    -
                    -
                    - -
                    -
                    - -
                    - - - - - - - - - - - - - - -
                    - - -
                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                    Go to this page on cljdoc

                    diff --git a/basics/route_conflicts.html b/basics/route_conflicts.html index b0c0bc4d..549085d1 100644 --- a/basics/route_conflicts.html +++ b/basics/route_conflicts.html @@ -1,974 +1,9 @@ - - - - - - Route Conflicts · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                    -
                    - - - - - - - - -
                    - -
                    - -
                    - - - - - - - - -
                    -
                    - -
                    -
                    - -
                    - -

                    Route Conflicts

                    -

                    We should fail fast if a router contains conflicting paths or route names.

                    -

                    When a Router is created via reitit.core/router, both path and route name conflicts are checked automatically. By default, in case of conflict, an ex-info is thrown with a descriptive message. In some (legacy api) cases, path conflicts should be allowed and one can override the path conflict resolution via :conflicts router option or via :conflicting route data.

                    -

                    Path Conflicts

                    -

                    Routes with path conflicts:

                    -
                    (require '[reitit.core :as r])
                    -
                    -(def routes
                    -  [["/ping"]
                    -   ["/:user-id/orders"]
                    -   ["/bulk/:bulk-id"]
                    -   ["/public/*path"]
                    -   ["/:version/status"]])
                    -
                    -

                    Creating router with defaults:

                    -
                    (r/router routes)
                    -; CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route paths:
                    -;
                    -; -> /:user-id/orders
                    -; -> /public/*path
                    -; -> /bulk/:bulk-id
                    -;
                    -; -> /bulk/:bulk-id
                    -; -> /:version/status
                    -;
                    -; -> /public/*path
                    -; -> /:version/status
                    -;
                    -
                    -

                    To ignore the conflicts:

                    -
                    (r/router
                    -  routes
                    -  {:conflicts nil})
                    -; => #object[reitit.core$quarantine_router$reify
                    -
                    -

                    To just log the conflicts:

                    -
                    (require '[reitit.exception :as exception])
                    -
                    -(r/router
                    -  routes
                    -  {:conflicts (fn [conflicts]
                    -                (println (exception/format-exception :path-conflicts nil conflicts)))})
                    -; Router contains conflicting route paths:
                    -;
                    -; -> /:user-id/orders
                    -; -> /public/*path
                    -; -> /bulk/:bulk-id
                    -;
                    -; -> /bulk/:bulk-id
                    -; -> /:version/status
                    -;
                    -; -> /public/*path
                    -; -> /:version/status
                    -;
                    -; => #object[reitit.core$quarantine_router$reify]
                    -
                    -

                    Alternatively, you can ignore conflicting paths individually via :conflicting in route data:

                    -
                    (def routes
                    -  [["/ping"]
                    -   ["/:user-id/orders" {:conflicting true}]
                    -   ["/bulk/:bulk-id" {:conflicting true}]
                    -   ["/public/*path" {:conflicting true}]
                    -   ["/:version/status" {:conflicting true}]])
                    -; => #'user/routes
                    -(r/router routes)
                    -;  => #object[reitit.core$quarantine_router$reify]
                    -
                    -

                    Name conflicts

                    -

                    Routes with name conflicts:

                    -
                    (def routes
                    -  [["/ping" ::ping]
                    -   ["/admin" ::admin]
                    -   ["/admin/ping" ::ping]])
                    -
                    -

                    Creating router with defaults:

                    -
                    (r/router routes)
                    -;CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route names:
                    -;
                    -;:reitit.core/ping
                    -;-> /ping
                    -;-> /admin/ping
                    -;
                    -
                    -

                    There is no way to disable the name conflict resolution.

                    - - -
                    - -
                    -
                    -
                    - -

                    results matching ""

                    -
                      - -
                      -
                      - -

                      No results matching ""

                      - -
                      -
                      -
                      - -
                      -
                      - -
                      - - - - - - - - - - - - - - -
                      - - -
                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                      Go to this page on cljdoc

                      diff --git a/basics/route_data.html b/basics/route_data.html index 780a0bb2..83dc2232 100644 --- a/basics/route_data.html +++ b/basics/route_data.html @@ -1,1012 +1,9 @@ - - - - - - Route Data · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      -
                      - - - - - - - - -
                      - -
                      - -
                      - - - - - - - - -
                      -
                      - -
                      -
                      - -
                      - -

                      Route Data

                      -

                      Route data is the key feature of reitit. Routes can have any map-like data attached to them, to be interpreted by the client application, Router or routing components like Middleware or Interceptors.

                      -
                      [["/ping" {:name ::ping}]
                      - ["/pong" {:handler identity}]
                      - ["/users" {:get {:roles #{:admin}
                      -                  :handler identity}}]]
                      -
                      -

                      Besides map-like data, raw routes can have any non-sequential route argument after the path. This argument is expanded by Router (via :expand option) into route data at router creation time.

                      -

                      By default, Keywords are expanded into :name and functions into :handler keys.

                      -
                      (require '[reitit.core :as r])
                      -
                      -(def router
                      -  (r/router
                      -    [["/ping" ::ping]
                      -     ["/pong" identity]
                      -     ["/users" {:get {:roles #{:admin}
                      -                      :handler identity}}]]))
                      -
                      -

                      Using Route Data

                      -

                      Expanded route data can be retrieved from a router with routes and is returned with match-by-path and match-by-name in case of a route match.

                      -
                      (r/routes router)
                      -; [["/ping" {:name ::ping}]
                      -;  ["/pong" {:handler identity]}
                      -;  ["/users" {:get {:roles #{:admin}
                      -;                   :handler identity}}]]
                      -
                      -
                      (r/match-by-path router "/ping")
                      -; #Match{:template "/ping"
                      -;        :data {:name :user/ping}
                      -;        :result nil
                      -;        :path-params {}
                      -;        :path "/ping"}
                      -
                      -
                      (r/match-by-name router ::ping)
                      -; #Match{:template "/ping"
                      -;        :data {:name :user/ping}
                      -;        :result nil
                      -;        :path-params {}
                      -;        :path "/ping"}
                      -
                      -

                      Nested Route Data

                      -

                      For nested route trees, route data is accumulated recursively from root towards leafs using meta-merge. Default behavior for collections is :append, but this can be overridden to :prepend, :replace or :displace using the target meta-data.

                      -

                      An example router with nested data:

                      -
                      (def router
                      -  (r/router
                      -    ["/api" {:interceptors [::api]}
                      -     ["/ping" ::ping]
                      -     ["/admin" {:roles #{:admin}}
                      -      ["/users" ::users]
                      -      ["/db" {:interceptors [::db]
                      -              :roles ^:replace #{:db-admin}}]]]))
                      -
                      -

                      Resolved route tree:

                      -
                      (r/routes router)
                      -; [["/api/ping" {:interceptors [::api]
                      -;                :name :user/ping}]
                      -;  ["/api/admin/users" {:interceptors [::api]
                      -;                       :roles #{:admin}
                      -;                       :name ::users} nil]
                      -;  ["/api/admin/db" {:interceptors [::api ::db]
                      -;                    :roles #{:db-admin}}]]
                      -
                      -

                      Route Data Fragments

                      -

                      Just like fragments in React.js, we can create routing tree fragments by using empty path "". This allows us to add route data without accumulating to path.

                      -

                      Given a route tree:

                      -
                      [["/swagger.json" ::swagger]
                      - ["/api-docs" ::api-docs]
                      - ["/api/ping" ::ping]
                      - ["/api/pong" ::pong]]
                      -
                      -

                      Adding :no-doc route data to exclude the first routes from generated Swagger documentation:

                      -
                      [["" {:no-doc true}
                      -  ["/swagger.json" ::swagger]
                      -  ["/api-docs" ::api-docs]]
                      - ["/api/ping" ::ping]
                      - ["/api/pong" ::pong]]
                      -
                      -

                      Accumulated route data:

                      -
                      (def router
                      -  (r/router
                      -    [["" {:no-doc true}
                      -      ["/swagger.json" ::swagger]
                      -      ["/api-docs" ::api-docs]]
                      -     ["/api/ping" ::ping]
                      -     ["/api/pong" ::pong]]))
                      -
                      -(r/routes router)
                      -; [["/swagger.json" {:no-doc true, :name ::swagger}]
                      -;  ["/api-docs" {:no-doc true, :name ::api-docs}]
                      -;  ["/api/ping" {:name ::ping}]
                      -;  ["/api/pong" {:name ::pong}]]
                      -
                      -

                      Top-level Route Data

                      -

                      Route data can be introduced also via Router option :data:

                      -
                      (def router
                      -  (r/router
                      -    ["/api"
                      -     {:middleware [::api]}
                      -     ["/ping" ::ping]
                      -     ["/pong" ::pong]]
                      -    {:data {:middleware [::session]}}))
                      -
                      -

                      Expanded routes:

                      -
                      [["/api/ping" {:middleware [::session ::api], :name ::ping}]
                      - ["/api/pong" {:middleware [::session ::api], :name ::pong}]]
                      -
                      -

                      Customizing Expansion

                      -

                      By default, router :expand option has value r/expand function, backed by a r/Expand protocol. Expansion can be customized either by swapping the :expand implementation or by extending the Protocol. r/Expand implementations can be recursive.

                      -

                      Naive example to add direct support for java.io.File route argument:

                      -
                      (extend-type java.io.File
                      -  r/Expand
                      -  (expand [file options]
                      -    (r/expand
                      -      #(slurp file)
                      -      options)))
                      -
                      -(r/router
                      -  ["/" (java.io.File. "index.html")])
                      -
                      -

                      Page shared routes has an example of an custom :expand implementation.

                      -

                      Route data validation

                      -

                      See Route data validation.

                      - - -
                      - -
                      -
                      -
                      - -

                      results matching ""

                      -
                        - -
                        -
                        - -

                        No results matching ""

                        - -
                        -
                        -
                        - -
                        -
                        - -
                        - - - - - - - - - - - - - - -
                        - - -
                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                        Go to this page on cljdoc

                        diff --git a/basics/route_data_validation.html b/basics/route_data_validation.html index 02ee23d7..9ca407fb 100644 --- a/basics/route_data_validation.html +++ b/basics/route_data_validation.html @@ -1,989 +1,9 @@ - - - - - - Route Data Validation · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                        -
                        - - - - - - - - -
                        - -
                        - -
                        - - - - - - - - -
                        -
                        - -
                        -
                        - -
                        - -

                        Route Data Validation

                        -

                        Route data can be anything, so it's easy to go wrong. Accidentally adding a :role key instead of :roles might hinder the whole routing app without any authorization in place.

                        -

                        To fail fast, we could use the custom :coerce and :compile hooks to apply data validation and throw exceptions on first sighted problem.

                        -

                        But there is a better way. Router has a :validation hook to validate the whole route tree after it's successfully compiled. It expects a 2-arity function routes opts => () that can side-effect in case of validation errors.

                        -

                        clojure.spec

                        -

                        Namespace reitit.spec contains specs for main parts of reitit.core and a helper function validate that runs spec validation for all route data and throws an exception if any errors are found.

                        -

                        A Router with invalid route data:

                        -
                        (require '[reitit.core :as r])
                        -
                        -(r/router
                        -  ["/api" {:handler "identity"}])
                        -; #object[reitit.core$...]
                        -
                        -

                        Failing fast with clojure.spec validation turned on:

                        -
                        (require '[reitit.spec :as rs])
                        -
                        -(r/router
                        -  ["/api" {:handler "identity"}]
                        -  {:validate rs/validate})
                        -; CompilerException clojure.lang.ExceptionInfo: Invalid route data:
                        -;
                        -; -- On route -----------------------
                        -;
                        -; "/api"
                        -;
                        -; In: [:handler] val: "identity" fails spec: :reitit.spec/handler at: [:handler] predicate: fn?
                        -;
                        -; {:problems (#reitit.spec.Problem{:path "/api", :scope nil, :data {:handler "identity"}, :spec :reitit.spec/default-data, :problems #:clojure.spec.alpha{:problems ({:path [:handler], :pred clojure.core/fn?, :val "identity", :via [:reitit.spec/default-data :reitit.spec/handler], :in [:handler]}), :spec :reitit.spec/default-data, :value {:handler "identity"}}})}, compiling: ...
                        -
                        -

                        Pretty errors

                        -

                        Turning on Pretty Errors will give much nicer error messages:

                        -
                        (require '[reitit.dev.pretty :as pretty])
                        -
                        -(r/router
                        -  ["/api" {:handler "identity"}]
                        -  {:validate rs/validate
                        -   :exception pretty/exception})
                        -
                        -

                        Pretty error

                        -

                        Customizing spec validation

                        -

                        rs/validate reads the following router options:

                        - - - - - - - - - - - - - - - - - -
                        keydescription
                        :specthe spec to verify the route data (default ::rs/default-data)
                        :reitit.spec/wrapfunction of spec => spec to wrap all route specs
                        -

                        NOTE: clojure.spec implicitly validates all values with fully-qualified keys if specs exist with the same name.

                        -

                        Invalid spec value:

                        -
                        (require '[clojure.spec.alpha :as s])
                        -
                        -(s/def ::role #{:admin :manager})
                        -(s/def ::roles (s/coll-of ::role :into #{}))
                        -
                        -(r/router
                        -  ["/api" {:handler identity
                        -           ::roles #{:adminz}}]
                        -  {:validate rs/validate
                        -  :exception pretty/exception})
                        -
                        -

                        Invalid Role Error

                        -

                        Closed Specs

                        -

                        To fail-fast on non-defined and misspelled keys on route data, we can close the specs using :reitit.spec/wrap options with value of spec-tools.spell/closed that closed the top-level specs.

                        -

                        Requiring a:description and validating using closed specs:

                        -
                        (require '[spec-tools.spell :as spell])
                        -
                        -(s/def ::description string?)
                        -
                        -(r/router
                        -  ["/api" {:summary "kikka"}]
                        -  {:validate rs/validate
                        -   :spec (s/merge ::rs/default-data
                        -                  (s/keys :req-un [::description]))
                        -   ::rs/wrap spell/closed
                        -   :exception pretty/exception})
                        -
                        -

                        Closed Spec error

                        -

                        It catches also typing errors:

                        -
                        (r/router
                        -  ["/api" {:descriptionz "kikka"}]
                        -  {:validate rs/validate
                        -   :spec (s/merge ::rs/default-data
                        -                  (s/keys :req-un [::description]))
                        -   ::rs/wrap spell/closed
                        -   :exception pretty/exception})
                        -
                        -

                        Closed Spec error

                        - - -
                        - -
                        -
                        -
                        - -

                        results matching ""

                        -
                          - -
                          -
                          - -

                          No results matching ""

                          - -
                          -
                          -
                          - -
                          -
                          - -
                          - - - - - - - - - - - - - - -
                          - - -
                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                          Go to this page on cljdoc

                          diff --git a/basics/route_syntax.html b/basics/route_syntax.html index 69a7afd9..a3c9ba3d 100644 --- a/basics/route_syntax.html +++ b/basics/route_syntax.html @@ -1,996 +1,9 @@ - - - - - - Route Syntax · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                          -
                          - - - - - - - - -
                          - -
                          - -
                          - - - - - - - - -
                          -
                          - -
                          -
                          - -
                          - -

                          Route Syntax

                          -

                          Routes are defined as vectors of String path and optional (non-sequential) route argument child routes.

                          -

                          Routes can be wrapped in vectors and lists and nil routes are ignored.

                          -

                          Paths can have path-parameters (:id) or catch-all-parameters (*path). Parameters can also be wrapped in brackets, enabling use of qualified keywords {user/id}, {*user/path}. By default, both syntaxes are supported, see configuring routers on how to change this.

                          -

                          Examples

                          -

                          Simple route:

                          -
                          ["/ping"]
                          -
                          -

                          Two routes:

                          -
                          [["/ping"]
                          - ["/pong"]]
                          -
                          -

                          Routes with route arguments:

                          -
                          [["/ping" ::ping]
                          - ["/pong" {:name ::pong}]]
                          -
                          -

                          Routes with path parameters:

                          -
                          [["/users/:user-id"]
                          - ["/api/:version/ping"]]
                          -
                          -
                          [["/users/{user-id}"]
                          - ["/files/file-{number}.pdf"]]
                          -
                          -

                          Route with catch-all parameter:

                          -
                          ["/public/*path"]
                          -
                          -
                          ["/public/{*path}"]
                          -
                          -

                          Nested routes:

                          -
                          ["/api"
                          - ["/admin" {:middleware [::admin]}
                          -  ["" ::admin]
                          -  ["/db" ::db]]
                          - ["/ping" ::ping]]
                          -
                          -

                          Same routes flattened:

                          -
                          [["/api/admin" {:middleware [::admin], :name ::admin}]
                          - ["/api/admin/db" {:middleware [::admin], :name ::db}]
                          - ["/api/ping" {:name ::ping}]]
                          -
                          -

                          Encoding

                          -

                          Reitit does not apply any encoding to your paths. If you need that, you must encode them yourself. E.g., /foo bar should be /foo%20bar.

                          -

                          Wildcards

                          -

                          Normal path-parameters (:id) can start anywhere in the path string, but have to end either to slash / (currently hardcoded) or to an end of path string:

                          -
                          [["/api/:version"]
                          - ["/files/file-:number"]
                          - ["/user/:user-id/orders"]]
                          -
                          -

                          Bracket path-parameters can start and stop anywhere in the path-string, the following character is used as a terminator.

                          -
                          [["/api/{version}"]
                          - ["/files/{name}.{extension}"]
                          - ["/user/{user-id}/orders"]]
                          -
                          -

                          Having multiple terminators after a bracket path-path parameter with identical path prefix will cause a compile-time error at router creation:

                          -
                          [["/files/file-{name}.pdf"]            ;; terminator \.
                          - ["/files/file-{name}-{version}.pdf"]] ;; terminator \-
                          -
                          -

                          Slash Free Routing

                          -
                          [["broker.{customer}.{device}.{*data}"]
                          - ["events.{target}.{type}"]]
                          -
                          -

                          Generating routes

                          -

                          Routes are just data, so it's easy to create them programmatically:

                          -
                          (defn cqrs-routes [actions]
                          -  ["/api" {:interceptors [::api ::db]}
                          -   (for [[type interceptor] actions
                          -         :let [path (str "/" (name interceptor))
                          -               method (case type
                          -                        :query :get
                          -                        :command :post)]]
                          -     [path {method {:interceptors [interceptor]}}])])
                          -
                          -
                          (cqrs-routes
                          -  [[:query   'get-user]
                          -   [:command 'add-user]
                          -   [:command 'add-order]])
                          -; ["/api" {:interceptors [::api ::db]}
                          -;  (["/get-user" {:get {:interceptors [get-user]}}]
                          -;   ["/add-user" {:post {:interceptors [add-user]}}]
                          -;   ["/add-order" {:post {:interceptors [add-order]}}])]
                          -
                          -

                          Explicit path-parameter syntax

                          -

                          Router options :syntax allows the path-parameter syntax to be explicitely defined. It takes a keyword or set of keywords as a value. Valid values are :colon and :bracket. Default value is #{:colon :bracket}.

                          -

                          With defaults:

                          -
                          (-> (r/router
                          -      ["http://localhost:8080/api/user/{id}" ::user-by-id])
                          -    (r/match-by-path "http://localhost:8080/api/user/123"))
                          -;#Match{:template "http://localhost:8080/api/user/{id}",
                          -;       :data {:name :user/user-by-id},
                          -;       :result nil,
                          -;       :path-params {:id "123", :8080 ":8080"},
                          -;       :path "http://localhost:8080/api/user/123"}
                          -
                          -

                          Supporting only :bracket syntax:

                          -
                          (require '[reitit.core :as r])
                          -
                          -(-> (r/router
                          -      ["http://localhost:8080/api/user/{id}" ::user-by-id]
                          -      {:syntax :bracket})
                          -    (r/match-by-path "http://localhost:8080/api/user/123"))
                          -;#Match{:template "http://localhost:8080/api/user/{id}",
                          -;       :data {:name :user/user-by-id},
                          -;       :result nil,
                          -;       :path-params {:id "123"},
                          -;       :path "http://localhost:8080/api/user/123"}
                          -
                          - - -
                          - -
                          -
                          -
                          - -

                          results matching ""

                          -
                            - -
                            -
                            - -

                            No results matching ""

                            - -
                            -
                            -
                            - -
                            -
                            - -
                            - - - - - - - - - - - - - - -
                            - - -
                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                            Go to this page on cljdoc

                            diff --git a/basics/router.html b/basics/router.html index bd6b17c6..3c064463 100644 --- a/basics/router.html +++ b/basics/router.html @@ -1,972 +1,9 @@ - - - - - - Router · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                            -
                            - - - - - - - - -
                            - -
                            - -
                            - - - - - - - - -
                            -
                            - -
                            -
                            - -
                            - -

                            Router

                            -

                            Routes are just data and to do routing, we need a router instance satisfying the reitit.core/Router protocol. Routers are created with reitit.core/router function, taking the raw routes and optionally an options map.

                            -

                            The Router protocol:

                            -
                            (defprotocol Router
                            -  (router-name [this])
                            -  (routes [this])
                            -  (options [this])
                            -  (route-names [this])
                            -  (match-by-path [this path])
                            -  (match-by-name [this name] [this name params]))
                            -
                            -

                            Creating a router:

                            -
                            (require '[reitit.core :as r])
                            -
                            -(def router
                            -  (r/router
                            -    ["/api"
                            -     ["/ping" ::ping]
                            -     ["/user/:id" ::user]]))
                            -
                            -

                            Name of the created router:

                            -
                            (r/router-name router)
                            -; :mixed-router
                            -
                            -

                            The flattened route tree:

                            -
                            (r/routes router)
                            -; [["/api/ping" {:name :user/ping}]
                            -;  ["/api/user/:id" {:name :user/user}]]
                            -
                            -

                            With a router instance, we can do Path-based routing or Name-based (Reverse) routing.

                            -

                            More details

                            -

                            Router options:

                            -
                            (r/options router)
                            -{:lookup #object[...]
                            - :expand #object[...]
                            - :coerce #object[...]
                            - :compile #object[...]
                            - :conflicts #object[...]}
                            -
                            -

                            Route names:

                            -
                            (r/route-names router)
                            -; [:user/ping :user/user]
                            -
                            -

                            The compiled route tree:

                            -
                            (r/routes router)
                            -; [["/api/ping" {:name :user/ping} nil]
                            -;  ["/api/user/:id" {:name :user/user} nil]]
                            -
                            -

                            Composing

                            -

                            As routes are defined as plain data, it's easy to merge multiple route trees into a single router

                            -
                            (def user-routes
                            -  [["/users" ::users]
                            -   ["/users/:id" ::user]]) 
                            -
                            -(def admin-routes
                            -  ["/admin"
                            -   ["/ping" ::ping]
                            -   ["/db" ::db]])
                            -
                            -(r/router
                            -  [admin-routes
                            -   user-routes])
                            -
                            -

                            Merged route tree:

                            -
                            (r/routes router)
                            -; [["/admin/ping" {:name :user/ping}]
                            -;  ["/admin/db" {:name :user/db}]
                            -;  ["/users" {:name :user/users}]
                            -;  ["/users/:id" {:name :user/user}]]
                            -
                            -

                            More details on composing routers.

                            -

                            Behind the scenes

                            -

                            When router is created, the following steps are done:

                            -
                              -
                            • route tree is flattened
                            • -
                            • route arguments are expanded (via :expand option)
                            • -
                            • routes are coerced (via :coerce options)
                            • -
                            • route tree is compiled (via :compile options)
                            • -
                            • route conflicts are resolved (via :conflicts options)
                            • -
                            • optionally, route data is validated (via :validate options)
                            • -
                            • router implementation is automatically selected (or forced via :router options) and created
                            • -
                            - - -
                            - -
                            -
                            -
                            - -

                            results matching ""

                            -
                              - -
                              -
                              - -

                              No results matching ""

                              - -
                              -
                              -
                              - -
                              -
                              - -
                              - - - - - - - - - - - - - - -
                              - - -
                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                              Go to this page on cljdoc

                              diff --git a/cljdoc.edn b/cljdoc.edn deleted file mode 100644 index b7ed9571..00000000 --- a/cljdoc.edn +++ /dev/null @@ -1,70 +0,0 @@ -{:cljdoc/include-namespaces-from-dependencies - [metosin/reitit - metosin/reitit-core - metosin/reitit-dev - metosin/reitit-ring - metosin/reitit-http - metosin/reitit-middleware - metosin/reitit-interceptors - metosin/reitit-spec - metosin/reitit-schema - metosin/reitit-swagger - metosin/reitit-swagger-ui - metosin/reitit-frontend - metosin/reitit-sieppari - metosin/reitit-pedestal] - :cljdoc.doc/tree - [["Introduction" {:file "doc/README.md"}] - ["Basics" {} - ["Route Syntax" {:file "doc/basics/route_syntax.md"}] - ["Router" {:file "doc/basics/router.md"}] - ["Path-based Routing" {:file "doc/basics/path_based_routing.md"}] - ["Name-based Routing" {:file "doc/basics/name_based_routing.md"}] - ["Route Data" {:file "doc/basics/route_data.md"}] - ["Route Data Validation" {:file "doc/basics/route_data_validation.md"}] - ["Route Conflicts" {:file "doc/basics/route_conflicts.md"}] - ["Error Messages" {:file "doc/basics/error_messages.md"}]] - ["Coercion" {} - ["Coercion Explained" {:file "doc/coercion/coercion.md"}] - ["Plumatic Schema" {:file "doc/coercion/schema_coercion.md"}] - ["Clojure.spec" {:file "doc/coercion/clojure_spec_coercion.md"}] - ["Data-specs" {:file "doc/coercion/data_spec_coercion.md"}]] - ["Ring" {} - ["Ring-router" {:file "doc/ring/ring.md"}] - ["Reverse-routing" {:file "doc/ring/reverse_routing.md"}] - ["Default handler" {:file "doc/ring/default_handler.md"}] - ["Slash handler" {:file "doc/ring/slash_handler.md"}] - ["Static Resources" {:file "doc/ring/static.md"}] - ["Dynamic Extensions" {:file "doc/ring/dynamic_extensions.md"}] - ["Data-driven Middleware" {:file "doc/ring/data_driven_middleware.md"}] - ["Transforming Middleware Chain" {:file "doc/ring/transforming_middleware_chain.md"}] - ["Middleware Registry" {:file "doc/ring/middleware_registry.md"}] - ["Exception Handling with Ring" {:file "doc/ring/exceptions.md"}] - ["Default Middleware" {:file "doc/ring/default_middleware.md"}] - ["Content Negotiation" {:file "doc/ring/content_negotiation.md"}] - ["Pluggable Coercion" {:file "doc/ring/coercion.md"}] - ["Route Data Validation" {:file "doc/ring/route_data_validation.md"}] - ["Compiling Middleware" {:file "doc/ring/compiling_middleware.md"}] - ["Swagger Support" {:file "doc/ring/swagger.md"}] - ["RESTful form methods" {:file "doc/ring/RESTful_form_methods.md"}]] - ["HTTP" {} - ["Interceptors" {:file "doc/http/interceptors.md"}] - ["Pedestal" {:file "doc/http/pedestal.md"}] - ["Sieppari" {:file "doc/http/sieppari.md"}] - ["Default Interceptors" {:file "doc/http/default_interceptors.md"}] - ["Transforming Interceptor Chain" {:file "doc/http/transforming_interceptor_chain.md"}]] - ["Frontend" {} - ["Basics" {:file "doc/frontend/basics.md"}] - ["Browser integration" {:file "doc/frontend/browser.md"}] - ["Controllers" {:file "doc/frontend/controllers.md"}]] - ["Advanced" {} - ["Configuring Routers" {:file "doc/advanced/configuring_routers.md"}] - ["Composing Routers" {:file "doc/advanced/composing_routers.md"}] - ["Different Routers" {:file "doc/advanced/different_routers.md"}] - ["Route Validation" {:file "doc/advanced/route_validation.md"}] - ["Dev Workflow" {:file "doc/advanced/dev_workflow.md"}] - ["Shared Routes" {:file "doc/advanced/shared_routes.md"}]] - ["Misc" {} - ["Performance" {:file "doc/performance.md"}] - ["Development Instructions" {:file "doc/development.md"}] - ["FAQ" {:file "doc/faq.md"}]]]} diff --git a/coercion/clojure_spec_coercion.html b/coercion/clojure_spec_coercion.html index 968bd4fa..4f536e46 100644 --- a/coercion/clojure_spec_coercion.html +++ b/coercion/clojure_spec_coercion.html @@ -1,1037 +1,9 @@ - - - - - - Clojure.spec · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                              -
                              - - - - - - - - -
                              - -
                              - -
                              - - - - - - - - -
                              -
                              - -
                              -
                              - -
                              - -

                              Clojure.spec Coercion

                              -

                              The clojure.spec library specifies the structure of data, validates or destructures it, and can generate data based on the spec.

                              -

                              Warning

                              -

                              clojure.spec by itself doesn't support coercion. reitit uses spec-tools that adds coercion to spec. Like clojure.spec, it's alpha as it leans both on spec walking and clojure.spec.alpha/conform, which is considered a spec internal, that might be changed or removed later.

                              -

                              Usage

                              -

                              For simple specs (core predicates, spec-tools.core/spec, s/and, s/or, s/coll-of, s/keys, s/map-of, s/nillable and s/every), the transformation is inferred using spec-walker and is automatic. To support all specs (like regex-specs), specs need to be wrapped into Spec Records.

                              -

                              There are CLJ-2116 and CLJ-2251 that would help solve this elegantly. Go vote 'em up.

                              -

                              Example

                              -
                              (require '[reitit.coercion.spec])
                              -(require '[reitit.coercion :as coercion])
                              -(require '[spec-tools.spec :as spec])
                              -(require '[clojure.spec.alpha :as s])
                              -(require '[reitit.core :as r])
                              -
                              -;; simple specs, inferred
                              -(s/def ::company string?)
                              -(s/def ::user-id int?)
                              -(s/def ::path-params (s/keys :req-un [::company ::user-id]))
                              -
                              -(def router
                              -  (r/router
                              -    ["/:company/users/:user-id" {:name ::user-view
                              -                                 :coercion reitit.coercion.spec/coercion
                              -                                 :parameters {:path ::path-params}}]
                              -    {:compile coercion/compile-request-coercers}))
                              -
                              -(defn match-by-path-and-coerce! [path]
                              -  (if-let [match (r/match-by-path router path)]
                              -    (assoc match :parameters (coercion/coerce! match))))
                              -
                              -

                              Successful coercion:

                              -
                              (match-by-path-and-coerce! "/metosin/users/123")
                              -; #Match{:template "/:company/users/:user-id",
                              -;        :data {:name :user/user-view,
                              -;               :coercion <<:spec>>
                              -;               :parameters {:path ::path-params}},
                              -;        :result {:path #object[reitit.coercion$request_coercer$]},
                              -;        :path-params {:company "metosin", :user-id "123"},
                              -;        :parameters {:path {:company "metosin", :user-id 123}}
                              -;        :path "/metosin/users/123"}
                              -
                              -

                              Failing coercion:

                              -
                              (match-by-path-and-coerce! "/metosin/users/ikitommi")
                              -; => ExceptionInfo Request coercion failed...
                              -
                              -

                              Deeply nested

                              -

                              Spec-tools allow deeply nested specs to be coerced. One can test the coercion easily in the REPL.

                              -

                              Define some specs:

                              -
                              (require '[clojure.spec.alpha :as s])
                              -(require '[spec-tools.core :as st])
                              -
                              -(s/def :sku/id keyword?)
                              -(s/def ::sku (s/keys :req-un [:sku/id]))
                              -(s/def ::skus (s/coll-of ::sku :into []))
                              -
                              -(s/def :photo/id int?)
                              -(s/def ::photo (s/keys :req-un [:photo/id]))
                              -(s/def ::photos (s/coll-of ::photo :into []))
                              -
                              -(s/def ::my-json-api (s/keys :req-un [::skus ::photos]))
                              -
                              -

                              Apply a string->edn coercion to the data:

                              -
                              (st/coerce
                              -  ::my-json-api
                              -  {:skus [{:id "123"}]
                              -   :photos [{:id "123"}]}
                              -  st/string-transformer)
                              -; {:skus [{:id :123}]
                              -;  :photos [{:id 123}]}
                              -
                              -

                              Apply a json->edn coercion to the data:

                              -
                              (st/coerce
                              -  ::my-json-api
                              -  {:skus [{:id "123"}]
                              -   :photos [{:id "123"}]}
                              -  st/json-transformer)
                              -; {:skus [{:id :123}]
                              -;  :photos [{:id "123"}]}
                              -
                              -

                              By default, reitit uses custom transformers that also strip out extra keys from s/keys specs:

                              -
                              (require '[reitit.coercion.spec :as rcs])
                              -
                              -(st/coerce
                              -  ::my-json-api
                              -  {:TOO "MUCH"
                              -   :skus [{:id "123"
                              -           :INFOR "MATION"}]
                              -   :photos [{:id "123"
                              -             :HERE "TOO"}]}
                              -  rcs/json-transformer)
                              -; {:skus [{:id :123}]
                              -;  :photos [{:id "123"}]}
                              -
                              -

                              Defining Optional Keys

                              -

                              Going back to the previous example.

                              -

                              Suppose you want the ::my-json-api to have optional remarks as string and each photo to have an optional height and width as integer. -The s/keys accepts :opt-un to support optional keys.

                              -
                              (require '[clojure.spec.alpha :as s])
                              -(require '[spec-tools.core :as st])
                              -
                              -(s/def :sku/id keyword?)
                              -(s/def ::sku (s/keys :req-un [:sku/id]))
                              -(s/def ::skus (s/coll-of ::sku :into []))
                              -(s/def ::remarks string?)  ;; define remarks as string
                              -
                              -(s/def :photo/id int?)
                              -(s/def :photo/height int?) ;; define height as int
                              -(s/def :photo/width int?)  ;; define width as int
                              -(s/def ::photo (s/keys :req-un [:photo/id]
                              -                       :opt-un [:photo/height :photo/width])) ;; height and width are in :opt-un
                              -(s/def ::photos (s/coll-of ::photo :into []))
                              -
                              -(s/def ::my-json-api (s/keys :req-un [::skus ::photos]
                              -                             :opt-un [::remarks])) ;; remarks is in the :opt-un
                              -
                              -

                              Apply a string->edn coercion to the data:

                              -
                              ;; Omit optional keys
                              -(st/coerce
                              -  ::my-json-api
                              -  {:skus [{:id "123"}]
                              -   :photos [{:id "123"}]}
                              -  st/string-transformer)
                              -;;{:skus [{:id :123}],
                              -;; :photos [{:id 123}]}
                              -
                              -
                              -;; coerce the optional keys if present
                              -
                              -(st/coerce
                              -  ::my-json-api
                              -  {:skus [{:id "123"}]
                              -   :photos [{:id "123" :height "100" :width "100"}]
                              -   :remarks "some remarks"}
                              -  st/string-transformer)
                              -
                              -;; {:skus [{:id :123}]
                              -;;  :photos [{:id 123 :height 100 :width 100}]
                              -;;  :remarks "some remarks"}
                              -
                              -(st/coerce
                              -  ::my-json-api
                              -  {:skus [{:id "123"}]
                              -   :photos [{:id "123" :height "100"}]}
                              -  st/string-transformer)
                              -;; {:skus [{:id :123}],
                              -;;  :photos [{:id 123, :height 100}]}
                              -
                              - - -
                              - -
                              -
                              -
                              - -

                              results matching ""

                              -
                                - -
                                -
                                - -

                                No results matching ""

                                - -
                                -
                                -
                                - -
                                -
                                - -
                                - - - - - - - - - - - - - - -
                                - - -
                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                Go to this page on cljdoc

                                diff --git a/coercion/coercion.html b/coercion/coercion.html index 10d32ce3..74e5369b 100644 --- a/coercion/coercion.html +++ b/coercion/coercion.html @@ -1,1026 +1,9 @@ - - - - - - Coercion Explained · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                -
                                - - - - - - - - -
                                - -
                                - -
                                - - - - - - - - -
                                -
                                - -
                                -
                                - -
                                - -

                                Coercion Explained

                                -

                                Coercion is a process of transforming parameters (and responses) from one format into another. Reitit separates routing and coercion into two separate steps.

                                -

                                By default, all wildcard and catch-all parameters are parsed into strings:

                                -
                                (require '[reitit.core :as r])
                                -
                                -(def router
                                -  (r/router
                                -    ["/:company/users/:user-id" ::user-view]))
                                -
                                -

                                Match with the parsed :path-params as strings:

                                -
                                (r/match-by-path router "/metosin/users/123")
                                -; #Match{:template "/:company/users/:user-id",
                                -;        :data {:name :user/user-view},
                                -;        :result nil,
                                -;        :path-params {:company "metosin", :user-id "123"},
                                -;        :path "/metosin/users/123"}
                                -
                                -

                                To enable parameter coercion, the following things need to be done:

                                -
                                  -
                                1. Define a Coercion for the routes
                                2. -
                                3. Define types for the parameters
                                4. -
                                5. Compile coercers for the types
                                6. -
                                7. Apply the coercion
                                8. -
                                -

                                Define Coercion

                                -

                                reitit.coercion/Coercion is a protocol defining how types are defined, coerced and inventoried.

                                -

                                Reitit ships with the following coercion modules:

                                - -

                                Coercion can be attached to route data under :coercion key. There can be multiple Coercion implementations within a single router, normal scoping rules apply.

                                -

                                Defining parameters

                                -

                                Route parameters can be defined via route data :parameters. It has keys for different type of parameters: :query, :body, :form, :header and :path. Syntax for the actual parameters depends on the Coercion implementation.

                                -

                                Example with Schema path-parameters:

                                -
                                (require '[reitit.coercion.schema])
                                -(require '[schema.core :as s])
                                -
                                -(def router
                                -  (r/router
                                -    ["/:company/users/:user-id" {:name ::user-view
                                -                                 :coercion reitit.coercion.schema/coercion
                                -                                 :parameters {:path {:company s/Str
                                -                                                     :user-id s/Int}}}]))
                                -
                                -

                                A Match:

                                -
                                (r/match-by-path router "/metosin/users/123")
                                -; #Match{:template "/:company/users/:user-id",
                                -;        :data {:name :user/user-view,
                                -;               :coercion <<:schema>>
                                -;               :parameters {:path {:company java.lang.String,
                                -;                                   :user-id Int}}},
                                -;        :result nil,
                                -;        :path-params {:company "metosin", :user-id "123"},
                                -;        :path "/metosin/users/123"}
                                -
                                -

                                Coercion was not applied. Why? In Reitit, routing and coercion are separate processes and we have done just the routing part. We need to apply coercion after the successful routing.

                                -

                                But now we should have enough data on the match to apply the coercion.

                                -

                                Compiling coercers

                                -

                                Before the actual coercion, we should need to compile the coercers against the route data. Compiled coercers yield much better performance and the manual step of adding a coercion compiler makes things explicit and non-magical.

                                -

                                Compiling can be done via a Middleware, Interceptor or a Router. We apply it now at router-level, effecting all routes (with :parameters and :coercion defined).

                                -

                                There is a helper function reitit.coercion/compile-request-coercers just for this:

                                -
                                (require '[reitit.coercion :as coercion])
                                -(require '[reitit.coercion.schema])
                                -(require '[schema.core :as s])
                                -
                                -(def router
                                -  (r/router
                                -    ["/:company/users/:user-id" {:name ::user-view
                                -                                 :coercion reitit.coercion.schema/coercion
                                -                                 :parameters {:path {:company s/Str
                                -                                                     :user-id s/Int}}}]
                                -    {:compile coercion/compile-request-coercers}))
                                -
                                -

                                Routing again:

                                -
                                (r/match-by-path router "/metosin/users/123")
                                -; #Match{:template "/:company/users/:user-id",
                                -;        :data {:name :user/user-view,
                                -;               :coercion <<:schema>>
                                -;               :parameters {:path {:company java.lang.String,
                                -;                                   :user-id Int}}},
                                -;        :result {:path #object[reitit.coercion$request_coercer$]},
                                -;        :path-params {:company "metosin", :user-id "123"},
                                -;        :path "/metosin/users/123"}
                                -
                                -

                                The compiler added a :result key into the match (done just once, at router creation time), which holds the compiled coercers. We are almost done.

                                -

                                Applying coercion

                                -

                                We can use a helper function reitit.coercion/coerce! to do the actual coercion, based on a Match:

                                -
                                (coercion/coerce!
                                -  (r/match-by-path router "/metosin/users/123"))
                                -; {:path {:company "metosin", :user-id 123}}
                                -
                                -

                                We get the coerced parameters back. If a coercion fails, a typed (:reitit.coercion/request-coercion) ExceptionInfo is thrown, with data about the actual error:

                                -
                                (coercion/coerce!
                                -  (r/match-by-path router "/metosin/users/ikitommi"))
                                -; => ExceptionInfo Request coercion failed:
                                -; #CoercionError{:schema {:company java.lang.String, :user-id Int, Any Any},
                                -;                :errors {:user-id (not (integer? "ikitommi"))}}
                                -; clojure.core/ex-info (core.clj:4739)
                                -
                                -

                                Full example

                                -

                                Here's a full example for doing routing and coercion with Reitit and Schema:

                                -
                                (require '[reitit.coercion.schema])
                                -(require '[reitit.coercion :as coercion])
                                -(require '[reitit.core :as r])
                                -(require '[schema.core :as s])
                                -
                                -(def router
                                -  (r/router
                                -    ["/:company/users/:user-id" {:name ::user-view
                                -                                 :coercion reitit.coercion.schema/coercion
                                -                                 :parameters {:path {:company s/Str
                                -                                                     :user-id s/Int}}}]
                                -    {:compile coercion/compile-request-coercers}))
                                -
                                -(defn match-by-path-and-coerce! [path]
                                -  (if-let [match (r/match-by-path router path)]
                                -    (assoc match :parameters (coercion/coerce! match))))
                                -
                                -(match-by-path-and-coerce! "/metosin/users/123")
                                -; #Match{:template "/:company/users/:user-id",
                                -;        :data {:name :user/user-view,
                                -;               :coercion <<:schema>>
                                -;               :parameters {:path {:company java.lang.String,
                                -;                                   :user-id Int}}},
                                -;        :result {:path #object[reitit.coercion$request_coercer$]},
                                -;        :path-params {:company "metosin", :user-id "123"},
                                -;        :parameters {:path {:company "metosin", :user-id 123}}
                                -;        :path "/metosin/users/123"}
                                -
                                -(match-by-path-and-coerce! "/metosin/users/ikitommi")
                                -; => ExceptionInfo Request coercion failed...
                                -
                                -

                                Ring Coercion

                                -

                                For a full-blown http-coercion, see the ring coercion.

                                - - -
                                - -
                                -
                                -
                                - -

                                results matching ""

                                -
                                  - -
                                  -
                                  - -

                                  No results matching ""

                                  - -
                                  -
                                  -
                                  - -
                                  -
                                  - -
                                  - - - - - - - - - - - - - - -
                                  - - -
                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                  Go to this page on cljdoc

                                  diff --git a/coercion/data_spec_coercion.html b/coercion/data_spec_coercion.html index 8b5105ab..e35ad330 100644 --- a/coercion/data_spec_coercion.html +++ b/coercion/data_spec_coercion.html @@ -1,924 +1,9 @@ - - - - - - Data-specs · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                  -
                                  - - - - - - - - -
                                  - -
                                  - -
                                  - - - - - - - - -
                                  -
                                  - -
                                  -
                                  - -
                                  - -

                                  Data-spec Coercion

                                  -

                                  Data-specs is alternative, macro-free syntax to define clojure.specs. As a bonus, supports the runtime transformations via conforming out-of-the-box.

                                  -
                                  (require '[reitit.coercion.spec])
                                  -(require '[reitit.coercion :as coercion])
                                  -(require '[reitit.core :as r])
                                  -
                                  -(def router
                                  -  (r/router
                                  -    ["/:company/users/:user-id" {:name ::user-view
                                  -                                 :coercion reitit.coercion.spec/coercion
                                  -                                 :parameters {:path {:company string?
                                  -                                                     :user-id int?}}}]
                                  -    {:compile coercion/compile-request-coercers}))
                                  -
                                  -(defn match-by-path-and-coerce! [path]
                                  -  (if-let [match (r/match-by-path router path)]
                                  -    (assoc match :parameters (coercion/coerce! match))))
                                  -
                                  -

                                  Successful coercion:

                                  -
                                  (match-by-path-and-coerce! "/metosin/users/123")
                                  -; #Match{:template "/:company/users/:user-id",
                                  -;        :data {:name :user/user-view,
                                  -;               :coercion <<:spec>>
                                  -;               :parameters {:path {:company string?,
                                  -;                                   :user-id int?}}},
                                  -;        :result {:path #object[reitit.coercion$request_coercer$]},
                                  -;        :path-params {:company "metosin", :user-id "123"},
                                  -;        :parameters {:path {:company "metosin", :user-id 123}}
                                  -;        :path "/metosin/users/123"}
                                  -
                                  -

                                  Failing coercion:

                                  -
                                  (match-by-path-and-coerce! "/metosin/users/ikitommi")
                                  -; => ExceptionInfo Request coercion failed...
                                  -
                                  - - -
                                  - -
                                  -
                                  -
                                  - -

                                  results matching ""

                                  -
                                    - -
                                    -
                                    - -

                                    No results matching ""

                                    - -
                                    -
                                    -
                                    - -
                                    -
                                    - -
                                    - - - - - - - - - - - - - - -
                                    - - -
                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                    Go to this page on cljdoc

                                    diff --git a/coercion/malli_coercion.md b/coercion/malli_coercion.md index 7c041d98..30ff7cd9 100644 --- a/coercion/malli_coercion.md +++ b/coercion/malli_coercion.md @@ -1,71 +1,9 @@ -# Malli Coercion -[Malli](https://github.com/metosin/malli) is data-driven Schema library for Clojure/Script. + + + + + +

                                    Go to this page on cljdoc

                                    + -```clj -(require '[reitit.coercion.malli]) -(require '[reitit.coercion :as coercion]) -(require '[reitit.core :as r]) - -(def router - (r/router - ["/:company/users/:user-id" {:name ::user-view - :coercion reitit.coercion.malli/coercion - :parameters {:path [:map - [:company string?] - [:user-id int?]]}] - {:compile coercion/compile-request-coercers})) - -(defn match-by-path-and-coerce! [path] - (if-let [match (r/match-by-path router path)] - (assoc match :parameters (coercion/coerce! match)))) -``` - -Successful coercion: - -```clj -(match-by-path-and-coerce! "/metosin/users/123") -; #Match{:template "/:company/users/:user-id", -; :data {:name :user/user-view, -; :coercion <<:malli>> -; :parameters {:path [:map -; [:company string?] -; [:user-id int?]]}}, -; :result {:path #object[reitit.coercion$request_coercer$]}, -; :path-params {:company "metosin", :user-id "123"}, -; :parameters {:path {:company "metosin", :user-id 123}} -; :path "/metosin/users/123"} -``` - -Failing coercion: - -```clj -(match-by-path-and-coerce! "/metosin/users/ikitommi") -; => ExceptionInfo Request coercion failed... -``` - -## Configuring coercion - -Using `create` with options to create the coercion instead of `coercion`: - -```clj -(reitit.coercion.malli/create - {:transformers {:body {:default default-transformer-provider - :formats {"application/json" json-transformer-provider}} - :string {:default string-transformer-provider} - :response {:default default-transformer-provider}} - ;; set of keys to include in error messages - :error-keys #{:type :coercion :in :schema :value :errors :humanized #_:transformed} - ;; schema identity function (default: close all map schemas) - :compile mu/closed-schema - ;; validate request & response - :validate true - ;; top-level short-circuit to disable request & response coercion - :enabled true - ;; strip-extra-keys (effects only predefined transformers) - :strip-extra-keys true - ;; add/set default values - :default-values true - ;; malli options - :options nil}) -``` diff --git a/coercion/schema_coercion.html b/coercion/schema_coercion.html index fe0cde85..bfd04752 100644 --- a/coercion/schema_coercion.html +++ b/coercion/schema_coercion.html @@ -1,925 +1,9 @@ - - - - - - Plumatic Schema · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                    -
                                    - - - - - - - - -
                                    - -
                                    - -
                                    - - - - - - - - -
                                    -
                                    - -
                                    -
                                    - -
                                    - -

                                    Plumatic Schema Coercion

                                    -

                                    Plumatic Schema is a Clojure(Script) library for declarative data description and validation.

                                    -
                                    (require '[reitit.coercion.schema])
                                    -(require '[reitit.coercion :as coercion])
                                    -(require '[schema.core :as s])
                                    -(require '[reitit.core :as r])
                                    -
                                    -(def router
                                    -  (r/router
                                    -    ["/:company/users/:user-id" {:name ::user-view
                                    -                                 :coercion reitit.coercion.schema/coercion
                                    -                                 :parameters {:path {:company s/Str
                                    -                                                     :user-id s/Int}}}]
                                    -    {:compile coercion/compile-request-coercers}))
                                    -
                                    -(defn match-by-path-and-coerce! [path]
                                    -  (if-let [match (r/match-by-path router path)]
                                    -    (assoc match :parameters (coercion/coerce! match))))
                                    -
                                    -

                                    Successful coercion:

                                    -
                                    (match-by-path-and-coerce! "/metosin/users/123")
                                    -; #Match{:template "/:company/users/:user-id",
                                    -;        :data {:name :user/user-view,
                                    -;               :coercion <<:schema>>
                                    -;               :parameters {:path {:company java.lang.String,
                                    -;                                   :user-id Int}}},
                                    -;        :result {:path #object[reitit.coercion$request_coercer$]},
                                    -;        :path-params {:company "metosin", :user-id "123"},
                                    -;        :parameters {:path {:company "metosin", :user-id 123}}
                                    -;        :path "/metosin/users/123"}
                                    -
                                    -

                                    Failing coercion:

                                    -
                                    (match-by-path-and-coerce! "/metosin/users/ikitommi")
                                    -; => ExceptionInfo Request coercion failed...
                                    -
                                    - - -
                                    - -
                                    -
                                    -
                                    - -

                                    results matching ""

                                    -
                                      - -
                                      -
                                      - -

                                      No results matching ""

                                      - -
                                      -
                                      -
                                      - -
                                      -
                                      - -
                                      - - - - - - - - - - - - - - -
                                      - - -
                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                      Go to this page on cljdoc

                                      diff --git a/development.html b/development.html index b10356b5..bcc03339 100644 --- a/development.html +++ b/development.html @@ -1,916 +1,9 @@ - - - - - - Development Instructions · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                      -
                                      - - - - - - - - -
                                      - -
                                      - -
                                      - - - - - - - - -
                                      -
                                      - -
                                      -
                                      - -
                                      - -

                                      Development Instructions

                                      -

                                      Building

                                      -
                                      ./scripts/lein-modules do clean, install
                                      -
                                      -

                                      Running tests

                                      -
                                      ./scripts/test.sh clj
                                      -./scripts/test.sh cljs
                                      -
                                      -

                                      Documentation

                                      -

                                      The documentation is built with gitbook. To preview your changes locally:

                                      -
                                      npm install -g gitbook-cli
                                      -gitbook install
                                      -gitbook serve
                                      -
                                      -

                                      To bump up version:

                                      -

                                      We use Break Versioning. Remember our promise: patch-level bumps never include breaking changes!

                                      -
                                      # new version
                                      -./scripts/set-version "1.0.0"
                                      -./scripts/lein-modules install
                                      -
                                      -# works
                                      -lein test
                                      -
                                      -# deploy to clojars
                                      -./scripts/lein-modules do clean, deploy clojars
                                      -
                                      - - -
                                      - -
                                      -
                                      -
                                      - -

                                      results matching ""

                                      -
                                        - -
                                        -
                                        - -

                                        No results matching ""

                                        - -
                                        -
                                        -
                                        - -
                                        -
                                        - -
                                        - - - - - - - - - - - - - - -
                                        - - -
                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                        Go to this page on cljdoc

                                        diff --git a/faq.html b/faq.html index 2bda4285..ee1f6a61 100644 --- a/faq.html +++ b/faq.html @@ -1,996 +1,9 @@ - - - - - - FAQ · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                        -
                                        - - - - - - - - -
                                        - -
                                        - -
                                        - - - - - - - - -
                                        -
                                        - -
                                        -
                                        - -
                                        - -

                                        Frequently Asked Questions

                                        - -

                                        Why yet another routing library?

                                        -

                                        Routing and dispatching is in the core of most business apps, so we should have a great library to for it. There are already many good routing libs for Clojure, but we felt none was perfect. So, we took best parts of existing libs and added features that were missing: first-class composable route data, full route conflict resolution and pluggable coercion. Goal was to make a data-driven library that works, is fun to use and is really, really fast.

                                        -

                                        How can I contribute?

                                        -

                                        You can join #reitit channel in Clojurians slack to discuss things. Known roadmap is mostly written in issues.

                                        -

                                        How does Reitit differ from Bidi?

                                        -

                                        Bidi is an great and proven library for ClojureScript and we have been using it in many of our frontend projects. Both Reitit and Bidi are data-driven, bi-directional and work with both Clojure & ClojureScript. Here are the main differences:

                                        -

                                        Route syntax

                                        -
                                          -
                                        • Bidi supports multiple representations for route syntax, Reitit supports just one (simple) syntax.
                                        • -
                                        • Bidi uses special (Clojure) syntax for route patterns while Reitit separates (human-readable) paths strings from route data - still exposing the machine-readable syntax for extensions.
                                        • -
                                        -

                                        Bidi:

                                        -
                                        (def routes
                                        -  ["/" [["auth/login" :auth/login]
                                        -        [["auth/recovery/token/" :token] :auth/recovery]
                                        -        ["workspace/" [[[:project-uuid "/" :page-uuid] :workspace/page]]]]])
                                        -
                                        -

                                        Reitit:

                                        -
                                        (def routes
                                        -  [["/auth/login" :auth/login]
                                        -   ["/auth/recovery/token/:token" :auth/recovery]
                                        -   ["/workspace/:project-uuid/:page-uuid" :workspace/page]])
                                        -
                                        -

                                        Features

                                        -
                                          -
                                        • Bidi has extra features like route guards
                                        • -
                                        • Reitit ships with composable route data, specs, full route conflict resolution and pluggable coercion.
                                        • -
                                        -

                                        Performance

                                        -
                                          -
                                        • Bidi is not optimized for speed and thus, Reitit is much faster than Bidi. From Bidi source:
                                        • -
                                        -
                                        ;; Route compilation was only marginally effective and hard to
                                        -;; debug. When bidi matching takes in the order of 30 micro-seconds,
                                        -;; this is good enough in relation to the time taken to process the
                                        -;; overall request.
                                        -
                                        -

                                        How does Reitit differ from Pedestal?

                                        -

                                        Pedestal is an great and proven library and has had great influence in Reitit. Both Reitit and Pedestal are data-driven and provide bi-directional routing and fast. Here are the main differences:

                                        -

                                        ClojureScript

                                        -
                                          -
                                        • Pedestal targets only Clojure, while Reitit works also with ClojureScript.
                                        • -
                                        -

                                        Route syntax

                                        -
                                          -
                                        • Pedestal supports multiple representations for route syntax: terse, table and verbose. Reitit provides only one representation.
                                        • -
                                        • Pedestal supports both maps or keyword-arguments in route data, in Reitit, it's all maps.
                                        • -
                                        -

                                        Pedestal:

                                        -
                                        ["/api/ping" :get identity :route-name ::ping]
                                        -
                                        -

                                        Reitit:

                                        -
                                        ["/api/ping" {:get identity, :name ::ping}]
                                        -
                                        -

                                        Features

                                        -
                                          -
                                        • Pedestal supports route guards
                                        • -
                                        • Pedestal supports interceptors (reitit-http module will support them too).
                                        • -
                                        • Reitit ships with composable route data, specs, full route conflict resolution and pluggable coercion.
                                        • -
                                        • In Pedestal, different routers behave differently, in Reitit, all work the same.
                                        • -
                                        -

                                        Performance

                                        -

                                        Reitit routing was originally based on Pedestal Routing an thus they same similar performance. For routing trees with both static and wildcard routes, Reitit is much faster thanks to it's mixed-router algorithm.

                                        -

                                        How does Reitit differ from Compojure?

                                        -

                                        Compojure is the most used routing library in Clojure. It's proven and awesome.

                                        -

                                        ClojureScript

                                        -
                                          -
                                        • Compojure targets only Clojure, while Reitit works also with ClojureScript.
                                        • -
                                        -

                                        Route syntax

                                        -
                                          -
                                        • Compojure uses routing functions and macros while reitit is all data
                                        • -
                                        • Compojure allows easy destructuring of route params on mid-path
                                        • -
                                        • Applying middleware for sub-paths is hacky on Compojure, reitit-ring resolves this with data-driven middleware
                                        • -
                                        -

                                        Compojure:

                                        -
                                        (defroutes routes
                                        -  (wrap-routes
                                        -    (context "/api" []
                                        -      (GET "/users/:id" [id :<< as-int]
                                        -        (ok (get-user id)))
                                        -      (POST "/pizza" []
                                        -        (wrap-log post-pizza-handler)))
                                        -    wrap-api :secure))
                                        -
                                        -

                                        reitit-ring with reitit-spec module:

                                        -
                                        (def routes
                                        -  ["/api" {:middleware [[wrap-api :secure]]}
                                        -   ["/users/:id" {:get {:parameters {:path {:id int?}}}
                                        -                  :handler (fn [{:keys [parameters]}]
                                        -                             (ok (get-user (-> parameters :body :id))))}
                                        -    ["/pizza" {:post {:middleware [wrap-log]
                                        -                      :handler post-pizza-handler}]]])
                                        -
                                        -

                                        Features

                                        -
                                          -
                                        • Dynamic routing is trivial in Compojure, with reitit, some trickery is needed
                                        • -
                                        • Reitit ships with composable route data, specs, full route conflict resolution and pluggable coercion.
                                        • -
                                        -

                                        Performance

                                        -

                                        Reitit is much faster than Compojure.

                                        -

                                        How do you pronounce "reitit"?

                                        -

                                        Google Translate does a decent job pronouncing it (click the speaker icon on the left). The English expression rate it is a good approximation.

                                        - - -
                                        - -
                                        -
                                        -
                                        - -

                                        results matching ""

                                        -
                                          - -
                                          -
                                          - -

                                          No results matching ""

                                          - -
                                          -
                                          -
                                          - -
                                          -
                                          - -
                                          - - - - - - - - - - -
                                          - - -
                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                          Go to this page on cljdoc

                                          diff --git a/frontend/basics.html b/frontend/basics.html index 479b6a42..9f462c80 100644 --- a/frontend/basics.html +++ b/frontend/basics.html @@ -1,913 +1,9 @@ - - - - - - Basics · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                          -
                                          - - - - - - - - -
                                          - -
                                          - -
                                          - - - - - - - - -
                                          -
                                          - -
                                          -
                                          - -
                                          - -

                                          Frontend basics

                                          -

                                          Reitit frontend integration is built from multiple layers:

                                          -
                                            -
                                          • Core functions with some additional browser oriented features
                                          • -
                                          • Browser integration for attaching Reitit to hash-change or HTML -history events
                                          • -
                                          • Stateful wrapper for easy use of history integration
                                          • -
                                          • Optional controller extension
                                          • -
                                          -

                                          Core functions

                                          -

                                          reitit.frontend provides few useful functions wrapping core functions:

                                          -

                                          match-by-path version which parses a URI using JavaScript, including -query-string, and also coerces the parameters. -Coerced parameters are stored in match :parameters property. If coercion -is not enabled, the original parameters are stored in the same property, -to allow the same code to read parameters regardless if coercion is -enabled.

                                          -

                                          router which compiles coercers by default.

                                          -

                                          match-by-name and match-by-name! with optional path-paramers and -logging errors to console.warn instead of throwing errors to prevent -React breaking due to errors.

                                          -

                                          Next

                                          -

                                          Browser integration

                                          - - -
                                          - -
                                          -
                                          -
                                          - -

                                          results matching ""

                                          -
                                            - -
                                            -
                                            - -

                                            No results matching ""

                                            - -
                                            -
                                            -
                                            - -
                                            -
                                            - -
                                            - - - - - - - - - - - - - - -
                                            - - -
                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                            Go to this page on cljdoc

                                            diff --git a/frontend/browser.html b/frontend/browser.html index e26a7dcd..738a29e8 100644 --- a/frontend/browser.html +++ b/frontend/browser.html @@ -1,936 +1,9 @@ - - - - - - Browser integration · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                            -
                                            - - - - - - - - -
                                            - -
                                            - -
                                            - - - - - - - - -
                                            -
                                            - -
                                            -
                                            - -
                                            - -

                                            Frontend browser integration

                                            -

                                            Reitit includes two browser history integrations.

                                            -

                                            Functions follow HTML5 History API: push-state to change route, replace-state -to change route without leaving previous entry in browser history.

                                            -

                                            Fragment router

                                            -

                                            Fragment is simple integration which stores the current route in URL fragment, -i.e. after #. This means the route is never part of the request URI and -server will always know which file to return (index.html).

                                            -

                                            HTML5 router

                                            -

                                            HTML5 History API can be used to modify the URL in browser without making -request to the server. This means the URL will look normal, but the downside is -that the server must respond to all routes with correct file (index.html). -Check examples for simple Ring handler example.

                                            -

                                            Anchor click handling

                                            -

                                            HTML5 History router will handle click events on anchors where the href -matches the route tree (and other rules). -If you have need to control this logic, for example to handle some -anchor clicks where the href matches route tree normally (i.e. browser load) -you can provide :ignore-anchor-click? function to add your own logic to -event handling:

                                            -
                                            (rfe/start!
                                            -  router
                                            -  {:use-fragment false
                                            -   :ignore-anchor-click? (fn [router e el uri]
                                            -                           ;; Add additional check on top of the default checks
                                            -                           (and (rfh/ignore-anchor-click? router e el uri)
                                            -                                (not= "false" (gobj/get (.-dataset el) "reititHandleClick"))))})
                                            -
                                            -;; Use data-reitit-handle-click to disable Reitit anchor handling
                                            -[:a
                                            - {:href (rfe/href ::about)
                                            -  :data-reitit-handle-click false}
                                            - "About"]
                                            -
                                            -

                                            Easy

                                            -

                                            Reitit frontend routers require storing the state somewhere and passing it to -all the calls. Wrapper reitit.frontend.easy is provided which manages -a router instance and passes the instance to all calls. This should -allow easy use in most applications, as browser anyway can only have single -event handler for page change events.

                                            -

                                            History manipulation

                                            -

                                            Reitit doesn't include functions to manipulate the history stack, i.e. -go back or forwards, but calling History API functions directly should work:

                                            -
                                            (.go js/window.history -1)
                                            -;; or
                                            -(.back js/window.history)
                                            -
                                            - -
                                            - -
                                            -
                                            -
                                            - -

                                            results matching ""

                                            -
                                              - -
                                              -
                                              - -

                                              No results matching ""

                                              - -
                                              -
                                              -
                                              - -
                                              -
                                              - -
                                              - - - - - - - - - - - - - - -
                                              - - -
                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                              Go to this page on cljdoc

                                              diff --git a/frontend/controllers.html b/frontend/controllers.html index 2b3c9826..b5d8f473 100644 --- a/frontend/controllers.html +++ b/frontend/controllers.html @@ -1,993 +1,9 @@ - - - - - - Controllers · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                              -
                                              - - - - - - - - -
                                              - -
                                              - -
                                              - - - - - - - - -
                                              -
                                              - -
                                              -
                                              - -
                                              - -

                                              Controllers

                                              - -

                                              Controllers run code when a route is entered and left. This can be useful to:

                                              -
                                                -
                                              • Load resources
                                              • -
                                              • Update application state
                                              • -
                                              -

                                              How controllers work

                                              -

                                              A controller map can contain these properties:

                                              -
                                                -
                                              • identity function which takes a Match and returns an arbitrary value,
                                              • -
                                              • or parameters value, which declares which parameters should affect -controller identity
                                              • -
                                              • start & stop functions, which are called with controller identity
                                              • -
                                              -

                                              When you navigate to a route that has a controller, controller identity -is first resolved by using parameters declaration, or by calling identity function, -or if neither is set, the identity is nil. Next, the controller -is initialized by calling start with the controller identity value. -When you exit that route, stop is called with the last controller identity value.

                                              -

                                              If you navigate to the same route with different match, identity gets -resolved again. If the identity changes from the previous value, controller -is reinitialized: stop and start get called again.

                                              -

                                              You can add controllers to a route by adding them to the route data in the -:controllers vector. For example:

                                              -
                                              ["/item/:id"
                                              - {:controllers [{:parameters {:path [:id]}
                                              -                 :start  (fn [parameters] (js/console.log :start (-> parameters :path :id)))
                                              -                 :stop   (fn [parameters] (js/console.log :stop (-> parameters :path :id)))}]}]
                                              -
                                              -

                                              You can leave out start or stop if you do not need both of them.

                                              -

                                              Enabling controllers

                                              -

                                              You need to -call -reitit.frontend.controllers/apply-controllers whenever -the URL changes. You can call it from the on-navigate callback of -reitit.frontend.easy:

                                              -
                                              (ns frontend.core
                                              -  (:require [reitit.frontend.easy :as rfe]
                                              -            [reitit.frontend.controllers :as rfc]))
                                              -
                                              -(defonce match-a (atom nil))
                                              -
                                              -(def routes
                                              -  ["/" ...])
                                              -
                                              -(defn init! []
                                              -  (rfe/start!
                                              -    routes
                                              -    (fn [new-match]
                                              -      (swap! match-a
                                              -        (fn [old-match]
                                              -          (when new-match
                                              -            (assoc new-match
                                              -              :controllers (rfc/apply-controllers (:controllers old-match) new-match))))))))
                                              -
                                              -

                                              See also the full example.

                                              -

                                              Nested controllers

                                              -

                                              When you nest routes in the route tree, the controllers get concatenated when -route data is merged. Consider this route tree:

                                              -
                                              ["/" {:controllers [{:start (fn [_] (js/console.log "root start"))}]}
                                              - ["/item/:id"
                                              -  {:controllers [{:params (fn [match] (get-in match [:path-params :id]))
                                              -                  :start  (fn [item-id] (js/console.log "item start" item-id))
                                              -                  :stop   (fn [item-id] (js/console.log "item stop" item-id))}]}]]
                                              -
                                              -
                                                -
                                              • When you navigate to any route at all, the root controller gets started.
                                              • -
                                              • If you navigate to /item/something, the root controller gets started first -and then the item controller gets started.
                                              • -
                                              • If you then navigate from /item/something to /item/something-else, first -the item controller gets stopped with parameter something and then it gets -started with the parameter something-else. The root controller stays on the -whole time since its parameters do not change.
                                              • -
                                              -

                                              Tips

                                              -

                                              Authentication

                                              -

                                              Controllers can be used to load resources from a server. If and when your -API requires authentication you will need to implement logic to prevent controllers -trying to do requests if user isn't authenticated yet.

                                              -

                                              Run controllers and check authentication

                                              -

                                              If you have both unauthenticated and authenticated resources, you can -run the controllers always and then check the authentication status -on controller code, or on the code called from controllers (e.g. re-frame event -handler).

                                              -

                                              Disable controllers until user is authenticated

                                              -

                                              If all your resources require authentication an easy way to prevent bad -requests is to enable controllers only after authentication is done. -To do this you can check authentication status and call apply-controllers -only after authentication is done (also remember to manually call apply-controllers -with current match when authentication is done). Or if no navigation is possible -before authentication is done, you can start the router only after -authentication is done.

                                              -

                                              Alternatives

                                              -

                                              Similar solution could be used to describe required resources as data (maybe -even GraphQL query) per route, and then have code automatically load -missing resources.

                                              -

                                              Controllers elsewhere

                                              - - - -
                                              - -
                                              -
                                              -
                                              - -

                                              results matching ""

                                              -
                                                - -
                                                -
                                                - -

                                                No results matching ""

                                                - -
                                                -
                                                -
                                                - -
                                                -
                                                - -
                                                - - - - - - - - - - - - - - -
                                                - - -
                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                Go to this page on cljdoc

                                                diff --git a/gitbook/fonts/fontawesome/FontAwesome.otf b/gitbook/fonts/fontawesome/FontAwesome.otf deleted file mode 100644 index d4de13e8..00000000 Binary files a/gitbook/fonts/fontawesome/FontAwesome.otf and /dev/null differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.eot b/gitbook/fonts/fontawesome/fontawesome-webfont.eot deleted file mode 100644 index c7b00d2b..00000000 Binary files a/gitbook/fonts/fontawesome/fontawesome-webfont.eot and /dev/null differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.svg b/gitbook/fonts/fontawesome/fontawesome-webfont.svg deleted file mode 100644 index 8b66187f..00000000 --- a/gitbook/fonts/fontawesome/fontawesome-webfont.svg +++ /dev/null @@ -1,685 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.ttf b/gitbook/fonts/fontawesome/fontawesome-webfont.ttf deleted file mode 100644 index f221e50a..00000000 Binary files a/gitbook/fonts/fontawesome/fontawesome-webfont.ttf and /dev/null differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.woff b/gitbook/fonts/fontawesome/fontawesome-webfont.woff deleted file mode 100644 index 6e7483cf..00000000 Binary files a/gitbook/fonts/fontawesome/fontawesome-webfont.woff and /dev/null differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 b/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 deleted file mode 100644 index 7eb74fd1..00000000 Binary files a/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 and /dev/null differ diff --git a/gitbook/gitbook-plugin-editlink/plugin.js b/gitbook/gitbook-plugin-editlink/plugin.js deleted file mode 100644 index e72c966b..00000000 --- a/gitbook/gitbook-plugin-editlink/plugin.js +++ /dev/null @@ -1,23 +0,0 @@ -require(["gitbook", "jQuery"], function(gitbook, $) { - gitbook.events.bind('start', function (e, config) { - var conf = config.editlink - var label = conf.label - var base = conf.base - var multilingual = conf.multilingual || false - - if (base.slice(-1) !== "/") { - base += "/" - } - - gitbook.toolbar.createButton({ - icon: 'fa fa-edit', - text: label, - onClick: function() { - var filepath = gitbook.state.filepath - var lang = multilingual && $('html').attr('lang') ? $('html').attr('lang') + '/' : '' - - window.open(base + lang + filepath) - } - }) - }) -}) \ No newline at end of file diff --git a/gitbook/gitbook-plugin-fontsettings/fontsettings.js b/gitbook/gitbook-plugin-fontsettings/fontsettings.js deleted file mode 100644 index ff7be714..00000000 --- a/gitbook/gitbook-plugin-fontsettings/fontsettings.js +++ /dev/null @@ -1,240 +0,0 @@ -require(['gitbook', 'jquery'], function(gitbook, $) { - // Configuration - var MAX_SIZE = 4, - MIN_SIZE = 0, - BUTTON_ID; - - // Current fontsettings state - var fontState; - - // Default themes - var THEMES = [ - { - config: 'white', - text: 'White', - id: 0 - }, - { - config: 'sepia', - text: 'Sepia', - id: 1 - }, - { - config: 'night', - text: 'Night', - id: 2 - } - ]; - - // Default font families - var FAMILIES = [ - { - config: 'serif', - text: 'Serif', - id: 0 - }, - { - config: 'sans', - text: 'Sans', - id: 1 - } - ]; - - // Return configured themes - function getThemes() { - return THEMES; - } - - // Modify configured themes - function setThemes(themes) { - THEMES = themes; - updateButtons(); - } - - // Return configured font families - function getFamilies() { - return FAMILIES; - } - - // Modify configured font families - function setFamilies(families) { - FAMILIES = families; - updateButtons(); - } - - // Save current font settings - function saveFontSettings() { - gitbook.storage.set('fontState', fontState); - update(); - } - - // Increase font size - function enlargeFontSize(e) { - e.preventDefault(); - if (fontState.size >= MAX_SIZE) return; - - fontState.size++; - saveFontSettings(); - } - - // Decrease font size - function reduceFontSize(e) { - e.preventDefault(); - if (fontState.size <= MIN_SIZE) return; - - fontState.size--; - saveFontSettings(); - } - - // Change font family - function changeFontFamily(configName, e) { - if (e && e instanceof Event) { - e.preventDefault(); - } - - var familyId = getFontFamilyId(configName); - fontState.family = familyId; - saveFontSettings(); - } - - // Change type of color theme - function changeColorTheme(configName, e) { - if (e && e instanceof Event) { - e.preventDefault(); - } - - var $book = gitbook.state.$book; - - // Remove currently applied color theme - if (fontState.theme !== 0) - $book.removeClass('color-theme-'+fontState.theme); - - // Set new color theme - var themeId = getThemeId(configName); - fontState.theme = themeId; - if (fontState.theme !== 0) - $book.addClass('color-theme-'+fontState.theme); - - saveFontSettings(); - } - - // Return the correct id for a font-family config key - // Default to first font-family - function getFontFamilyId(configName) { - // Search for plugin configured font family - var configFamily = $.grep(FAMILIES, function(family) { - return family.config == configName; - })[0]; - // Fallback to default font family - return (!!configFamily)? configFamily.id : 0; - } - - // Return the correct id for a theme config key - // Default to first theme - function getThemeId(configName) { - // Search for plugin configured theme - var configTheme = $.grep(THEMES, function(theme) { - return theme.config == configName; - })[0]; - // Fallback to default theme - return (!!configTheme)? configTheme.id : 0; - } - - function update() { - var $book = gitbook.state.$book; - - $('.font-settings .font-family-list li').removeClass('active'); - $('.font-settings .font-family-list li:nth-child('+(fontState.family+1)+')').addClass('active'); - - $book[0].className = $book[0].className.replace(/\bfont-\S+/g, ''); - $book.addClass('font-size-'+fontState.size); - $book.addClass('font-family-'+fontState.family); - - if(fontState.theme !== 0) { - $book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, ''); - $book.addClass('color-theme-'+fontState.theme); - } - } - - function init(config) { - // Search for plugin configured font family - var configFamily = getFontFamilyId(config.family), - configTheme = getThemeId(config.theme); - - // Instantiate font state object - fontState = gitbook.storage.get('fontState', { - size: config.size || 2, - family: configFamily, - theme: configTheme - }); - - update(); - } - - function updateButtons() { - // Remove existing fontsettings buttons - if (!!BUTTON_ID) { - gitbook.toolbar.removeButton(BUTTON_ID); - } - - // Create buttons in toolbar - BUTTON_ID = gitbook.toolbar.createButton({ - icon: 'fa fa-font', - label: 'Font Settings', - className: 'font-settings', - dropdown: [ - [ - { - text: 'A', - className: 'font-reduce', - onClick: reduceFontSize - }, - { - text: 'A', - className: 'font-enlarge', - onClick: enlargeFontSize - } - ], - $.map(FAMILIES, function(family) { - family.onClick = function(e) { - return changeFontFamily(family.config, e); - }; - - return family; - }), - $.map(THEMES, function(theme) { - theme.onClick = function(e) { - return changeColorTheme(theme.config, e); - }; - - return theme; - }) - ] - }); - } - - // Init configuration at start - gitbook.events.bind('start', function(e, config) { - var opts = config.fontsettings; - - // Generate buttons at start - updateButtons(); - - // Init current settings - init(opts); - }); - - // Expose API - gitbook.fontsettings = { - enlargeFontSize: enlargeFontSize, - reduceFontSize: reduceFontSize, - setTheme: changeColorTheme, - setFamily: changeFontFamily, - getThemes: getThemes, - setThemes: setThemes, - getFamilies: getFamilies, - setFamilies: setFamilies - }; -}); - - diff --git a/gitbook/gitbook-plugin-fontsettings/website.css b/gitbook/gitbook-plugin-fontsettings/website.css deleted file mode 100644 index 26591fe8..00000000 --- a/gitbook/gitbook-plugin-fontsettings/website.css +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Theme 1 - */ -.color-theme-1 .dropdown-menu { - background-color: #111111; - border-color: #7e888b; -} -.color-theme-1 .dropdown-menu .dropdown-caret .caret-inner { - border-bottom: 9px solid #111111; -} -.color-theme-1 .dropdown-menu .buttons { - border-color: #7e888b; -} -.color-theme-1 .dropdown-menu .button { - color: #afa790; -} -.color-theme-1 .dropdown-menu .button:hover { - color: #73553c; -} -/* - * Theme 2 - */ -.color-theme-2 .dropdown-menu { - background-color: #2d3143; - border-color: #272a3a; -} -.color-theme-2 .dropdown-menu .dropdown-caret .caret-inner { - border-bottom: 9px solid #2d3143; -} -.color-theme-2 .dropdown-menu .buttons { - border-color: #272a3a; -} -.color-theme-2 .dropdown-menu .button { - color: #62677f; -} -.color-theme-2 .dropdown-menu .button:hover { - color: #f4f4f5; -} -.book .book-header .font-settings .font-enlarge { - line-height: 30px; - font-size: 1.4em; -} -.book .book-header .font-settings .font-reduce { - line-height: 30px; - font-size: 1em; -} -.book.color-theme-1 .book-body { - color: #704214; - background: #f3eacb; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section { - background: #f3eacb; -} -.book.color-theme-2 .book-body { - color: #bdcadb; - background: #1c1f2b; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section { - background: #1c1f2b; -} -.book.font-size-0 .book-body .page-inner section { - font-size: 1.2rem; -} -.book.font-size-1 .book-body .page-inner section { - font-size: 1.4rem; -} -.book.font-size-2 .book-body .page-inner section { - font-size: 1.6rem; -} -.book.font-size-3 .book-body .page-inner section { - font-size: 2.2rem; -} -.book.font-size-4 .book-body .page-inner section { - font-size: 4rem; -} -.book.font-family-0 { - font-family: Georgia, serif; -} -.book.font-family-1 { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal { - color: #704214; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a { - color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { - color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 { - border-color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { - color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr { - background-color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote { - border-color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { - background: #fdf6e3; - color: #657b83; - border-color: #f8df9c; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight { - background-color: inherit; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td { - border-color: #f5d06c; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr { - color: inherit; - background-color: #fdf6e3; - border-color: #444444; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { - background-color: #fbeecb; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal { - color: #bdcadb; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a { - color: #3eb1d0; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { - color: #fffffa; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 { - border-color: #373b4e; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { - color: #373b4e; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr { - background-color: #373b4e; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote { - border-color: #373b4e; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { - color: #9dbed8; - background: #2d3143; - border-color: #2d3143; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight { - background-color: #282a39; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td { - border-color: #3b3f54; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr { - color: #b6c2d2; - background-color: #2d3143; - border-color: #3b3f54; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { - background-color: #35394b; -} -.book.color-theme-1 .book-header { - color: #afa790; - background: transparent; -} -.book.color-theme-1 .book-header .btn { - color: #afa790; -} -.book.color-theme-1 .book-header .btn:hover { - color: #73553c; - background: none; -} -.book.color-theme-1 .book-header h1 { - color: #704214; -} -.book.color-theme-2 .book-header { - color: #7e888b; - background: transparent; -} -.book.color-theme-2 .book-header .btn { - color: #3b3f54; -} -.book.color-theme-2 .book-header .btn:hover { - color: #fffff5; - background: none; -} -.book.color-theme-2 .book-header h1 { - color: #bdcadb; -} -.book.color-theme-1 .book-body .navigation { - color: #afa790; -} -.book.color-theme-1 .book-body .navigation:hover { - color: #73553c; -} -.book.color-theme-2 .book-body .navigation { - color: #383f52; -} -.book.color-theme-2 .book-body .navigation:hover { - color: #fffff5; -} -/* - * Theme 1 - */ -.book.color-theme-1 .book-summary { - color: #afa790; - background: #111111; - border-right: 1px solid rgba(0, 0, 0, 0.07); -} -.book.color-theme-1 .book-summary .book-search { - background: transparent; -} -.book.color-theme-1 .book-summary .book-search input, -.book.color-theme-1 .book-summary .book-search input:focus { - border: 1px solid transparent; -} -.book.color-theme-1 .book-summary ul.summary li.divider { - background: #7e888b; - box-shadow: none; -} -.book.color-theme-1 .book-summary ul.summary li i.fa-check { - color: #33cc33; -} -.book.color-theme-1 .book-summary ul.summary li.done > a { - color: #877f6a; -} -.book.color-theme-1 .book-summary ul.summary li a, -.book.color-theme-1 .book-summary ul.summary li span { - color: #877f6a; - background: transparent; - font-weight: normal; -} -.book.color-theme-1 .book-summary ul.summary li.active > a, -.book.color-theme-1 .book-summary ul.summary li a:hover { - color: #704214; - background: transparent; - font-weight: normal; -} -/* - * Theme 2 - */ -.book.color-theme-2 .book-summary { - color: #bcc1d2; - background: #2d3143; - border-right: none; -} -.book.color-theme-2 .book-summary .book-search { - background: transparent; -} -.book.color-theme-2 .book-summary .book-search input, -.book.color-theme-2 .book-summary .book-search input:focus { - border: 1px solid transparent; -} -.book.color-theme-2 .book-summary ul.summary li.divider { - background: #272a3a; - box-shadow: none; -} -.book.color-theme-2 .book-summary ul.summary li i.fa-check { - color: #33cc33; -} -.book.color-theme-2 .book-summary ul.summary li.done > a { - color: #62687f; -} -.book.color-theme-2 .book-summary ul.summary li a, -.book.color-theme-2 .book-summary ul.summary li span { - color: #c1c6d7; - background: transparent; - font-weight: 600; -} -.book.color-theme-2 .book-summary ul.summary li.active > a, -.book.color-theme-2 .book-summary ul.summary li a:hover { - color: #f4f4f5; - background: #252737; - font-weight: 600; -} diff --git a/gitbook/gitbook-plugin-github/plugin.js b/gitbook/gitbook-plugin-github/plugin.js deleted file mode 100644 index 14810ce0..00000000 --- a/gitbook/gitbook-plugin-github/plugin.js +++ /dev/null @@ -1,14 +0,0 @@ -require([ 'gitbook' ], function (gitbook) { - gitbook.events.bind('start', function (e, config) { - var githubURL = config.github.url; - - gitbook.toolbar.createButton({ - icon: 'fa fa-github', - label: 'GitHub', - position: 'right', - onClick: function() { - window.open(githubURL) - } - }); - }); -}); diff --git a/gitbook/gitbook-plugin-highlight/ebook.css b/gitbook/gitbook-plugin-highlight/ebook.css deleted file mode 100644 index 655c965b..00000000 --- a/gitbook/gitbook-plugin-highlight/ebook.css +++ /dev/null @@ -1,96 +0,0 @@ -pre, -code { - /* From https://github.com/isagalaev/highlight.js/blob/9.8.0/src/styles/tomorrow.css */ - /* http://jmblog.github.io/color-themes-for-highlightjs */ - /* Tomorrow Comment */ - /* Tomorrow Red */ - /* Tomorrow Orange */ - /* Tomorrow Yellow */ - /* Tomorrow Green */ - /* Tomorrow Blue */ - /* Tomorrow Purple */ -} -pre .hljs-comment, -code .hljs-comment, -pre .hljs-quote, -code .hljs-quote { - color: #8e908c; -} -pre .hljs-variable, -code .hljs-variable, -pre .hljs-template-variable, -code .hljs-template-variable, -pre .hljs-tag, -code .hljs-tag, -pre .hljs-name, -code .hljs-name, -pre .hljs-selector-id, -code .hljs-selector-id, -pre .hljs-selector-class, -code .hljs-selector-class, -pre .hljs-regexp, -code .hljs-regexp, -pre .hljs-deletion, -code .hljs-deletion { - color: #c82829; -} -pre .hljs-number, -code .hljs-number, -pre .hljs-built_in, -code .hljs-built_in, -pre .hljs-builtin-name, -code .hljs-builtin-name, -pre .hljs-literal, -code .hljs-literal, -pre .hljs-type, -code .hljs-type, -pre .hljs-params, -code .hljs-params, -pre .hljs-meta, -code .hljs-meta, -pre .hljs-link, -code .hljs-link { - color: #f5871f; -} -pre .hljs-attribute, -code .hljs-attribute { - color: #eab700; -} -pre .hljs-string, -code .hljs-string, -pre .hljs-symbol, -code .hljs-symbol, -pre .hljs-bullet, -code .hljs-bullet, -pre .hljs-addition, -code .hljs-addition { - color: #718c00; -} -pre .hljs-title, -code .hljs-title, -pre .hljs-section, -code .hljs-section { - color: #4271ae; -} -pre .hljs-keyword, -code .hljs-keyword, -pre .hljs-selector-tag, -code .hljs-selector-tag { - color: #8959a8; -} -pre .hljs, -code .hljs { - display: block; - overflow-x: auto; - background: white; - color: #4d4d4c; - padding: 0.5em; -} -pre .hljs-emphasis, -code .hljs-emphasis { - font-style: italic; -} -pre .hljs-strong, -code .hljs-strong { - font-weight: bold; -} diff --git a/gitbook/gitbook-plugin-highlight/website.css b/gitbook/gitbook-plugin-highlight/website.css deleted file mode 100644 index 687f4a5c..00000000 --- a/gitbook/gitbook-plugin-highlight/website.css +++ /dev/null @@ -1,307 +0,0 @@ -.book .book-body .page-wrapper .page-inner section.normal pre, -.book .book-body .page-wrapper .page-inner section.normal code { - /* From https://github.com/isagalaev/highlight.js/blob/9.8.0/src/styles/tomorrow.css */ - /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - /* Tomorrow Comment */ - /* Tomorrow Red */ - /* Tomorrow Orange */ - /* Tomorrow Yellow */ - /* Tomorrow Green */ - /* Tomorrow Blue */ - /* Tomorrow Purple */ -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-comment, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-quote, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-quote { - color: #8e908c; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-variable, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-template-variable, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-template-variable, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-tag, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-name, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-name, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-id, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-selector-id, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-class, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-selector-class, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-deletion { - color: #c82829; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-number, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-number, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-builtin-name, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-builtin-name, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-literal, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-type, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-type, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-params, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-params, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-meta, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-meta, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-link, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-link { - color: #f5871f; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute { - color: #eab700; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-string, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-string, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-symbol, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-bullet, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-bullet, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-addition { - color: #718c00; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-title, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-section, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-section { - color: #4271ae; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-tag, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-selector-tag { - color: #8959a8; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs, -.book .book-body .page-wrapper .page-inner section.normal code .hljs { - display: block; - overflow-x: auto; - background: white; - color: #4d4d4c; - padding: 0.5em; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-emphasis, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-emphasis { - font-style: italic; -} -.book .book-body .page-wrapper .page-inner section.normal pre .hljs-strong, -.book .book-body .page-wrapper .page-inner section.normal code .hljs-strong { - font-weight: bold; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { - /* From https://github.com/isagalaev/highlight.js/blob/9.8.0/src/styles/solarized-light.css */ - /* - -Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull - -*/ - /* Solarized Green */ - /* Solarized Cyan */ - /* Solarized Blue */ - /* Solarized Yellow */ - /* Solarized Orange */ - /* Solarized Red */ -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #fdf6e3; - color: #657b83; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-quote, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-quote { - color: #93a1a1; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-tag, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-tag, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition { - color: #859900; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-meta-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-meta-string, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-literal, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctag, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctag, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp { - color: #2aa198; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-section, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-section, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-name, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-name, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-id, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-id, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-class, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-class { - color: #268bd2; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template-variable, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template-variable, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-type, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-type { - color: #b58900; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-bullet, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-bullet, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-keyword, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-keyword, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-attr, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-attr, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-pseudo, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-pseudo, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link { - color: #cb4b16; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion { - color: #dc322f; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-formula, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-formula { - background: #eee8d5; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-emphasis, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-emphasis { - font-style: italic; -} -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-strong, -.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-strong { - font-weight: bold; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { - /* From https://github.com/isagalaev/highlight.js/blob/9.8.0/src/styles/tomorrow-night-bright.css */ - /* Tomorrow Night Bright Theme */ - /* Original theme - https://github.com/chriskempson/tomorrow-theme */ - /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - /* Tomorrow Comment */ - /* Tomorrow Red */ - /* Tomorrow Orange */ - /* Tomorrow Yellow */ - /* Tomorrow Green */ - /* Tomorrow Blue */ - /* Tomorrow Purple */ -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-quote, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-quote { - color: #969896; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-template-variable, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-template-variable, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-name, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-name, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-id, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-id, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-class, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-class, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion { - color: #d54e53; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-builtin-name, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-builtin-name, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-type, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-type, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-meta, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-link, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-link { - color: #e78c45; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute { - color: #e7c547; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-bullet, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-bullet, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-addition { - color: #b9ca4a; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-section, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-section { - color: #7aa6da; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-tag, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-tag { - color: #c397d8; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs { - display: block; - overflow-x: auto; - background: black; - color: #eaeaea; - padding: 0.5em; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-emphasis, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-emphasis { - font-style: italic; -} -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-strong, -.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-strong { - font-weight: bold; -} diff --git a/gitbook/gitbook-plugin-hints/plugin-hints.css b/gitbook/gitbook-plugin-hints/plugin-hints.css deleted file mode 100644 index ed4480c5..00000000 --- a/gitbook/gitbook-plugin-hints/plugin-hints.css +++ /dev/null @@ -1,9 +0,0 @@ -.hints-icon { - display: table-cell; - padding-right: 15px; - padding-left: 5px; -} - -.hints-container { - display: table-cell; -} diff --git a/gitbook/gitbook-plugin-lunr/lunr.min.js b/gitbook/gitbook-plugin-lunr/lunr.min.js deleted file mode 100644 index 6aa6bc7d..00000000 --- a/gitbook/gitbook-plugin-lunr/lunr.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.12 - * Copyright (C) 2015 Oliver Nightingale - * MIT Licensed - * @license - */ -!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.5.12",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(t){return arguments.length&&null!=t&&void 0!=t?Array.isArray(t)?t.map(function(t){return t.toLowerCase()}):t.toString().trim().toLowerCase().split(/[\s\-]+/):[]},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,o=0;n>o;o++){for(var r=t[o],s=0;i>s&&(r=this._stack[s](r,o,t),void 0!==r);s++);void 0!==r&&e.push(r)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(r===t)return o;t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o]}return r===t?o:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;)t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o];return r>t?o:t>r?o+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,o=0,r=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>r-1||o>s-1)break;a[i]!==h[o]?a[i]h[o]&&o++:(n.add(a[i]),i++,o++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},o=new t.SortedSet,r=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=r,t.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),t.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,o=[],r=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*r,h=this,l=this.tokenStore.expand(e).reduce(function(n,o){var r=h.corpusTokens.indexOf(o),s=h.idf(o),l=1,u=new t.SortedSet;if(o!==e){var c=Math.max(3,o.length-e.length);l=1/Math.log(c)}return r>-1&&i.insert(r,a*s*l),Object.keys(h.tokenStore.get(o)).forEach(function(t){u.add(t)}),n.union(u)},new t.SortedSet);o.push(l)},this);var a=o.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,o=new t.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*h)}return o},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",h="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,u=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(l),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+o+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,r,s,a,h,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var T=s.exec(n);s=u,s.test(T[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,l=x,a.test(n)?n+="e":h.test(n)?(s=g,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+t[o])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+e[o])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==e?e:void 0},t.stopWordFilter.stopWords={a:"a",able:"able",about:"about",across:"across",after:"after",all:"all",almost:"almost",also:"also",am:"am",among:"among",an:"an",and:"and",any:"any",are:"are",as:"as",at:"at",be:"be",because:"because",been:"been",but:"but",by:"by",can:"can",cannot:"cannot",could:"could",dear:"dear",did:"did","do":"do",does:"does",either:"either","else":"else",ever:"ever",every:"every","for":"for",from:"from",get:"get",got:"got",had:"had",has:"has",have:"have",he:"he",her:"her",hers:"hers",him:"him",his:"his",how:"how",however:"however",i:"i","if":"if","in":"in",into:"into",is:"is",it:"it",its:"its",just:"just",least:"least",let:"let",like:"like",likely:"likely",may:"may",me:"me",might:"might",most:"most",must:"must",my:"my",neither:"neither",no:"no",nor:"nor",not:"not",of:"of",off:"off",often:"often",on:"on",only:"only",or:"or",other:"other",our:"our",own:"own",rather:"rather",said:"said",say:"say",says:"says",she:"she",should:"should",since:"since",so:"so",some:"some",than:"than",that:"that",the:"the",their:"their",them:"them",then:"then",there:"there",these:"these",they:"they","this":"this",tis:"tis",to:"to",too:"too",twas:"twas",us:"us",wants:"wants",was:"was",we:"we",were:"were",what:"what",when:"when",where:"where",which:"which","while":"while",who:"who",whom:"whom",why:"why",will:"will","with":"with",would:"would",yet:"yet",you:"you",your:"your"},t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){var e=t.replace(/^\W+/,"").replace(/\W+$/,"");return""===e?void 0:e},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t[0],o=t.slice(1);return i in n||(n[i]={docs:{}}),0===o.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(o,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;no;o++){for(var r=t[o],s=0;i>s&&(r=this._stack[s](r,o,t),void 0!==r);s++);void 0!==r&&e.push(r)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(r===t)return o;t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o]}return r===t?o:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;)t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o];return r>t?o:t>r?o+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,o=0,r=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>r-1||o>s-1)break;a[i]!==h[o]?a[i]h[o]&&o++:(n.add(a[i]),i++,o++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},o=new t.SortedSet,r=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=r,t.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),t.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,o=[],r=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*r,h=this,l=this.tokenStore.expand(e).reduce(function(n,o){var r=h.corpusTokens.indexOf(o),s=h.idf(o),l=1,u=new t.SortedSet;if(o!==e){var c=Math.max(3,o.length-e.length);l=1/Math.log(c)}return r>-1&&i.insert(r,a*s*l),Object.keys(h.tokenStore.get(o)).forEach(function(t){u.add(t)}),n.union(u)},new t.SortedSet);o.push(l)},this);var a=o.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,o=new t.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*h)}return o},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",h="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,u=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(l),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+o+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,r,s,a,h,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var T=s.exec(n);s=u,s.test(T[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,l=x,a.test(n)?n+="e":h.test(n)?(s=g,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+t[o])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+e[o])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==e?e:void 0},t.stopWordFilter.stopWords={a:"a",able:"able",about:"about",across:"across",after:"after",all:"all",almost:"almost",also:"also",am:"am",among:"among",an:"an",and:"and",any:"any",are:"are",as:"as",at:"at",be:"be",because:"because",been:"been",but:"but",by:"by",can:"can",cannot:"cannot",could:"could",dear:"dear",did:"did","do":"do",does:"does",either:"either","else":"else",ever:"ever",every:"every","for":"for",from:"from",get:"get",got:"got",had:"had",has:"has",have:"have",he:"he",her:"her",hers:"hers",him:"him",his:"his",how:"how",however:"however",i:"i","if":"if","in":"in",into:"into",is:"is",it:"it",its:"its",just:"just",least:"least",let:"let",like:"like",likely:"likely",may:"may",me:"me",might:"might",most:"most",must:"must",my:"my",neither:"neither",no:"no",nor:"nor",not:"not",of:"of",off:"off",often:"often",on:"on",only:"only",or:"or",other:"other",our:"our",own:"own",rather:"rather",said:"said",say:"say",says:"says",she:"she",should:"should",since:"since",so:"so",some:"some",than:"than",that:"that",the:"the",their:"their",them:"them",then:"then",there:"there",these:"these",they:"they","this":"this",tis:"tis",to:"to",too:"too",twas:"twas",us:"us",wants:"wants",was:"was",we:"we",were:"were",what:"what",when:"when",where:"where",which:"which","while":"while",who:"who",whom:"whom",why:"why",will:"will","with":"with",would:"would",yet:"yet",you:"you",your:"your"},t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){var e=t.replace(/^\W+/,"").replace(/\W+$/,"");return""===e?void 0:e},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t[0],o=t.slice(1);return i in n||(n[i]={docs:{}}),0===o.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(o,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n element for each result - res.results.forEach(function(res) { - var $li = $('
                                              • ', { - 'class': 'search-results-item' - }); - - var $title = $('

                                                '); - - var $link = $('', { - 'href': gitbook.state.basePath + '/' + res.url, - 'text': res.title - }); - - var content = res.body.trim(); - if (content.length > MAX_DESCRIPTION_SIZE) { - content = content.slice(0, MAX_DESCRIPTION_SIZE).trim()+'...'; - } - var $content = $('

                                                ').html(content); - - $link.appendTo($title); - $title.appendTo($li); - $content.appendTo($li); - $li.appendTo($searchList); - }); - } - - function launchSearch(q) { - // Add class for loading - $body.addClass('with-search'); - $body.addClass('search-loading'); - - // Launch search query - throttle(gitbook.search.query(q, 0, MAX_RESULTS) - .then(function(results) { - displayResults(results); - }) - .always(function() { - $body.removeClass('search-loading'); - }), 1000); - } - - function closeSearch() { - $body.removeClass('with-search'); - $bookSearchResults.removeClass('open'); - } - - function launchSearchFromQueryString() { - var q = getParameterByName('q'); - if (q && q.length > 0) { - // Update search input - $searchInput.val(q); - - // Launch search - launchSearch(q); - } - } - - function bindSearch() { - // Bind DOM - $searchInput = $('#book-search-input input'); - $bookSearchResults = $('#book-search-results'); - $searchList = $bookSearchResults.find('.search-results-list'); - $searchTitle = $bookSearchResults.find('.search-results-title'); - $searchResultsCount = $searchTitle.find('.search-results-count'); - $searchQuery = $searchTitle.find('.search-query'); - - // Launch query based on input content - function handleUpdate() { - var q = $searchInput.val(); - - if (q.length == 0) { - closeSearch(); - } - else { - launchSearch(q); - } - } - - // Detect true content change in search input - // Workaround for IE < 9 - var propertyChangeUnbound = false; - $searchInput.on('propertychange', function(e) { - if (e.originalEvent.propertyName == 'value') { - handleUpdate(); - } - }); - - // HTML5 (IE9 & others) - $searchInput.on('input', function(e) { - // Unbind propertychange event for IE9+ - if (!propertyChangeUnbound) { - $(this).unbind('propertychange'); - propertyChangeUnbound = true; - } - - handleUpdate(); - }); - - // Push to history on blur - $searchInput.on('blur', function(e) { - // Update history state - if (usePushState) { - var uri = updateQueryString('q', $(this).val()); - history.pushState({ path: uri }, null, uri); - } - }); - } - - gitbook.events.on('page.change', function() { - bindSearch(); - closeSearch(); - - // Launch search based on query parameter - if (gitbook.search.isInitialized()) { - launchSearchFromQueryString(); - } - }); - - gitbook.events.on('search.ready', function() { - bindSearch(); - - // Launch search from query param at start - launchSearchFromQueryString(); - }); - - function getParameterByName(name) { - var url = window.location.href; - name = name.replace(/[\[\]]/g, '\\$&'); - var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)', 'i'), - results = regex.exec(url); - if (!results) return null; - if (!results[2]) return ''; - return decodeURIComponent(results[2].replace(/\+/g, ' ')); - } - - function updateQueryString(key, value) { - value = encodeURIComponent(value); - - var url = window.location.href; - var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'), - hash; - - if (re.test(url)) { - if (typeof value !== 'undefined' && value !== null) - return url.replace(re, '$1' + key + '=' + value + '$2$3'); - else { - hash = url.split('#'); - url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, ''); - if (typeof hash[1] !== 'undefined' && hash[1] !== null) - url += '#' + hash[1]; - return url; - } - } - else { - if (typeof value !== 'undefined' && value !== null) { - var separator = url.indexOf('?') !== -1 ? '&' : '?'; - hash = url.split('#'); - url = hash[0] + separator + key + '=' + value; - if (typeof hash[1] !== 'undefined' && hash[1] !== null) - url += '#' + hash[1]; - return url; - } - else - return url; - } - } -}); diff --git a/gitbook/gitbook-plugin-sharing/buttons.js b/gitbook/gitbook-plugin-sharing/buttons.js deleted file mode 100644 index 709a4e4c..00000000 --- a/gitbook/gitbook-plugin-sharing/buttons.js +++ /dev/null @@ -1,90 +0,0 @@ -require(['gitbook', 'jquery'], function(gitbook, $) { - var SITES = { - 'facebook': { - 'label': 'Facebook', - 'icon': 'fa fa-facebook', - 'onClick': function(e) { - e.preventDefault(); - window.open('http://www.facebook.com/sharer/sharer.php?s=100&p[url]='+encodeURIComponent(location.href)); - } - }, - 'twitter': { - 'label': 'Twitter', - 'icon': 'fa fa-twitter', - 'onClick': function(e) { - e.preventDefault(); - window.open('http://twitter.com/home?status='+encodeURIComponent(document.title+' '+location.href)); - } - }, - 'google': { - 'label': 'Google+', - 'icon': 'fa fa-google-plus', - 'onClick': function(e) { - e.preventDefault(); - window.open('https://plus.google.com/share?url='+encodeURIComponent(location.href)); - } - }, - 'weibo': { - 'label': 'Weibo', - 'icon': 'fa fa-weibo', - 'onClick': function(e) { - e.preventDefault(); - window.open('http://service.weibo.com/share/share.php?content=utf-8&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)); - } - }, - 'instapaper': { - 'label': 'Instapaper', - 'icon': 'fa fa-instapaper', - 'onClick': function(e) { - e.preventDefault(); - window.open('http://www.instapaper.com/text?u='+encodeURIComponent(location.href)); - } - }, - 'vk': { - 'label': 'VK', - 'icon': 'fa fa-vk', - 'onClick': function(e) { - e.preventDefault(); - window.open('http://vkontakte.ru/share.php?url='+encodeURIComponent(location.href)); - } - } - }; - - - - gitbook.events.bind('start', function(e, config) { - var opts = config.sharing; - - // Create dropdown menu - var menu = $.map(opts.all, function(id) { - var site = SITES[id]; - - return { - text: site.label, - onClick: site.onClick - }; - }); - - // Create main button with dropdown - if (menu.length > 0) { - gitbook.toolbar.createButton({ - icon: 'fa fa-share-alt', - label: 'Share', - position: 'right', - dropdown: [menu] - }); - } - - // Direct actions to share - $.each(SITES, function(sideId, site) { - if (!opts[sideId]) return; - - gitbook.toolbar.createButton({ - icon: site.icon, - label: site.text, - position: 'right', - onClick: site.onClick - }); - }); - }); -}); diff --git a/gitbook/gitbook.js b/gitbook/gitbook.js deleted file mode 100644 index 13077b45..00000000 --- a/gitbook/gitbook.js +++ /dev/null @@ -1,4 +0,0 @@ -!function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ -return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
                                                "],col:[2,"","
                                                "],tr:[2,"","
                                                "],td:[3,"","
                                                "],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                Go to this page on cljdoc

                                                diff --git a/http/interceptors.html b/http/interceptors.html index 79e19187..f2cdb712 100644 --- a/http/interceptors.html +++ b/http/interceptors.html @@ -1,943 +1,9 @@ - - - - - - Interceptors · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                -
                                                - - - - - - - - -
                                                - -
                                                - -
                                                - - - - - - - - -
                                                -
                                                - -
                                                -
                                                - -
                                                - -

                                                Interceptors

                                                -

                                                Reitit has also support for interceptors as an alternative to using middleware. Basic interceptor handling is implemented in reitit.interceptor package. There is no interceptor executor shipped, but you can use libraries like Pedestal Interceptor or Sieppari to execute the chains.

                                                -

                                                Reitit-http

                                                -
                                                [metosin/reitit-http "0.5.5"]
                                                -
                                                -

                                                A module for http-routing using interceptors instead of middleware. Builds on top of the reitit-ring module having all the same features.

                                                -

                                                The differences:

                                                -
                                                  -
                                                • :interceptors key used in route data instead of :middleware
                                                • -
                                                • reitit.http/http-router requires an extra option :executor of type reitit.interceptor/Executor to execute the interceptor chain
                                                    -
                                                  • optionally, a routing interceptor can be used - it enqueues the matched interceptors into the context. See reitit.http/routing-interceptor for details.
                                                  • -
                                                  -
                                                • -
                                                -

                                                Simple example

                                                -
                                                (require '[reitit.ring :as ring])
                                                -(require '[reitit.http :as http])
                                                -(require '[reitit.interceptor.sieppari :as sieppari])
                                                -
                                                -(defn interceptor [number]
                                                -  {:enter (fn [ctx] (update-in ctx [:request :number] (fnil + 0) number))})
                                                -
                                                -(def app
                                                -  (http/ring-handler
                                                -    (http/router
                                                -      ["/api"
                                                -       {:interceptors [(interceptor 1)]}
                                                -
                                                -       ["/number"
                                                -        {:interceptors [(interceptor 10)]
                                                -         :get {:interceptors [(interceptor 100)]
                                                -               :handler (fn [req]
                                                -                          {:status 200
                                                -                           :body (select-keys req [:number])})}}]])
                                                -
                                                -    ;; the default handler
                                                -    (ring/create-default-handler)
                                                -
                                                -    ;; executor
                                                -    {:executor sieppari/executor}))
                                                -
                                                -
                                                -(app {:request-method :get, :uri "/"})
                                                -; {:status 404, :body "", :headers {}}
                                                -
                                                -(app {:request-method :get, :uri "/api/number"})
                                                -; {:status 200, :body {:number 111}}
                                                -
                                                -

                                                Why interceptors?

                                                - - - -
                                                - -
                                                -
                                                -
                                                - -

                                                results matching ""

                                                -
                                                  - -
                                                  -
                                                  - -

                                                  No results matching ""

                                                  - -
                                                  -
                                                  -
                                                  - -
                                                  -
                                                  - -
                                                  - - - - - - - - - - - - - - -
                                                  - - -
                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                  Go to this page on cljdoc

                                                  diff --git a/http/pedestal.html b/http/pedestal.html index cba7c8a0..71a728b1 100644 --- a/http/pedestal.html +++ b/http/pedestal.html @@ -1,954 +1,9 @@ - - - - - - Pedestal · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  -
                                                  - - - - - - - - -
                                                  - -
                                                  - -
                                                  - - - - - - - - -
                                                  -
                                                  - -
                                                  -
                                                  - -
                                                  - -

                                                  Pedestal

                                                  -

                                                  Pedestal is a backend web framework for Clojure. reitit-pedestal provides an alternative routing engine for Pedestal.

                                                  -
                                                  [metosin/reitit-pedestal "0.5.5"]
                                                  -
                                                  -

                                                  Why should one use reitit instead of the Pedestal default routing?

                                                  - -

                                                  To use Pedestal with reitit, you should first read both the Pedestal docs and the reitit interceptor guide.

                                                  -

                                                  Example

                                                  -

                                                  A minimalistic example on how to to swap the default-router with a reitit router.

                                                  -
                                                  ; [io.pedestal/pedestal.service "0.5.5"]
                                                  -; [io.pedestal/pedestal.jetty "0.5.5"]
                                                  -; [metosin/reitit-pedestal "0.5.5"]
                                                  -; [metosin/reitit "0.5.5"]
                                                  -
                                                  -(require '[io.pedestal.http :as server])
                                                  -(require '[reitit.pedestal :as pedestal])
                                                  -(require '[reitit.http :as http])
                                                  -(require '[reitit.ring :as ring])
                                                  -
                                                  -(defn interceptor [number]
                                                  -  {:enter (fn [ctx] (update-in ctx [:request :number] (fnil + 0) number))})
                                                  -
                                                  -(def routes
                                                  -  ["/api"
                                                  -   {:interceptors [(interceptor 1)]}
                                                  -
                                                  -   ["/number"
                                                  -    {:interceptors [(interceptor 10)]
                                                  -     :get {:interceptors [(interceptor 100)]
                                                  -           :handler (fn [req]
                                                  -                      {:status 200
                                                  -                       :body (select-keys req [:number])})}}]])
                                                  -
                                                  -(-> {::server/type :jetty
                                                  -     ::server/port 3000
                                                  -     ::server/join? false
                                                  -     ;; no pedestal routes
                                                  -     ::server/routes []}
                                                  -    (server/default-interceptors)
                                                  -    ;; swap the reitit router
                                                  -    (pedestal/replace-last-interceptor
                                                  -      (pedestal/routing-interceptor
                                                  -        (http/router routes)))
                                                  -    (server/dev-interceptors)
                                                  -    (server/create-server)
                                                  -    (server/start))
                                                  -
                                                  -

                                                  Compatibility

                                                  -

                                                  There is no common interceptor spec for Clojure and all default reitit interceptors (coercion, exceptions etc.) use the Sieppari interceptor model. It is mostly compatible with the Pedestal Interceptor model, only exception being that the :error handlers take just 1 arity (context) compared to Pedestal's 2-arity (context and exception).

                                                  -

                                                  Currently, out of the reitit default interceptors, there is only the reitit.http.interceptors.exception/exception-interceptor which has the :error defined.

                                                  -

                                                  You are most welcome to discuss about a common interceptor spec in #interceptors on Clojurians Slack.

                                                  -

                                                  More examples

                                                  -

                                                  Simple

                                                  -

                                                  Simple example with sync & async interceptors: https://github.com/metosin/reitit/tree/master/examples/pedestal

                                                  -

                                                  Swagger

                                                  -

                                                  More complete example with custom interceptors, default interceptors, coercion and swagger-support enabled: https://github.com/metosin/reitit/tree/master/examples/pedestal-swagger

                                                  - - -
                                                  - -
                                                  -
                                                  -
                                                  - -

                                                  results matching ""

                                                  -
                                                    - -
                                                    -
                                                    - -

                                                    No results matching ""

                                                    - -
                                                    -
                                                    -
                                                    - -
                                                    -
                                                    - -
                                                    - - - - - - - - - - - - - - -
                                                    - - -
                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                    Go to this page on cljdoc

                                                    diff --git a/http/sieppari.html b/http/sieppari.html index f27a6b7c..86e668fc 100644 --- a/http/sieppari.html +++ b/http/sieppari.html @@ -1,955 +1,9 @@ - - - - - - Sieppari · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                    -
                                                    - - - - - - - - -
                                                    - -
                                                    - -
                                                    - - - - - - - - -
                                                    -
                                                    - -
                                                    -
                                                    - -
                                                    - -

                                                    Sieppari

                                                    -
                                                    [metosin/reitit-sieppari "0.5.5"]
                                                    -
                                                    -

                                                    Sieppari is a new and fast interceptor implementation for Clojure, with pluggable async supporting core.async, Manifold and Promesa.

                                                    -

                                                    To use Sieppari with reitit-http, we need to attach a reitit.interceptor.sieppari/executor to a http-router to compile and execute the interceptor chains. Reitit and Sieppari share the same interceptor model, so all reitit default interceptors work seamlessly together.

                                                    -

                                                    We can use both synchronous ring and async-ring with Sieppari.

                                                    -

                                                    Synchronous Ring

                                                    -
                                                    (require '[reitit.http :as http])
                                                    -(require '[reitit.interceptor.sieppari :as sieppari])
                                                    -
                                                    -(defn i [x]
                                                    -  {:enter (fn [ctx] (println "enter " x) ctx)
                                                    -   :leave (fn [ctx] (println "leave " x) ctx)})
                                                    -
                                                    -(defn handler [_]
                                                    -  (future {:status 200, :body "pong"}))
                                                    -
                                                    -(def app
                                                    -  (http/ring-handler
                                                    -    (http/router
                                                    -      ["/api"
                                                    -       {:interceptors [(i :api)]}
                                                    -
                                                    -       ["/ping"
                                                    -        {:interceptors [(i :ping)]
                                                    -         :get {:interceptors [(i :get)]
                                                    -               :handler handler}}]])
                                                    -    {:executor sieppari/executor}))
                                                    -
                                                    -(app {:request-method :get, :uri "/api/ping"})
                                                    -;enter  :api
                                                    -;enter  :ping
                                                    -;enter  :get
                                                    -;leave  :get
                                                    -;leave  :ping
                                                    -;leave  :api
                                                    -;=> {:status 200, :body "pong"}
                                                    -
                                                    -

                                                    Async-ring

                                                    -
                                                    (let [respond (promise)]
                                                    -  (app {:request-method :get, :uri "/api/ping"} respond nil)
                                                    -  (deref respond 1000 ::timeout))
                                                    -;enter  :api
                                                    -;enter  :ping
                                                    -;enter  :get
                                                    -;leave  :get
                                                    -;leave  :ping
                                                    -;leave  :api
                                                    -;=> {:status 200, :body "pong"}
                                                    -
                                                    -

                                                    Examples

                                                    -

                                                    Simple

                                                    - -

                                                    With batteries

                                                    - - - -
                                                    - -
                                                    -
                                                    -
                                                    - -

                                                    results matching ""

                                                    -
                                                      - -
                                                      -
                                                      - -

                                                      No results matching ""

                                                      - -
                                                      -
                                                      -
                                                      - -
                                                      -
                                                      - -
                                                      - - - - - - - - - - - - - - -
                                                      - - -
                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                      Go to this page on cljdoc

                                                      diff --git a/http/transforming_interceptor_chain.html b/http/transforming_interceptor_chain.html index f64360fa..2596ac40 100644 --- a/http/transforming_interceptor_chain.html +++ b/http/transforming_interceptor_chain.html @@ -1,954 +1,9 @@ - - - - - - Transforming Interceptor Chain · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                      -
                                                      - - - - - - - - -
                                                      - -
                                                      - -
                                                      - - - - - - - - -
                                                      -
                                                      - -
                                                      -
                                                      - -
                                                      - -

                                                      Transforming the Interceptor Chain

                                                      -

                                                      There is an extra option in http-router (actually, in the underlying interceptor-router): :reitit.interceptor/transform to transform the interceptor chain per endpoint. Value should be a function or a vector of functions that get a vector of compiled interceptors and should return a new vector of interceptors.

                                                      -

                                                      Note: the last interceptor in the chain is usually the handler, compiled into an Interceptor. Applying a transformation clojure.core/reverse would put this interceptor into first in the chain, making the rest of the interceptors effectively unreachable. There is a helper reitit.interceptor/transform-butlast to transform all but the last interceptor.

                                                      -

                                                      Example Application

                                                      -
                                                      (require '[reitit.http :as http])
                                                      -(require '[reitit.interceptor.sieppari :as sieppari])
                                                      -
                                                      -(defn interceptor [message]
                                                      -  {:enter (fn [ctx] (update-in ctx [:request :message] (fnil conj []) message))})
                                                      -
                                                      -(defn handler [req]
                                                      -  {:status 200
                                                      -   :body (select-keys req [:message])})
                                                      -
                                                      -(def app
                                                      -  (http/ring-handler
                                                      -    (http/router
                                                      -      ["/api" {:interceptors [(interceptor 1) (interceptor 2)]}
                                                      -       ["/ping" {:get {:interceptors [(interceptor 3)]
                                                      -                       :handler handler}}]])
                                                      -    {:executor sieppari/executor}))
                                                      -
                                                      -(app {:request-method :get, :uri "/api/ping"})
                                                      -; {:status 200, :body {:message [1 2 3]}}
                                                      -
                                                      -

                                                      Reversing the Interceptor Chain

                                                      -
                                                      (def app
                                                      -  (http/ring-handler
                                                      -    (http/router
                                                      -      ["/api" {:interceptors [(interceptor 1) (interceptor 2)]}
                                                      -       ["/ping" {:get {:interceptors [(interceptor 3)]
                                                      -                       :handler handler}}]]
                                                      -      {::interceptor/transform (interceptor/transform-butlast reverse)})
                                                      -    {:executor sieppari/executor}))
                                                      -
                                                      -(app {:request-method :get, :uri "/api/ping"})
                                                      -; {:status 200, :body {:message [3 2 1]}}
                                                      -
                                                      -

                                                      Interleaving Interceptors

                                                      -
                                                      (def app
                                                      -  (http/ring-handler
                                                      -    (http/router
                                                      -      ["/api" {:interceptors [(interceptor 1) (interceptor 2)]}
                                                      -       ["/ping" {:get {:interceptors [(interceptor 3)]
                                                      -                       :handler handler}}]]
                                                      -      {::interceptor/transform #(interleave % (repeat (interceptor :debug)))})
                                                      -    {:executor sieppari/executor}))
                                                      -
                                                      -(app {:request-method :get, :uri "/api/ping"})
                                                      -; {:status 200, :body {:message [1 :debug 2 :debug 3 :debug]}}
                                                      -
                                                      -

                                                      Printing Context Diffs

                                                      -
                                                      [metosin/reitit-interceptors "0.5.5"]
                                                      -
                                                      -

                                                      Using reitit.http.interceptors.dev/print-context-diffs transformation, the context diffs between each interceptor are printed out to the console. To use it, add the following router option:

                                                      -
                                                      :reitit.interceptor/transform reitit.http.interceptor.dev/print-context-diffs
                                                      -
                                                      -

                                                      Sample output:

                                                      -

                                                      Http Context Diff

                                                      -

                                                      Sample applications (uncomment the option to see the diffs):

                                                      - - - -
                                                      - -
                                                      -
                                                      -
                                                      - -

                                                      results matching ""

                                                      -
                                                        - -
                                                        -
                                                        - -

                                                        No results matching ""

                                                        - -
                                                        -
                                                        -
                                                        - -
                                                        -
                                                        - -
                                                        - - - - - - - - - - - - - - -
                                                        - - -
                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                        Go to this page on cljdoc

                                                        diff --git a/index.html b/index.html index a489d428..e227856e 100644 --- a/index.html +++ b/index.html @@ -1,1019 +1,9 @@ - - - - - - Introduction · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                        -
                                                        - - - - - - - - -
                                                        - -
                                                        - -
                                                        - - - - - - - - -
                                                        -
                                                        - -
                                                        -
                                                        - -
                                                        - -

                                                        Introduction

                                                        -

                                                        Reitit is a fast data-driven router for Clojure(Script).

                                                        - -

                                                        There is #reitit in Clojurians Slack for discussion & help.

                                                        -

                                                        Main Modules

                                                        - -

                                                        Extra modules

                                                        -
                                                          -
                                                        • reitit-pedestal support for Pedestal
                                                        • -
                                                        -

                                                        Latest version

                                                        -

                                                        All bundled:

                                                        -
                                                        [metosin/reitit "0.5.5"]
                                                        -
                                                        -

                                                        Optionally, the parts can be required separately.

                                                        -

                                                        Examples

                                                        -

                                                        Simple router

                                                        -
                                                        (require '[reitit.core :as r])
                                                        -
                                                        -(def router
                                                        -  (r/router
                                                        -    [["/api/ping" ::ping]
                                                        -     ["/api/orders/:id" ::order-by-id]]))
                                                        -
                                                        -

                                                        Routing:

                                                        -
                                                        (r/match-by-path router "/api/ipa")
                                                        -; nil
                                                        -
                                                        -(r/match-by-path router "/api/ping")
                                                        -; #Match{:template "/api/ping"
                                                        -;        :data {:name ::ping}
                                                        -;        :result nil
                                                        -;        :path-params {}
                                                        -;        :path "/api/ping"}
                                                        -
                                                        -(r/match-by-path router "/api/orders/1")
                                                        -; #Match{:template "/api/orders/:id"
                                                        -;        :data {:name ::order-by-id}
                                                        -;        :result nil
                                                        -;        :path-params {:id "1"}
                                                        -;        :path "/api/orders/1"}
                                                        -
                                                        -

                                                        Reverse-routing:

                                                        -
                                                        (r/match-by-name router ::ipa)
                                                        -; nil
                                                        -
                                                        -(r/match-by-name router ::ping)
                                                        -; #Match{:template "/api/ping"
                                                        -;        :data {:name ::ping}
                                                        -;        :result nil
                                                        -;        :path-params {}
                                                        -;        :path "/api/ping"}
                                                        -
                                                        -(r/match-by-name router ::order-by-id)
                                                        -; #PartialMatch{:template "/api/orders/:id"
                                                        -;               :data {:name :user/order-by-id}
                                                        -;               :result nil
                                                        -;               :path-params nil
                                                        -;               :required #{:id}}
                                                        -
                                                        -(r/partial-match? (r/match-by-name router ::order-by-id))
                                                        -; true
                                                        -
                                                        -(r/match-by-name router ::order-by-id {:id 2})
                                                        -; #Match{:template "/api/orders/:id",
                                                        -;        :data {:name ::order-by-id},
                                                        -;        :result nil,
                                                        -;        :path-params {:id 2},
                                                        -;        :path "/api/orders/2"}
                                                        -
                                                        -

                                                        Ring-router

                                                        -

                                                        Ring-router adds support for :handler functions, :middleware and routing based on :request-method. It also supports pluggable parameter coercion (clojure.spec), data-driven middleware, route and middleware compilation, dynamic extensions and more.

                                                        -
                                                        (require '[reitit.ring :as ring])
                                                        -
                                                        -(defn handler [_]
                                                        -  {:status 200, :body "ok"})
                                                        -
                                                        -(defn wrap [handler id]
                                                        -  (fn [request]
                                                        -    (update (handler request) :wrap (fnil conj '()) id)))
                                                        -
                                                        -(def app
                                                        -  (ring/ring-handler
                                                        -    (ring/router
                                                        -      ["/api" {:middleware [[wrap :api]]}
                                                        -       ["/ping" {:get handler
                                                        -                 :name ::ping}]
                                                        -       ["/admin" {:middleware [[wrap :admin]]}
                                                        -        ["/users" {:get handler
                                                        -                   :post handler}]]])))
                                                        -
                                                        -

                                                        Routing:

                                                        -
                                                        (app {:request-method :get, :uri "/api/admin/users"})
                                                        -; {:status 200, :body "ok", :wrap (:api :admin}
                                                        -
                                                        -(app {:request-method :put, :uri "/api/admin/users"})
                                                        -; nil
                                                        -
                                                        -

                                                        Reverse-routing:

                                                        -
                                                        (require '[reitit.core :as r])
                                                        -
                                                        -(-> app (ring/get-router) (r/match-by-name ::ping))
                                                        -; #Match{:template "/api/ping"
                                                        -;        :data {:middleware [[#object[user$wrap] :api]]
                                                        -;               :get {:handler #object[user$handler]}
                                                        -;        :name ::ping}
                                                        -;        :result #Methods{...}
                                                        -;        :path-params nil
                                                        -;        :path "/api/ping"}
                                                        -
                                                        - - -
                                                        - -
                                                        -
                                                        -
                                                        - -

                                                        results matching ""

                                                        -
                                                          - -
                                                          -
                                                          - -

                                                          No results matching ""

                                                          - -
                                                          -
                                                          -
                                                          - -
                                                          -
                                                          - -
                                                          - - - - - - - - - - -
                                                          - - -
                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                          Go to this page on cljdoc

                                                          diff --git a/performance.html b/performance.html index d35b3a93..d4cc3c62 100644 --- a/performance.html +++ b/performance.html @@ -1,1002 +1,9 @@ - - - - - - Performance · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                          -
                                                          - - - - - - - - -
                                                          - -
                                                          - -
                                                          - - - - - - - - -
                                                          -
                                                          - -
                                                          -
                                                          - -
                                                          - -

                                                          Performance

                                                          -

                                                          Reitit tries to be really, really fast.

                                                          -

                                                          Opensensors perf test

                                                          -

                                                          Rationale

                                                          -
                                                            -
                                                          • Multiple routing algorithms, chosen based on the route tree
                                                          • -
                                                          • Route flattening and re-ordering
                                                          • -
                                                          • Managed mutability over immutability
                                                          • -
                                                          • Precompute/compile as much as possible (matches, middleware, interceptors, routes, path-parameter sets)
                                                          • -
                                                          • Use abstractions that enable JVM optimizations
                                                          • -
                                                          • Use small functions to enable JVM Inlining
                                                          • -
                                                          • Use Java where needed
                                                          • -
                                                          • Protocols over Multimethods
                                                          • -
                                                          • Records over Maps
                                                          • -
                                                          • Always be measuring
                                                          • -
                                                          • Don't trust the (micro-)benchmarks
                                                          • -
                                                          -

                                                          Does routing performance matter?

                                                          -

                                                          Well, it depends. With small route trees, it might not. But, with large (real-life) route trees, difference between the fastest and the slowest tested libs can be two or three orders of magnitude. For busy sites it actually matters if you routing request takes 100 ns or 100 µs. A lot.

                                                          -

                                                          TechEmpower Web Framework Benchmarks

                                                          -

                                                          Reitit + jsonista + pohjavirta is one of the fastest JSON api stacks in the tests. See full results here.

                                                          -

                                                          Tech

                                                          -

                                                          Tests

                                                          -

                                                          All perf tests are found in the repo and have been run with the following setup:

                                                          -
                                                          ;;
                                                          -;; start repl with `lein perf repl`
                                                          -;; perf measured with the following setup:
                                                          -;;
                                                          -;; Model Name:            MacBook Pro
                                                          -;; Model Identifier:      MacBookPro11,3
                                                          -;; Processor Name:        Intel Core i7
                                                          -;; Processor Speed:       2,5 GHz
                                                          -;; Number of Processors:  1
                                                          -;; Total Number of Cores: 4
                                                          -;; L2 Cache (per Core):   256 KB
                                                          -;; L3 Cache:              6 MB
                                                          -;; Memory:                16 GB
                                                          -;;
                                                          -

                                                          NOTE: Tests are not scientific proof and may contain errors. You should always run the perf tests with your own (real-life) routing tables to get more accurate results for your use case. Also, if you have idea how to test things better, please let us know.

                                                          -

                                                          Simple Example

                                                          -

                                                          The routing sample taken from bide README:

                                                          -
                                                          (require '[reitit.core :as r])
                                                          -(require '[criterium.core :as cc])
                                                          -
                                                          -(def routes
                                                          -  (r/router
                                                          -    [["/auth/login" :auth/login]
                                                          -     ["/auth/recovery/token/:token" :auth/recovery]
                                                          -     ["/workspace/:project/:page" :workspace/page]]))
                                                          -
                                                          -;; Execution time mean (per 1000) : 3.2 µs -> 312M ops/sec
                                                          -(cc/quick-bench
                                                          -  (dotimes [_ 1000]
                                                          -    (r/match-by-path routes "/auth/login")))
                                                          -
                                                          -;; Execution time mean (per 1000): 115 µs -> 8.7M ops/sec
                                                          -(cc/quick-bench
                                                          -  (dotimes [_ 1000]
                                                          -    (r/match-by-path routes "/workspace/1/1")))
                                                          -
                                                          -

                                                          Based on the perf tests, the first (static path) lookup is 300-500x faster and the second (wildcard path) lookup is 18-110x faster that the other tested routing libs (Ataraxy, Bidi, Compojure and Pedestal).

                                                          -

                                                          But, the example is too simple for any real benchmark. Also, some of the libraries always match on the :request-method too and by doing so, do more work than just match by path. Compojure does most work also by invoking the handler.

                                                          -

                                                          So, we need to test something more realistic.

                                                          -

                                                          RESTful apis

                                                          -

                                                          To get better view on the real life routing performance, there is test of a mid-size rest(ish) http api with 50+ routes, having a lot of path parameters. The route definitions are pulled off from the OpenSensors swagger definitions.

                                                          -

                                                          Thanks to the snappy Wildcard Trie (a modification of Radix Tree), reitit-ring is fastest here. Calfpath and Pedestal are also quite fast.

                                                          -

                                                          Opensensors perf

                                                          -

                                                          CQRS apis

                                                          -

                                                          Another real-life test scenario is a CQRS style route tree, where all the paths are static, e.g. /api/command/add-order. The 300 route definitions are pulled out from Lupapiste.

                                                          -

                                                          Both reitit-ring and Pedestal shine in this test, thanks to the fast lookup-routers. On average, they are two and on best case, three orders of magnitude faster than the other tested libs. Ataraxy failed this test on Method code too large! error.

                                                          -

                                                          lupapiste perf

                                                          -

                                                          NOTE: in real life, there are usually always also wild-card routes present. In this case, Pedestal would fallback from lookup-router to the prefix-tree router, which is order of magnitude slower (30x in this test). Reitit would handle this nicely thanks to it's :mixed-router: all static routes would still be served with :lookup-router, just the wildcard routes with :segment-tree. The performance would not notably degrade.

                                                          -

                                                          Path conflicts

                                                          -

                                                          TODO

                                                          -

                                                          Why measure?

                                                          -

                                                          The reitit routing perf is measured to get an internal baseline to optimize against. We also want to ensure that new features don't regress the performance. Perf tests should be run in a stable CI environment. Help welcome!

                                                          -

                                                          Looking out of the box

                                                          -

                                                          A quick poke to the fast routers in Go indicates that reitit is less than 50% slower than the fastest routers in Go. Which is kinda awesome.

                                                          -

                                                          Faster!

                                                          -

                                                          By default, reitit.ring/ring-router, reitit.http/ring-router and reitit.http/routing-interceptor inject both Match and Router into the request. You can remove the injections setting options :inject-match? and :inject-router? to false. This saves some tens of nanos (with the hw described above).

                                                          -
                                                          (require '[reitit.ring :as ring])
                                                          -(require '[criterium.core :as cc])
                                                          -
                                                          -(defn create [options]
                                                          -  (ring/ring-handler
                                                          -    (ring/router
                                                          -      ["/ping" (constantly {:status 200, :body "ok"})])
                                                          -    (ring/create-default-handler)
                                                          -    options))
                                                          -
                                                          -;; 130ns
                                                          -(let [app (create nil)]
                                                          -  (cc/quick-bench
                                                          -    (app {:request-method :get, :uri "/ping"})))
                                                          -
                                                          -;; 80ns
                                                          -(let [app (create {:inject-router? false, :inject-match? false})]
                                                          -  (cc/quick-bench
                                                          -    (app {:request-method :get, :uri "/ping"})))
                                                          -
                                                          -

                                                          NOTE: Without Router, you can't to do reverse routing and without Match you can't write dynamic extensions.

                                                          -

                                                          Performance tips

                                                          -

                                                          Few things that have an effect on performance:

                                                          -
                                                            -
                                                          • Wildcard-routes are an order of magnitude slower than static routes
                                                          • -
                                                          • Conflicting routes are served with LinearRouter, which is the slowest implementation.
                                                          • -
                                                          • It's ok to mix non-wildcard, wildcard or even conflicting routes in a same routing tree. Reitit will create an hierarchy of routers to serve all the routes with best possible implementation.
                                                          • -
                                                          • Move computation from request processing time into creation time, using by compiling middleware, interceptors and route data.
                                                              -
                                                            • Unmounted middleware (or interceptor) is infinitely faster than a mounted one effectively doing nothing.
                                                            • -
                                                            -
                                                          • -
                                                          - - -
                                                          - -
                                                          -
                                                          -
                                                          - -

                                                          results matching ""

                                                          -
                                                            - -
                                                            -
                                                            - -

                                                            No results matching ""

                                                            - -
                                                            -
                                                            -
                                                            - -
                                                            -
                                                            - -
                                                            - - - - - - - - - - - - - - -
                                                            - - -
                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                            Go to this page on cljdoc

                                                            diff --git a/ring/RESTful_form_methods.html b/ring/RESTful_form_methods.html index 7f05451a..789821e7 100644 --- a/ring/RESTful_form_methods.html +++ b/ring/RESTful_form_methods.html @@ -1,920 +1,9 @@ - - - - - - RESTful form methods · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                            -
                                                            - - - - - - - - -
                                                            - -
                                                            - -
                                                            - - - - - - - - -
                                                            -
                                                            - -
                                                            -
                                                            - -
                                                            - -

                                                            RESTful form methods

                                                            -

                                                            When designing RESTful applications you will be doing a lot of "PATCH" and "DELETE" request, but most browsers don't support methods other than "GET" and "POST" when it comes to submitting forms.

                                                            -

                                                            There is a pattern to solve this (pioneered by Rails) using a hidden "_method" field in the form and swapping out the "POST" method for whatever is in that field.

                                                            -

                                                            We can do this with middleware in reitit like this:

                                                            -
                                                            (defn- hidden-method
                                                            -  [request]
                                                            -  (keyword 
                                                            -    (or (get-in request [:form-params "_method"])         ;; look for "_method" field in :form-params
                                                            -        (get-in request [:multipart-params "_method"])))) ;; or in :multipart-params
                                                            -
                                                            -(def wrap-hidden-method
                                                            -  {:name ::wrap-hidden-method
                                                            -   :wrap (fn [handler]
                                                            -           (fn [request]
                                                            -             (if-let [fm (and (= :post (:request-method request)) ;; if this is a :post request
                                                            -                              (hidden-method request))]           ;; and there is a "_method" field 
                                                            -               (handler (assoc request :request-method fm)) ;; replace :request-method
                                                            -               (handler request))))})
                                                            -
                                                            -

                                                            And apply the middleware like this:

                                                            -
                                                            (reitit.ring/ring-handler
                                                            -  (reitit.ring/router ...)
                                                            -  (reitit.ring/create-default-handler)
                                                            -  {:middleware 
                                                            -    [reitit.ring.middleware.parameters/parameters-middleware ;; needed to have :form-params in the request map
                                                            -     reitit.ring.middleware.multipart/multipart-middleware   ;; needed to have :multipart-params in the request map
                                                            -     wrap-hidden-method]}) ;; our hidden method wrapper
                                                            -
                                                            -

                                                            (NOTE: This middleware must be placed here and not inside the route data given to reitit.ring/handler. -This is so that our middleware is applied before reitit matches the request with a specific handler using the wrong method.)

                                                            - - -
                                                            - -
                                                            -
                                                            -
                                                            - -

                                                            results matching ""

                                                            -
                                                              - -
                                                              -
                                                              - -

                                                              No results matching ""

                                                              - -
                                                              -
                                                              -
                                                              - -
                                                              -
                                                              - -
                                                              - - - - - - - - - - - - - - -
                                                              - - -
                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                              Go to this page on cljdoc

                                                              diff --git a/ring/coercion.html b/ring/coercion.html index 13bca078..0b55e4a4 100644 --- a/ring/coercion.html +++ b/ring/coercion.html @@ -1,1121 +1,9 @@ - - - - - - Pluggable Coercion · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                              -
                                                              - - - - - - - - -
                                                              - -
                                                              - -
                                                              - - - - - - - - -
                                                              -
                                                              - -
                                                              -
                                                              - -
                                                              - -

                                                              Ring Coercion

                                                              -

                                                              Basic coercion is explained in detail in the Coercion Guide. With Ring, both request parameters and response bodies can be coerced.

                                                              -

                                                              The following request parameters are currently supported:

                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                              typerequest source
                                                              :query:query-params
                                                              :body:body-params
                                                              :form:form-params
                                                              :header:header-params
                                                              :path:path-params
                                                              -

                                                              To enable coercion, the following things need to be done:

                                                              -
                                                                -
                                                              • Define a reitit.coercion/Coercion for the routes
                                                              • -
                                                              • Define types for the parameters and/or responses
                                                              • -
                                                              • Mount Coercion Middleware to apply to coercion
                                                              • -
                                                              • Use the coerced parameters in a handler/middleware
                                                              • -
                                                              -

                                                              Define coercion

                                                              -

                                                              reitit.coercion/Coercion is a protocol defining how types are defined, coerced and inventoried.

                                                              -

                                                              Reitit ships with the following coercion modules:

                                                              - -

                                                              Coercion can be attached to route data under :coercion key. There can be multiple Coercion implementations within a single router, normal scoping rules apply.

                                                              -

                                                              Defining parameters and responses

                                                              -

                                                              Parameters are defined in route data under :parameters key. It's value should be a map of parameter :type -> Coercion Schema.

                                                              -

                                                              Responses are defined in route data under :responses key. It's value should be a map of http status code to a map which can contain :body key with Coercion Schema as value.

                                                              -

                                                              Below is an example with Plumatic Schema. It defines schemas for :query, :body and :path parameters and for http 200 response :body.

                                                              -

                                                              Handler can access the coerced parameters can be read under :parameters key in the request.

                                                              -
                                                              (require '[reitit.coercion.schema])
                                                              -(require '[schema.core :as s])
                                                              -
                                                              -(def PositiveInt (s/constrained s/Int pos? 'PositiveInt))
                                                              -
                                                              -(def plus-endpoint
                                                              -  {:coercion reitit.coercion.schema/coercion
                                                              -   :parameters {:query {:x s/Int}
                                                              -                :body {:y s/Int}
                                                              -                :path {:z s/Int}}
                                                              -   :responses {200 {:body {:total PositiveInt}}}
                                                              -   :handler (fn [{:keys [parameters]}]
                                                              -              (let [total (+ (-> parameters :query :x)
                                                              -                             (-> parameters :body :y)
                                                              -                             (-> parameters :path :z))]
                                                              -                {:status 200
                                                              -                 :body {:total total}}))})
                                                              -
                                                              -

                                                              Coercion Middleware

                                                              -

                                                              Defining a coercion for a route data doesn't do anything, as it's just data. We have to attach some code to apply the actual coercion. We can use the middleware from reitit.ring.coercion:

                                                              -
                                                                -
                                                              • coerce-request-middleware to apply the parameter coercion
                                                              • -
                                                              • coerce-response-middleware to apply the response coercion
                                                              • -
                                                              • coerce-exceptions-middleware to transform coercion exceptions into pretty responses
                                                              • -
                                                              -

                                                              Full example

                                                              -

                                                              Here's an full example for applying coercion with Reitit, Ring and Schema:

                                                              -
                                                              (require '[reitit.ring.coercion :as rrc])
                                                              -(require '[reitit.coercion.schema])
                                                              -(require '[reitit.ring :as ring])
                                                              -(require '[schema.core :as s])
                                                              -
                                                              -(def PositiveInt (s/constrained s/Int pos? 'PositiveInt))
                                                              -
                                                              -(def app
                                                              -  (ring/ring-handler
                                                              -    (ring/router
                                                              -      ["/api"
                                                              -       ["/ping" {:name ::ping
                                                              -                 :get (fn [_]
                                                              -                        {:status 200
                                                              -                         :body "pong"})}]
                                                              -       ["/plus/:z" {:name ::plus
                                                              -                    :post {:coercion reitit.coercion.schema/coercion
                                                              -                           :parameters {:query {:x s/Int}
                                                              -                                        :body {:y s/Int}
                                                              -                                        :path {:z s/Int}}
                                                              -                           :responses {200 {:body {:total PositiveInt}}}
                                                              -                           :handler (fn [{:keys [parameters]}]
                                                              -                                      (let [total (+ (-> parameters :query :x)
                                                              -                                                     (-> parameters :body :y)
                                                              -                                                     (-> parameters :path :z))]
                                                              -                                        {:status 200
                                                              -                                         :body {:total total}}))}}]]
                                                              -      {:data {:middleware [rrc/coerce-exceptions-middleware
                                                              -                           rrc/coerce-request-middleware
                                                              -                           rrc/coerce-response-middleware]}})))
                                                              -
                                                              -

                                                              Valid request:

                                                              -
                                                              (app {:request-method :post
                                                              -      :uri "/api/plus/3"
                                                              -      :query-params {"x" "1"}
                                                              -      :body-params {:y 2}})
                                                              -; {:status 200, :body {:total 6}}
                                                              -
                                                              -

                                                              Invalid request:

                                                              -
                                                              (app {:request-method :post
                                                              -      :uri "/api/plus/3"
                                                              -      :query-params {"x" "abba"}
                                                              -      :body-params {:y 2}})
                                                              -; {:status 400,
                                                              -;  :body {:schema {:x "Int", "Any" "Any"},
                                                              -;         :errors {:x "(not (integer? \"abba\"))"},
                                                              -;         :type :reitit.coercion/request-coercion,
                                                              -;         :coercion :schema,
                                                              -;         :value {:x "abba"},
                                                              -;         :in [:request :query-params]}}
                                                              -
                                                              -

                                                              Invalid response:

                                                              -
                                                              (app {:request-method :post
                                                              -      :uri "/api/plus/3"
                                                              -      :query-params {"x" "1"}
                                                              -      :body-params {:y -10}})
                                                              -; {:status 500,
                                                              -;  :body {:schema {:total "(constrained Int PositiveInt)"},
                                                              -;         :errors {:total "(not (PositiveInt -6))"},
                                                              -;         :type :reitit.coercion/response-coercion,
                                                              -;         :coercion :schema,
                                                              -;         :value {:total -6},
                                                              -;         :in [:response :body]}}
                                                              -
                                                              -

                                                              Pretty printing spec errors

                                                              -

                                                              Spec problems are exposed as-is into request & response coercion errors, enabling pretty-printers like expound to be used:

                                                              -
                                                              (require '[reitit.ring :as ring])
                                                              -(require '[reitit.ring.middleware.exception :as exception])
                                                              -(require '[reitit.ring.coercion :as coercion])
                                                              -(require '[expound.alpha :as expound])
                                                              -
                                                              -(defn coercion-error-handler [status]
                                                              -  (let [printer (expound/custom-printer {:theme :figwheel-theme, :print-specs? false})
                                                              -        handler (exception/create-coercion-handler status)]
                                                              -    (fn [exception request]
                                                              -      (printer (-> exception ex-data :problems))
                                                              -      (handler exception request))))
                                                              -
                                                              -(def app
                                                              -  (ring/ring-handler
                                                              -    (ring/router
                                                              -      ["/plus"
                                                              -       {:get
                                                              -        {:parameters {:query {:x int?, :y int?}}
                                                              -         :responses {200 {:body {:total pos-int?}}}
                                                              -         :handler (fn [{{{:keys [x y]} :query} :parameters}]
                                                              -                    {:status 200, :body {:total (+ x y)}})}}]
                                                              -      {:data {:coercion reitit.coercion.spec/coercion
                                                              -              :middleware [(exception/create-exception-middleware
                                                              -                             (merge
                                                              -                               exception/default-handlers
                                                              -                               {:reitit.coercion/request-coercion (coercion-error-handler 400)
                                                              -                                :reitit.coercion/response-coercion (coercion-error-handler 500)}))
                                                              -                           coercion/coerce-request-middleware
                                                              -                           coercion/coerce-response-middleware]}})))
                                                              -
                                                              -(app
                                                              -  {:uri "/plus"
                                                              -   :request-method :get
                                                              -   :query-params {"x" "1", "y" "fail"}})
                                                              -; => ...
                                                              -; -- Spec failed --------------------
                                                              -;
                                                              -;   {:x ..., :y "fail"}
                                                              -;                ^^^^^^
                                                              -;
                                                              -; should satisfy
                                                              -;
                                                              -;   int?
                                                              -
                                                              -
                                                              -
                                                              -(app
                                                              -  {:uri "/plus"
                                                              -   :request-method :get
                                                              -   :query-params {"x" "1", "y" "-2"}})
                                                              -; => ...
                                                              -;-- Spec failed --------------------
                                                              -;
                                                              -;   {:total -1}
                                                              -;           ^^
                                                              -;
                                                              -; should satisfy
                                                              -;
                                                              -;   pos-int?
                                                              -
                                                              -

                                                              Optimizations

                                                              -

                                                              The coercion middleware are compiled against a route. In the middleware compilation step the actual coercer implementations are constructed for the defined models. Also, the middleware doesn't mount itself if a route doesn't have :coercion and :parameters or :responses defined.

                                                              -

                                                              We can query the compiled middleware chain for the routes:

                                                              -
                                                              (require '[reitit.core :as r])
                                                              -
                                                              -(-> (ring/get-router app)
                                                              -    (r/match-by-name ::plus)
                                                              -    :result :post :middleware
                                                              -    (->> (mapv :name)))
                                                              -; [::mw/coerce-exceptions
                                                              -;  ::mw/coerce-request
                                                              -;  ::mw/coerce-response]
                                                              -
                                                              -

                                                              Route without coercion defined:

                                                              -
                                                              (app {:request-method :get, :uri "/api/ping"})
                                                              -; {:status 200, :body "pong"}
                                                              -
                                                              -

                                                              Has no mounted middleware:

                                                              -
                                                              (-> (ring/get-router app)
                                                              -    (r/match-by-name ::ping)
                                                              -    :result :get :middleware
                                                              -    (->> (mapv :name)))
                                                              -; []
                                                              -
                                                              - - -
                                                              - -
                                                              -
                                                              -
                                                              - -

                                                              results matching ""

                                                              -
                                                                - -
                                                                -
                                                                - -

                                                                No results matching ""

                                                                - -
                                                                -
                                                                -
                                                                - -
                                                                -
                                                                - -
                                                                - - - - - - - - - - - - - - -
                                                                - - -
                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                Go to this page on cljdoc

                                                                diff --git a/ring/compiling_middleware.html b/ring/compiling_middleware.html index 8c4b8a9e..cdea617e 100644 --- a/ring/compiling_middleware.html +++ b/ring/compiling_middleware.html @@ -1,983 +1,9 @@ - - - - - - Compiling Middleware · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                -
                                                                - - - - - - - - -
                                                                - -
                                                                - -
                                                                - - - - - - - - -
                                                                -
                                                                - -
                                                                -
                                                                - -
                                                                - -

                                                                Compiling Middleware

                                                                -

                                                                The dynamic extensions is a easy way to extend the system. To enable fast lookups into route data, we can compile them into any shape (records, functions etc.) we want, enabling fast access at request-time.

                                                                -

                                                                But, we can do much better. As we know the exact route that middleware/interceptor is linked to, we can pass the (compiled) route information into the middleware at creation-time. It can do local reasoning: extract and transform relevant data just for it and pass the optimized data into the actual request-handler via a closure - yielding much faster runtime processing. Middleware can also decide not to mount itself by returning nil. Why mount a wrap-enforce-roles middleware for a route if there are no roles required for it?

                                                                -

                                                                To enable this we use middleware records :compile key instead of the normal :wrap. :compile expects a function of route-data router-opts => ?IntoMiddleware.

                                                                -

                                                                To demonstrate the two approaches, below are response coercion middleware written as normal ring middleware function and as middleware record with :compile.

                                                                -

                                                                Normal Middleware

                                                                -
                                                                  -
                                                                • Reads the compiled route information on every request. Everything is done at request-time.
                                                                • -
                                                                -
                                                                (defn wrap-coerce-response
                                                                -  "Middleware for pluggable response coercion.
                                                                -  Expects a :coercion of type `reitit.coercion/Coercion`
                                                                -  and :responses from route data, otherwise will do nothing."
                                                                -  [handler]
                                                                -  (fn
                                                                -    ([request]
                                                                -     (let [response (handler request)
                                                                -           method (:request-method request)
                                                                -           match (ring/get-match request)
                                                                -           responses (-> match :result method :data :responses)
                                                                -           coercion (-> match :data :coercion)
                                                                -           opts (-> match :data :opts)]
                                                                -       (if (and coercion responses)
                                                                -         (let [coercers (response-coercers coercion responses opts)]
                                                                -           (coerce-response coercers request response))
                                                                -         response)))
                                                                -    ([request respond raise]
                                                                -     (let [method (:request-method request)
                                                                -           match (ring/get-match request)
                                                                -           responses (-> match :result method :data :responses)
                                                                -           coercion (-> match :data :coercion)
                                                                -           opts (-> match :data :opts)]
                                                                -       (if (and coercion responses)
                                                                -         (let [coercers (response-coercers coercion responses opts)]
                                                                -           (handler request #(respond (coerce-response coercers request %))))
                                                                -         (handler request respond raise))))))
                                                                -
                                                                -

                                                                Compiled Middleware

                                                                -
                                                                  -
                                                                • Route information is provided at creation-time
                                                                • -
                                                                • Coercers are compiled at creation-time
                                                                • -
                                                                • Middleware mounts only if :coercion and :responses are defined for the route
                                                                • -
                                                                • Also defines spec for the route data :responses for the route data validation.
                                                                • -
                                                                -
                                                                (require '[reitit.spec :as rs])
                                                                -
                                                                -(def coerce-response-middleware
                                                                -  "Middleware for pluggable response coercion.
                                                                -  Expects a :coercion of type `reitit.coercion/Coercion`
                                                                -  and :responses from route data, otherwise does not mount."
                                                                -  {:name ::coerce-response
                                                                -   :spec ::rs/responses
                                                                -   :compile (fn [{:keys [coercion responses]} opts]
                                                                -              (if (and coercion responses)
                                                                -                (let [coercers (coercion/response-coercers coercion responses opts)]
                                                                -                  (fn [handler]
                                                                -                    (fn
                                                                -                      ([request]
                                                                -                       (coercion/coerce-response coercers request (handler request)))
                                                                -                      ([request respond raise]
                                                                -                       (handler request #(respond (coercion/coerce-response coercers request %)) raise)))))))})
                                                                -
                                                                -

                                                                It has 50% less code, it's much easier to reason about and is much faster.

                                                                -

                                                                Require Keys on Routes at Creation Time

                                                                -

                                                                Often it is useful to require a route to provide a specific key.

                                                                -
                                                                (require '[buddy.auth.accessrules :as accessrules])
                                                                -
                                                                -(s/def ::authorize
                                                                -  (s/or :handler :accessrules/handler :rule :accessrules/rule))
                                                                -
                                                                -(def authorization-middleware
                                                                -  {:name ::authorization
                                                                -   :spec (s/keys :req-un [::authorize])
                                                                -   :compile
                                                                -   (fn [route-data _opts]
                                                                -     (when-let [rule (:authorize route-data)]
                                                                -       (fn [handler]
                                                                -         (accessrules/wrap-access-rules handler {:rules [rule]}))))})
                                                                -
                                                                -

                                                                In the example above the :spec expresses that each route is required to provide the :authorize key. However, in this case the compile function returns nil when that key is missing, which means the middleware will not be mounted, the spec will not be considered, and the compiler will not enforce this requirement as intended.

                                                                -

                                                                If you just want to enforce the spec return a map without :wrap or :compile keys, e.g. an empty map, {}.

                                                                -
                                                                (def authorization-middleware
                                                                -  {:name ::authorization
                                                                -   :spec (s/keys :req-un [::authorize])
                                                                -   :compile
                                                                -   (fn [route-data _opts]
                                                                -     (if-let [rule (:authorize route-data)]
                                                                -       (fn [handler]
                                                                -         (accessrules/wrap-access-rules handler {:rules [rule]}))
                                                                -       ;; return empty map just to enforce spec
                                                                -       {}))})
                                                                -
                                                                -

                                                                The middleware (and associated spec) will still be part of the chain, but will not process the request.

                                                                - - -
                                                                - -
                                                                -
                                                                -
                                                                - -

                                                                results matching ""

                                                                -
                                                                  - -
                                                                  -
                                                                  - -

                                                                  No results matching ""

                                                                  - -
                                                                  -
                                                                  -
                                                                  - -
                                                                  -
                                                                  - -
                                                                  - - - - - - - - - - - - - - -
                                                                  - - -
                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                  Go to this page on cljdoc

                                                                  diff --git a/ring/content_negotiation.html b/ring/content_negotiation.html index 77e361c5..f06b75f8 100644 --- a/ring/content_negotiation.html +++ b/ring/content_negotiation.html @@ -1,1006 +1,9 @@ - - - - - - Content Negotiation · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                  -
                                                                  - - - - - - - - -
                                                                  - -
                                                                  - -
                                                                  - - - - - - - - -
                                                                  -
                                                                  - -
                                                                  -
                                                                  - -
                                                                  - -

                                                                  Content Negotiation

                                                                  -

                                                                  Wrapper for Muuntaja middleware for content-negotiation, request decoding and response encoding. Takes explicit configuration via :muuntaja key in route data. Emit's swagger :produces and :consumes definitions automatically based on the Muuntaja configuration.

                                                                  -

                                                                  Negotiates a request body based on Content-Type header and response body based on Accept, Accept-Charset headers. Publishes the negotiation results as :muuntaja/request and :muuntaja/response keys into the request.

                                                                  -

                                                                  Decodes the request body into :body-params using the :muuntaja/request key in request if the :body-params doesn't already exist.

                                                                  -

                                                                  Encodes the response body using the :muuntaja/response key in request if the response doesn't have Content-Type header already set.

                                                                  -

                                                                  Expected route data:

                                                                  - - - - - - - - - - - - - -
                                                                  keydescription
                                                                  :muuntajamuuntaja.core/Muuntaja instance, does not mount if not set.
                                                                  -
                                                                  (require '[reitit.ring.middleware.muuntaja :as muuntaja])
                                                                  -
                                                                  -
                                                                    -
                                                                  • muuntaja/format-middleware - Negotiation, request decoding and response encoding in a single Middleware
                                                                  • -
                                                                  • muuntaja/format-negotiate-middleware - Negotiation
                                                                  • -
                                                                  • muuntaja/format-request-middleware - Request decoding
                                                                  • -
                                                                  • muuntaja/format-response-middleware - Response encoding
                                                                  • -
                                                                  -
                                                                  (require '[reitit.ring :as ring])
                                                                  -(require '[reitit.ring.coercion :as rrc])
                                                                  -(require '[reitit.coercion.spec :as rcs])
                                                                  -(require '[ring.adapter.jetty :as jetty])
                                                                  -(require '[muuntaja.core :as m])
                                                                  -
                                                                  -(def app
                                                                  -  (ring/ring-handler
                                                                  -    (ring/router
                                                                  -      [["/math"
                                                                  -        {:post {:summary "negotiated request & response (json, edn, transit)"
                                                                  -                :parameters {:body {:x int?, :y int?}}
                                                                  -                :responses {200 {:body {:total int?}}}
                                                                  -                :handler (fn [{{{:keys [x y]} :body} :parameters}]
                                                                  -                           {:status 200
                                                                  -                            :body {:total (+ x y)}})}}]
                                                                  -       ["/xml"
                                                                  -        {:get {:summary "forced xml response"
                                                                  -               :handler (fn [_]
                                                                  -                          {:status 200
                                                                  -                           :headers {"Content-Type" "text/xml"}
                                                                  -                           :body "<kikka>kukka</kikka>"})}}]]
                                                                  -      {:data {:muuntaja m/instance
                                                                  -              :coercion rcs/coercion
                                                                  -              :middleware [muuntaja/format-middleware
                                                                  -                           rrc/coerce-exceptions-middleware
                                                                  -                           rrc/coerce-request-middleware
                                                                  -                           rrc/coerce-response-middleware]}})))
                                                                  -
                                                                  -(jetty/run-jetty #'app {:port 3000, :join? false})
                                                                  -
                                                                  -

                                                                  Testing with httpie:

                                                                  -
                                                                  > http POST :3000/math x:=1 y:=2
                                                                  -
                                                                  -HTTP/1.1 200 OK
                                                                  -Content-Length: 11
                                                                  -Content-Type: application/json; charset=utf-8
                                                                  -Date: Wed, 22 Aug 2018 16:59:54 GMT
                                                                  -Server: Jetty(9.2.21.v20170120)
                                                                  -
                                                                  -{
                                                                  - "total": 3
                                                                  -}
                                                                  -
                                                                  -
                                                                  > http :3000/xml
                                                                  -
                                                                  -HTTP/1.1 200 OK
                                                                  -Content-Length: 20
                                                                  -Content-Type: text/xml
                                                                  -Date: Wed, 22 Aug 2018 16:59:58 GMT
                                                                  -Server: Jetty(9.2.21.v20170120)
                                                                  -
                                                                  -<kikka>kukka</kikka>
                                                                  -
                                                                  -

                                                                  Changing default parameters

                                                                  -

                                                                  The current JSON formatter used by reitit already have the option to parse keys as keyword which is a sane default in Clojure. However, if you would like to parse all the double as bigdecimal you'd need to change an option of the JSON formatter

                                                                  -
                                                                  (def new-muuntaja-instance
                                                                  -  (m/create
                                                                  -   (assoc-in
                                                                  -    m/default-options
                                                                  -    [:formats "application/json" :decoder-opts :bigdecimals]
                                                                  -    true)))
                                                                  -
                                                                  -

                                                                  Now you should change the m/instance installed in the router with the new-muuntaja-instance.

                                                                  -

                                                                  You can find more options for JSON and [EDN].

                                                                  -

                                                                  Adding custom encoder

                                                                  -

                                                                  The example below is from muuntaja explaining how to add a custom encoder to parse a java.util.Date instance.

                                                                  -
                                                                  
                                                                  -(def muuntaja-instance
                                                                  -  (m/create
                                                                  -    (assoc-in
                                                                  -      m/default-options
                                                                  -      [:formats "application/json" :encoder-opts]
                                                                  -      {:date-format "yyyy-MM-dd"})))
                                                                  -
                                                                  -(->> {:value (java.util.Date.)}
                                                                  -     (m/encode m "application/json")
                                                                  -     slurp)
                                                                  -; => "{\"value\":\"2019-10-15\"}"
                                                                  -
                                                                  -

                                                                  Adding all together

                                                                  -

                                                                  If you inspect m/default-options it's only a map, therefore you can compose your new muuntaja instance with as many options as you need it.

                                                                  -
                                                                  (def new-muuntaja
                                                                  -  (m/create
                                                                  -   (-> m/default-options
                                                                  -       (assoc-in [:formats "application/json" :decoder-opts :bigdecimals] true)
                                                                  -       (assoc-in [:formats "application/json" :encoder-opts :data-format] "yyyy-MM-dd"))))
                                                                  -
                                                                  - - -
                                                                  - -
                                                                  -
                                                                  -
                                                                  - -

                                                                  results matching ""

                                                                  -
                                                                    - -
                                                                    -
                                                                    - -

                                                                    No results matching ""

                                                                    - -
                                                                    -
                                                                    -
                                                                    - -
                                                                    -
                                                                    - -
                                                                    - - - - - - - - - - - - - - -
                                                                    - - -
                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                    Go to this page on cljdoc

                                                                    diff --git a/ring/data_driven_middleware.html b/ring/data_driven_middleware.html index d5cec29f..c334b246 100644 --- a/ring/data_driven_middleware.html +++ b/ring/data_driven_middleware.html @@ -1,981 +1,9 @@ - - - - - - Data-driven Middleware · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                    -
                                                                    - - - - - - - - -
                                                                    - -
                                                                    - -
                                                                    - - - - - - - - -
                                                                    -
                                                                    - -
                                                                    -
                                                                    - -
                                                                    - -

                                                                    Data-driven Middleware

                                                                    -

                                                                    Ring defines middleware as a function of type handler & args => request => response. It's relatively easy to understand and enables good performance. Downside is that the middleware-chain is just a opaque function, making things like debugging and composition hard. It's too easy to apply the middleware in wrong order.

                                                                    -

                                                                    Reitit defines middleware as data:

                                                                    -
                                                                      -
                                                                    1. Middleware can be defined as first-class data entries
                                                                    2. -
                                                                    3. Middleware can be mounted as a duct-style vector (of middleware)
                                                                    4. -
                                                                    5. Middleware can be optimized & compiled against an endpoint
                                                                    6. -
                                                                    7. Middleware chain can be transformed by the router
                                                                    8. -
                                                                    -

                                                                    Middleware as data

                                                                    -

                                                                    All values in the :middleware vector in the route data are expanded into reitit.middleware/Middleware Records with using the reitit.middleware/IntoMiddleware Protocol. By default, functions, maps and Middleware records are allowed.

                                                                    -

                                                                    Records can have arbitrary keys, but the following keys have a special purpose:

                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                    keydescription
                                                                    :nameName of the middleware as a qualified keyword
                                                                    :specclojure.spec definition for the route data, see route data validation (optional)
                                                                    :wrapThe actual middleware function of handler & args => request => response
                                                                    :compileMiddleware compilation function, see compiling middleware.
                                                                    -

                                                                    Middleware Records are accessible in their raw form in the compiled route results, thus available for inventories, creating api-docs etc.

                                                                    -

                                                                    For the actual request processing, the Records are unwrapped into normal functions and composed into a middleware function chain, yielding zero runtime penalty.

                                                                    -

                                                                    Creating Middleware

                                                                    -

                                                                    The following produce identical middleware runtime function.

                                                                    -

                                                                    Function

                                                                    -
                                                                    (defn wrap [handler id]
                                                                    -  (fn [request]
                                                                    -    (handler (update request ::acc (fnil conj []) id))))
                                                                    -
                                                                    -

                                                                    Map

                                                                    -
                                                                    (def wrap3
                                                                    -  {:name ::wrap3
                                                                    -   :description "Middleware that does things."
                                                                    -   :wrap wrap})
                                                                    -
                                                                    -

                                                                    Record

                                                                    -
                                                                    (require '[reitit.middleware :as middleware])
                                                                    -
                                                                    -(def wrap2
                                                                    -  (middleware/map->Middleware
                                                                    -    {:name ::wrap2
                                                                    -     :description "Middleware that does things."
                                                                    -     :wrap wrap}))
                                                                    -
                                                                    -

                                                                    Using Middleware

                                                                    -

                                                                    :middleware is merged to endpoints by the router.

                                                                    -
                                                                    (require '[reitit.ring :as ring])
                                                                    -
                                                                    -(defn handler [{::keys [acc]}]
                                                                    -  {:status 200, :body (conj acc :handler)})
                                                                    -
                                                                    -(def app
                                                                    -  (ring/ring-handler
                                                                    -    (ring/router
                                                                    -      ["/api" {:middleware [[wrap 1] [wrap2 2]]}
                                                                    -       ["/ping" {:get {:middleware [[wrap3 3]]
                                                                    -                       :handler handler}}]])))
                                                                    -
                                                                    -

                                                                    All the middleware are applied correctly:

                                                                    -
                                                                    (app {:request-method :get, :uri "/api/ping"})
                                                                    -; {:status 200, :body [1 2 3 :handler]}
                                                                    -
                                                                    -

                                                                    Compiling middleware

                                                                    -

                                                                    Middleware can be optimized against an endpoint using middleware compilation.

                                                                    -

                                                                    Ideas for the future

                                                                    -
                                                                      -
                                                                    • Support Middleware dependency resolution with new keys :requires and :provides. Values are set of top-level keys of the request. e.g.
                                                                        -
                                                                      • InjectUserIntoRequestMiddleware requires #{:session} and provides #{:user}
                                                                      • -
                                                                      • AuthorizationMiddleware requires #{:user}
                                                                      • -
                                                                      -
                                                                    • -
                                                                    -

                                                                    Ideas welcome & see issues for details.

                                                                    - - -
                                                                    - -
                                                                    -
                                                                    -
                                                                    - -

                                                                    results matching ""

                                                                    -
                                                                      - -
                                                                      -
                                                                      - -

                                                                      No results matching ""

                                                                      - -
                                                                      -
                                                                      -
                                                                      - -
                                                                      -
                                                                      - -
                                                                      - - - - - - - - - - - - - - -
                                                                      - - -
                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                      Go to this page on cljdoc

                                                                      diff --git a/ring/default_handler.html b/ring/default_handler.html index a270955d..a45e0588 100644 --- a/ring/default_handler.html +++ b/ring/default_handler.html @@ -1,959 +1,9 @@ - - - - - - Default handler · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                      -
                                                                      - - - - - - - - -
                                                                      - -
                                                                      - -
                                                                      - - - - - - - - -
                                                                      -
                                                                      - -
                                                                      -
                                                                      - -
                                                                      - -

                                                                      Default handler

                                                                      -

                                                                      By default, if no routes match, nil is returned, which is not valid response in Ring:

                                                                      -
                                                                      (require '[reitit.ring :as ring])
                                                                      -
                                                                      -(defn handler [_]
                                                                      -  {:status 200, :body ""})
                                                                      -
                                                                      -(def app
                                                                      -  (ring/ring-handler
                                                                      -    (ring/router
                                                                      -      ["/ping" handler])))
                                                                      -
                                                                      -(app {:uri "/invalid"})
                                                                      -; nil
                                                                      -
                                                                      -

                                                                      Setting the default-handler as a second argument to ring-handler:

                                                                      -
                                                                      (def app
                                                                      -  (ring/ring-handler
                                                                      -    (ring/router
                                                                      -      ["/ping" handler])
                                                                      -    (constantly {:status 404, :body ""})))
                                                                      -
                                                                      -(app {:uri "/invalid"})
                                                                      -; {:status 404, :body ""}
                                                                      -
                                                                      -

                                                                      To get more correct http error responses, ring/create-default-handler can be used. It differentiates :not-found (no route matched), :method-not-allowed (no method matched) and :not-acceptable (handler returned nil).

                                                                      -

                                                                      With defaults:

                                                                      -
                                                                      (def app
                                                                      -  (ring/ring-handler
                                                                      -    (ring/router
                                                                      -      [["/ping" {:get handler}]
                                                                      -       ["/pong" (constantly nil)]])
                                                                      -    (ring/create-default-handler)))
                                                                      -
                                                                      -(app {:request-method :get, :uri "/ping"})
                                                                      -; {:status 200, :body ""}
                                                                      -
                                                                      -(app {:request-method :get, :uri "/"})
                                                                      -; {:status 404, :body ""}
                                                                      -
                                                                      -(app {:request-method :post, :uri "/ping"})
                                                                      -; {:status 405, :body ""}
                                                                      -
                                                                      -(app {:request-method :get, :uri "/pong"})
                                                                      -; {:status 406, :body ""}
                                                                      -
                                                                      -

                                                                      With custom responses:

                                                                      -
                                                                      (def app
                                                                      -  (ring/ring-handler
                                                                      -    (ring/router
                                                                      -      [["/ping" {:get handler}]
                                                                      -       ["/pong" (constantly nil)]])
                                                                      -    (ring/create-default-handler
                                                                      -      {:not-found (constantly {:status 404, :body "kosh"})
                                                                      -       :method-not-allowed (constantly {:status 405, :body "kosh"})
                                                                      -       :not-acceptable (constantly {:status 406, :body "kosh"})})))
                                                                      -
                                                                      -(app {:request-method :get, :uri "/ping"})
                                                                      -; {:status 200, :body ""}
                                                                      -
                                                                      -(app {:request-method :get, :uri "/"})
                                                                      -; {:status 404, :body "kosh"}
                                                                      -
                                                                      -(app {:request-method :post, :uri "/ping"})
                                                                      -; {:status 405, :body "kosh"}
                                                                      -
                                                                      -(app {:request-method :get, :uri "/pong"})
                                                                      -; {:status 406, :body "kosh"}
                                                                      -
                                                                      - - -
                                                                      - -
                                                                      -
                                                                      -
                                                                      - -

                                                                      results matching ""

                                                                      -
                                                                        - -
                                                                        -
                                                                        - -

                                                                        No results matching ""

                                                                        - -
                                                                        -
                                                                        -
                                                                        - -
                                                                        -
                                                                        - -
                                                                        - - - - - - - - - - - - - - -
                                                                        - - -
                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                        Go to this page on cljdoc

                                                                        diff --git a/ring/default_middleware.html b/ring/default_middleware.html index 043f90db..366ec1ca 100644 --- a/ring/default_middleware.html +++ b/ring/default_middleware.html @@ -1,940 +1,9 @@ - - - - - - Default Middleware · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                        -
                                                                        - - - - - - - - -
                                                                        - -
                                                                        - -
                                                                        - - - - - - - - -
                                                                        -
                                                                        - -
                                                                        -
                                                                        - -
                                                                        - -

                                                                        Default Middleware

                                                                        -
                                                                        [metosin/reitit-middleware "0.5.5"]
                                                                        -
                                                                        -

                                                                        Any Ring middleware can be used with reitit-ring, but using data-driven middleware is preferred as they are easier to manage and in many cases, yield better performance. reitit-middleware contains a set of common ring middleware, lifted into data-driven middleware.

                                                                        - -

                                                                        Parameters Handling

                                                                        -

                                                                        reitit.ring.middleware.parameters/parameters-middleware to capture query- and form-params. Wraps -ring.middleware.params/wrap-params.

                                                                        -

                                                                        NOTE: will be factored into two parts: a query-parameters middleware and a Muuntaja format responsible for the the application/x-www-form-urlencoded body format.

                                                                        -

                                                                        Exception Handling

                                                                        -

                                                                        See Exception Handling with Ring.

                                                                        -

                                                                        Content Negotiation

                                                                        -

                                                                        See Content Negotiation.

                                                                        -

                                                                        Multipart Request Handling

                                                                        -

                                                                        Wrapper for Ring Multipart Middleware. Emits swagger :consumes definitions automatically.

                                                                        -

                                                                        Expected route data:

                                                                        - - - - - - - - - - - - - -
                                                                        keydescription
                                                                        [:parameters :multipart]mounts only if defined for a route.
                                                                        -
                                                                        (require '[reitit.ring.middleware.multipart :as multipart])
                                                                        -
                                                                        -
                                                                          -
                                                                        • multipart/multipart-middleware a preconfigured middleware for multipart handling
                                                                        • -
                                                                        • multipart/create-multipart-middleware to generate with custom configuration
                                                                        • -
                                                                        -

                                                                        Inspecting Middleware Chain

                                                                        -

                                                                        reitit.ring.middleware.dev/print-request-diffs is a middleware chain transforming function. It prints a request and response diff between each middleware. To use it, add the following router option:

                                                                        -
                                                                        :reitit.middleware/transform reitit.ring.middleware.dev/print-request-diffs
                                                                        -
                                                                        -

                                                                        Partial sample output:

                                                                        -

                                                                        Opensensors perf test

                                                                        -

                                                                        Example app

                                                                        -

                                                                        See an example app with the default middleware in action: https://github.com/metosin/reitit/blob/master/examples/ring-swagger/src/example/server.clj.

                                                                        - - -
                                                                        - -
                                                                        -
                                                                        -
                                                                        - -

                                                                        results matching ""

                                                                        -
                                                                          - -
                                                                          -
                                                                          - -

                                                                          No results matching ""

                                                                          - -
                                                                          -
                                                                          -
                                                                          - -
                                                                          -
                                                                          - -
                                                                          - - - - - - - - - - - - - - -
                                                                          - - -
                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                          Go to this page on cljdoc

                                                                          diff --git a/ring/dynamic_extensions.html b/ring/dynamic_extensions.html index 6f703cd9..ae985c7d 100644 --- a/ring/dynamic_extensions.html +++ b/ring/dynamic_extensions.html @@ -1,928 +1,9 @@ - - - - - - Dynamic Extensions · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                          -
                                                                          - - - - - - - - -
                                                                          - -
                                                                          - -
                                                                          - - - - - - - - -
                                                                          -
                                                                          - -
                                                                          -
                                                                          - -
                                                                          - -

                                                                          Dynamic Extensions

                                                                          -

                                                                          ring-handler injects the Match into a request and it can be extracted at runtime with reitit.ring/get-match. This can be used to build ad-hoc extensions to the system.

                                                                          -

                                                                          Example middleware to guard routes based on user roles:

                                                                          -
                                                                          (require '[reitit.ring :as ring])
                                                                          -(require '[clojure.set :as set])
                                                                          -
                                                                          -(defn wrap-enforce-roles [handler]
                                                                          -  (fn [{:keys [my-roles] :as request}]
                                                                          -    (let [required (some-> request (ring/get-match) :data ::roles)]
                                                                          -      (if (and (seq required) (not (set/subset? required my-roles)))
                                                                          -        {:status 403, :body "forbidden"}
                                                                          -        (handler request)))))
                                                                          -
                                                                          -

                                                                          Mounted to an app via router data (affecting all routes):

                                                                          -
                                                                          (def handler (constantly {:status 200, :body "ok"}))
                                                                          -
                                                                          -(def app
                                                                          -  (ring/ring-handler
                                                                          -    (ring/router
                                                                          -      [["/api"
                                                                          -        ["/ping" handler]
                                                                          -        ["/admin" {::roles #{:admin}}
                                                                          -         ["/ping" handler]]]]
                                                                          -      {:data {:middleware [wrap-enforce-roles]}})))
                                                                          -
                                                                          -

                                                                          Anonymous access to public route:

                                                                          -
                                                                          (app {:request-method :get, :uri "/api/ping"})
                                                                          -; {:status 200, :body "ok"}
                                                                          -
                                                                          -

                                                                          Anonymous access to guarded route:

                                                                          -
                                                                          (app {:request-method :get, :uri "/api/admin/ping"})
                                                                          -; {:status 403, :body "forbidden"}
                                                                          -
                                                                          -

                                                                          Authorized access to guarded route:

                                                                          -
                                                                          (app {:request-method :get, :uri "/api/admin/ping", :my-roles #{:admin}})
                                                                          -; {:status 200, :body "ok"}
                                                                          -
                                                                          -

                                                                          Dynamic extensions are nice, but we can do much better. See data-driven middleware and compiling routes.

                                                                          - - -
                                                                          - -
                                                                          -
                                                                          -
                                                                          - -

                                                                          results matching ""

                                                                          -
                                                                            - -
                                                                            -
                                                                            - -

                                                                            No results matching ""

                                                                            - -
                                                                            -
                                                                            -
                                                                            - -
                                                                            -
                                                                            - -
                                                                            - - - - - - - - - - - - - - -
                                                                            - - -
                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                            Go to this page on cljdoc

                                                                            diff --git a/ring/exceptions.html b/ring/exceptions.html index 06eb3f2b..f4fa30bd 100644 --- a/ring/exceptions.html +++ b/ring/exceptions.html @@ -1,1007 +1,9 @@ - - - - - - Exception Handling with Ring · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                            -
                                                                            - - - - - - - - -
                                                                            - -
                                                                            - -
                                                                            - - - - - - - - -
                                                                            -
                                                                            - -
                                                                            -
                                                                            - -
                                                                            - -

                                                                            Exception Handling with Ring

                                                                            -
                                                                            [metosin/reitit-middleware "0.5.5"]
                                                                            -
                                                                            -

                                                                            Exceptions thrown in router creation can be handled with custom exception handler. By default, exceptions thrown at runtime from a handler or a middleware are not caught by the reitit.ring/ring-handler. A good practise is a have an top-level exception handler to log and format the errors for clients.

                                                                            -
                                                                            (require '[reitit.ring.middleware.exception :as exception])
                                                                            -
                                                                            -

                                                                            exception/exception-middleware

                                                                            -

                                                                            A preconfigured middleware using exception/default-handlers. Catches:

                                                                            -
                                                                              -
                                                                            • Request & response Coercion exceptions
                                                                            • -
                                                                            • Muuntaja decode exceptions
                                                                            • -
                                                                            • Exceptions with :type of :reitit.ring/response, returning :response key from ex-data.
                                                                            • -
                                                                            • Safely all other exceptions
                                                                            • -
                                                                            -
                                                                            (require '[reitit.ring :as ring])
                                                                            -
                                                                            -(def app
                                                                            -  (ring/ring-handler
                                                                            -    (ring/router
                                                                            -      ["/fail" (fn [_] (throw (Exception. "fail")))]
                                                                            -      {:data {:middleware [exception/exception-middleware]}})))
                                                                            -
                                                                            -(app {:request-method :get, :uri "/fail"})
                                                                            -;{:status 500
                                                                            -; :body {:type "exception"
                                                                            -;        :class "java.lang.Exception"}}
                                                                            -
                                                                            -

                                                                            exception/create-exception-middleware

                                                                            -

                                                                            Creates the exception-middleware with custom options. Takes a map of identifier => exception request => response that is used to select the exception handler for the thrown/raised exception identifier. Exception identifier is either a Keyword or a Exception Class.

                                                                            -

                                                                            The following handlers are available by default:

                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                            keydescription
                                                                            :reitit.ring/responsevalue in ex-data key :response will be returned
                                                                            :muuntaja/decodehandle Muuntaja decoding exceptions
                                                                            :reitit.coercion/request-coercionrequest coercion errors (http 400 response)
                                                                            :reitit.coercion/response-coercionresponse coercion errors (http 500 response)
                                                                            ::exception/defaulta default exception handler if nothing else matched (default exception/default-handler).
                                                                            ::exception/wrapa 3-arity handler to wrap the actual handler handler exception request => response (no default).
                                                                            -

                                                                            The handler is selected from the options map by exception identifier in the following lookup order:

                                                                            -

                                                                            1) :type of exception ex-data -2) Class of exception -3) :type ancestors of exception ex-data -4) Super Classes of exception -5) The ::default handler

                                                                            -
                                                                            ;; type hierarchy
                                                                            -(derive ::error ::exception)
                                                                            -(derive ::failure ::exception)
                                                                            -(derive ::horror ::exception)
                                                                            -
                                                                            -(defn handler [message exception request]
                                                                            -  {:status 500
                                                                            -   :body {:message message
                                                                            -          :exception (.getClass exception)
                                                                            -          :data (ex-data exception)
                                                                            -          :uri (:uri request)}})
                                                                            -
                                                                            -(def exception-middleware
                                                                            -  (exception/create-exception-middleware
                                                                            -    (merge
                                                                            -      exception/default-handlers
                                                                            -      {;; ex-data with :type ::error
                                                                            -       ::error (partial handler "error")
                                                                            -
                                                                            -       ;; ex-data with ::exception or ::failure
                                                                            -       ::exception (partial handler "exception")
                                                                            -
                                                                            -       ;; SQLException and all it's child classes
                                                                            -       java.sql.SQLException (partial handler "sql-exception")
                                                                            -
                                                                            -       ;; override the default handler
                                                                            -       ::exception/default (partial handler "default")
                                                                            -
                                                                            -       ;; print stack-traces for all exceptions
                                                                            -       ::exception/wrap (fn [handler e request]
                                                                            -                          (println "ERROR" (pr-str (:uri request)))
                                                                            -                          (handler e request))})))
                                                                            -
                                                                            -(def app
                                                                            -  (ring/ring-handler
                                                                            -    (ring/router
                                                                            -      ["/fail" (fn [_] (throw (ex-info "fail" {:type ::failue})))]
                                                                            -      {:data {:middleware [exception-middleware]}})))
                                                                            -
                                                                            -(app {:request-method :get, :uri "/fail"})
                                                                            -; ERROR "/fail"
                                                                            -; => {:status 500,
                                                                            -;     :body {:message "default"
                                                                            -;            :exception clojure.lang.ExceptionInfo
                                                                            -;            :data {:type :user/failue}
                                                                            -;            :uri "/fail"}}
                                                                            -
                                                                            - - -
                                                                            - -
                                                                            -
                                                                            -
                                                                            - -

                                                                            results matching ""

                                                                            -
                                                                              - -
                                                                              -
                                                                              - -

                                                                              No results matching ""

                                                                              - -
                                                                              -
                                                                              -
                                                                              - -
                                                                              -
                                                                              - -
                                                                              - - - - - - - - - - - - - - -
                                                                              - - -
                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                              Go to this page on cljdoc

                                                                              diff --git a/ring/middleware_registry.html b/ring/middleware_registry.html index 18403684..c8888e7e 100644 --- a/ring/middleware_registry.html +++ b/ring/middleware_registry.html @@ -1,939 +1,9 @@ - - - - - - Middleware Registry · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                              -
                                                                              - - - - - - - - -
                                                                              - -
                                                                              - -
                                                                              - - - - - - - - -
                                                                              -
                                                                              - -
                                                                              -
                                                                              - -
                                                                              - -

                                                                              Middleware Registry

                                                                              -

                                                                              The :middleware syntax in reitit-ring also supports Keywords. Keywords are looked up from the Middleware Registry, which is a map of keyword => IntoMiddleware. Middleware registry should be stored under key :reitit.middleware/registry in the router options. If a middleware keyword isn't found in the registry, router creation fails fast with a descriptive error message.

                                                                              -

                                                                              Examples

                                                                              -

                                                                              Application using middleware defined in the Middleware Registry:

                                                                              -
                                                                              (require '[reitit.ring :as ring])
                                                                              -(require '[reitit.middleware :as middleware])
                                                                              -
                                                                              -(defn wrap-bonus [handler value]
                                                                              -  (fn [request]
                                                                              -    (handler (update request :bonus (fnil + 0) value))))
                                                                              -
                                                                              -(def app
                                                                              -  (ring/ring-handler
                                                                              -    (ring/router
                                                                              -      ["/api" {:middleware [[:bonus 20]]}
                                                                              -       ["/bonus" {:middleware [:bonus10]
                                                                              -                 :get (fn [{:keys [bonus]}]
                                                                              -                        {:status 200, :body {:bonus bonus}})}]]
                                                                              -      {::middleware/registry {:bonus wrap-bonus
                                                                              -                              :bonus10 [:bonus 10]}})))
                                                                              -
                                                                              -

                                                                              Works as expected:

                                                                              -
                                                                              (app {:request-method :get, :uri "/api/bonus"})
                                                                              -; {:status 200, :body {:bonus 30}}
                                                                              -
                                                                              -

                                                                              Router creation fails fast if the registry doesn't contain the middleware:

                                                                              -
                                                                              (def app
                                                                              -  (ring/ring-handler
                                                                              -    (ring/router
                                                                              -      ["/api" {:middleware [[:bonus 20]]}
                                                                              -       ["/bonus" {:middleware [:bonus10]
                                                                              -                  :get (fn [{:keys [bonus]}]
                                                                              -                         {:status 200, :body {:bonus bonus}})}]]
                                                                              -      {::middleware/registry {:bonus wrap-bonus}})))
                                                                              -;CompilerException clojure.lang.ExceptionInfo: Middleware :bonus10 not found in registry.
                                                                              -;
                                                                              -;Available middleware in registry:
                                                                              -;
                                                                              -;|    :id |                         :description |
                                                                              -;|--------+--------------------------------------|
                                                                              -;| :bonus | reitit.ring_test$wrap_bonus@59fddabb |
                                                                              -
                                                                              -

                                                                              When to use the registry?

                                                                              -

                                                                              Middleware as Keywords helps to keep the routes (all but handlers) as literal data (i.e. data that evaluates to itself), enabling the routes to be persisted in external formats like EDN-files and databases. Duct is a good example, where the middleware can be referenced from EDN-files. It should be easy to make Duct configuration a Middleware Registry in reitit-ring.

                                                                              -

                                                                              On the other hand, it's an extra level of indirection, making things more complex and removing the default IDE support of "go to definition" or "look up source".

                                                                              -

                                                                              TODO

                                                                              -
                                                                                -
                                                                              • a prefilled registry of common middleware in the reitit-middleware
                                                                              • -
                                                                              - - -
                                                                              - -
                                                                              -
                                                                              -
                                                                              - -

                                                                              results matching ""

                                                                              -
                                                                                - -
                                                                                -
                                                                                - -

                                                                                No results matching ""

                                                                                - -
                                                                                -
                                                                                -
                                                                                - -
                                                                                -
                                                                                - -
                                                                                - - - - - - - - - - - - - - -
                                                                                - - -
                                                                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                                Go to this page on cljdoc

                                                                                diff --git a/ring/reverse_routing.html b/ring/reverse_routing.html index 598a5549..a11749cc 100644 --- a/ring/reverse_routing.html +++ b/ring/reverse_routing.html @@ -1,924 +1,9 @@ - - - - - - Reverse-routing · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                -
                                                                                - - - - - - - - -
                                                                                - -
                                                                                - -
                                                                                - - - - - - - - -
                                                                                -
                                                                                - -
                                                                                -
                                                                                - -
                                                                                - -

                                                                                Reverse routing with Ring

                                                                                -

                                                                                Both the router and the match are injected into Ring Request (as ::r/router and ::r/match) by the reitit.ring/ring-handler and with that, available to middleware and endpoints. To convert a Match into a path, one can use r/match->path, which optionally takes a map of query-parameters too.

                                                                                -

                                                                                Below is an example how to do reverse routing from a ring handler:

                                                                                -
                                                                                (require '[reitit.core :as r])
                                                                                -(require '[reitit.ring :as ring])
                                                                                -
                                                                                -(def app
                                                                                -  (ring/ring-handler
                                                                                -    (ring/router
                                                                                -      [["/users"
                                                                                -        {:get (fn [{::r/keys [router]}]
                                                                                -                {:status 200
                                                                                -                 :body (for [i (range 10)]
                                                                                -                         {:uri (-> router
                                                                                -                                   (r/match-by-name ::user {:id i})
                                                                                -                                   ;; with extra query-params
                                                                                -                                   (r/match->path {:iso "möly"}))})})}]
                                                                                -       ["/users/:id"
                                                                                -        {:name ::user
                                                                                -         :get (constantly {:status 200, :body "user..."})}]])))
                                                                                -
                                                                                -(app {:request-method :get, :uri "/users"})
                                                                                -; {:status 200,
                                                                                -;  :body ({:uri "/users/0?iso=m%C3%B6ly"}
                                                                                -;         {:uri "/users/1?iso=m%C3%B6ly"}
                                                                                -;         {:uri "/users/2?iso=m%C3%B6ly"}
                                                                                -;         {:uri "/users/3?iso=m%C3%B6ly"}
                                                                                -;         {:uri "/users/4?iso=m%C3%B6ly"}
                                                                                -;         {:uri "/users/5?iso=m%C3%B6ly"}
                                                                                -;         {:uri "/users/6?iso=m%C3%B6ly"}
                                                                                -;         {:uri "/users/7?iso=m%C3%B6ly"}
                                                                                -;         {:uri "/users/8?iso=m%C3%B6ly"}
                                                                                -;         {:uri "/users/9?iso=m%C3%B6ly"})}
                                                                                -
                                                                                - - -
                                                                                - -
                                                                                -
                                                                                -
                                                                                - -

                                                                                results matching ""

                                                                                -
                                                                                  - -
                                                                                  -
                                                                                  - -

                                                                                  No results matching ""

                                                                                  - -
                                                                                  -
                                                                                  -
                                                                                  - -
                                                                                  -
                                                                                  - -
                                                                                  - - - - - - - - - - - - - - -
                                                                                  - - -
                                                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                                  Go to this page on cljdoc

                                                                                  diff --git a/ring/ring.html b/ring/ring.html index b4b363c4..2f97d934 100644 --- a/ring/ring.html +++ b/ring/ring.html @@ -1,1068 +1,9 @@ - - - - - - Ring-router · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                  -
                                                                                  - - - - - - - - -
                                                                                  - -
                                                                                  - -
                                                                                  - - - - - - - - -
                                                                                  -
                                                                                  - -
                                                                                  -
                                                                                  - -
                                                                                  - -

                                                                                  Ring Router

                                                                                  -

                                                                                  Ring is a Clojure web applications library inspired by Python's WSGI and Ruby's Rack. By abstracting the details of HTTP into a simple, unified API, Ring allows web applications to be constructed of modular components that can be shared among a variety of applications, web servers, and web frameworks.

                                                                                  -

                                                                                  Read more about the Ring Concepts.

                                                                                  -
                                                                                  [metosin/reitit-ring "0.5.5"]
                                                                                  -
                                                                                  -

                                                                                  reitit.ring/ring-router

                                                                                  -

                                                                                  ring-router is a higher order router, which adds support for :request-method based routing, handlers and middleware.

                                                                                  -

                                                                                  It accepts the following options:

                                                                                  - - - - - - - - - - - - - - - - - - - - - -
                                                                                  keydescription
                                                                                  :reitit.middleware/transformFunction of [Middleware] => [Middleware] to transform the expanded Middleware (default: identity).
                                                                                  :reitit.middleware/registryMap of keyword => IntoMiddleware to replace keyword references into Middleware
                                                                                  :reitit.ring/default-options-endpointDefault endpoint for :options method (default: default-options-endpoint)
                                                                                  -

                                                                                  Example router:

                                                                                  -
                                                                                  (require '[reitit.ring :as ring])
                                                                                  -
                                                                                  -(defn handler [_]
                                                                                  -  {:status 200, :body "ok"})
                                                                                  -
                                                                                  -(def router
                                                                                  -  (ring/router
                                                                                  -    ["/ping" {:get handler}]))
                                                                                  -
                                                                                  -

                                                                                  Match contains :result compiled by the ring-router:

                                                                                  -
                                                                                  (require '[reitit.core :as r])
                                                                                  -
                                                                                  -(r/match-by-path router "/ping")
                                                                                  -;#Match{:template "/ping"
                                                                                  -;       :data {:get {:handler #object[...]}}
                                                                                  -;       :result #Methods{:get #Endpoint{...}
                                                                                  -;                        :options #Endpoint{...}}
                                                                                  -;       :path-params {}
                                                                                  -;       :path "/ping"}
                                                                                  -
                                                                                  -

                                                                                  reitit.ring/ring-handler

                                                                                  -

                                                                                  Given a ring-router, optional default-handler & options, ring-handler function will return a valid ring handler supporting both synchronous and asynchronous request handling. The following options are available:

                                                                                  - - - - - - - - - - - - - - - - - - - - - -
                                                                                  keydescription
                                                                                  :middlewareOptional sequence of middleware that wrap the ring-handler"
                                                                                  :inject-match?Boolean to inject match into request under :reitit.core/match key (default true)
                                                                                  :inject-router?Boolean to inject router into request under :reitit.core/router key (default true)
                                                                                  -

                                                                                  Simple Ring app:

                                                                                  -
                                                                                  (def app (ring/ring-handler router))
                                                                                  -
                                                                                  -

                                                                                  Applying the handler:

                                                                                  -
                                                                                  (app {:request-method :get, :uri "/favicon.ico"})
                                                                                  -; nil
                                                                                  -
                                                                                  -
                                                                                  (app {:request-method :get, :uri "/ping"})
                                                                                  -; {:status 200, :body "ok"}
                                                                                  -
                                                                                  -

                                                                                  The router can be accessed via get-router:

                                                                                  -
                                                                                  (-> app (ring/get-router) (r/compiled-routes))
                                                                                  -;[["/ping"
                                                                                  -;  {:handler #object[...]}
                                                                                  -;  #Methods{:get #Endpoint{:data {:handler #object[...]}
                                                                                  -;                          :handler #object[...]
                                                                                  -;                          :middleware []}
                                                                                  -;           :options #Endpoint{:data {:handler #object[...]}
                                                                                  -;                              :handler #object[...]
                                                                                  -;                              :middleware []}}]]
                                                                                  -
                                                                                  -

                                                                                  Request-method based routing

                                                                                  -

                                                                                  Handlers can be placed either to the top-level (all methods) or under a specific method (:get, :head, :patch, :delete, :options, :post, :put or :trace). Top-level handler is used if request-method based handler is not found.

                                                                                  -

                                                                                  By default, the :options route is generated for all paths - to enable thing like CORS.

                                                                                  -
                                                                                  (def app
                                                                                  -  (ring/ring-handler
                                                                                  -    (ring/router
                                                                                  -      [["/all" handler]
                                                                                  -       ["/ping" {:name ::ping
                                                                                  -                 :get handler
                                                                                  -                 :post handler}]])))
                                                                                  -
                                                                                  -

                                                                                  Top-level handler catches all methods:

                                                                                  -
                                                                                  (app {:request-method :delete, :uri "/all"})
                                                                                  -; {:status 200, :body "ok"}
                                                                                  -
                                                                                  -

                                                                                  Method-level handler catches only the method:

                                                                                  -
                                                                                  (app {:request-method :get, :uri "/ping"})
                                                                                  -; {:status 200, :body "ok"}
                                                                                  -
                                                                                  -(app {:request-method :put, :uri "/ping"})
                                                                                  -; nil
                                                                                  -
                                                                                  -

                                                                                  By default, :options is also supported (see router options to change this):

                                                                                  -
                                                                                  (app {:request-method :options, :uri "/ping"})
                                                                                  -; {:status 200, :body ""}
                                                                                  -
                                                                                  -

                                                                                  Name-based reverse routing:

                                                                                  -
                                                                                  (-> app
                                                                                  -    (ring/get-router)
                                                                                  -    (r/match-by-name ::ping)
                                                                                  -    (r/match->path))
                                                                                  -; "/ping"
                                                                                  -
                                                                                  -

                                                                                  Middleware

                                                                                  -

                                                                                  Middleware can be mounted using a :middleware key - either to top-level or under request method submap. Its value should be a vector of reitit.middleware/IntoMiddleware values. These include:

                                                                                  -
                                                                                    -
                                                                                  1. normal ring middleware function handler -> request -> response
                                                                                  2. -
                                                                                  3. vector of middleware function [handler args*] -> request -> response and it's arguments
                                                                                  4. -
                                                                                  5. a data-driven middleware record or a map
                                                                                  6. -
                                                                                  7. a Keyword name, to lookup the middleware from a Middleware Registry
                                                                                  8. -
                                                                                  -

                                                                                  A middleware and a handler:

                                                                                  -
                                                                                  (defn wrap [handler id]
                                                                                  -  (fn [request]
                                                                                  -    (handler (update request ::acc (fnil conj []) id))))
                                                                                  -
                                                                                  -(defn handler [{::keys [acc]}]
                                                                                  -  {:status 200, :body (conj acc :handler)})
                                                                                  -
                                                                                  -

                                                                                  App with nested middleware:

                                                                                  -
                                                                                  (def app
                                                                                  -  (ring/ring-handler
                                                                                  -    (ring/router
                                                                                  -      ;; a middleware function
                                                                                  -      ["/api" {:middleware [#(wrap % :api)]}
                                                                                  -       ["/ping" handler]
                                                                                  -       ;; a middleware vector at top level
                                                                                  -       ["/admin" {:middleware [[wrap :admin]]}
                                                                                  -        ["/db" {:middleware [[wrap :db]]
                                                                                  -                ;; a middleware vector at under a method
                                                                                  -                :delete {:middleware [[wrap :delete]]
                                                                                  -                         :handler handler}}]]])))
                                                                                  -
                                                                                  -

                                                                                  Middleware is applied correctly:

                                                                                  -
                                                                                  (app {:request-method :delete, :uri "/api/ping"})
                                                                                  -; {:status 200, :body [:api :handler]}
                                                                                  -
                                                                                  -
                                                                                  (app {:request-method :delete, :uri "/api/admin/db"})
                                                                                  -; {:status 200, :body [:api :admin :db :delete :handler]}
                                                                                  -
                                                                                  -

                                                                                  Top-level middleware, applied before any routing is done:

                                                                                  -
                                                                                  (def app
                                                                                  -  (ring/ring-handler
                                                                                  -    (ring/router
                                                                                  -      ["/api" {:middleware [[mw :api]]}
                                                                                  -       ["/get" {:get handler}]])
                                                                                  -    nil 
                                                                                  -    {:middleware [[mw :top]]}))
                                                                                  -
                                                                                  -(app {:request-method :get, :uri "/api/get"})
                                                                                  -; {:status 200, :body [:top :api :ok]}
                                                                                  -
                                                                                  - - -
                                                                                  - -
                                                                                  -
                                                                                  -
                                                                                  - -

                                                                                  results matching ""

                                                                                  -
                                                                                    - -
                                                                                    -
                                                                                    - -

                                                                                    No results matching ""

                                                                                    - -
                                                                                    -
                                                                                    -
                                                                                    - -
                                                                                    -
                                                                                    - -
                                                                                    - - - - - - - - - - - - - - -
                                                                                    - - -
                                                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                                    Go to this page on cljdoc

                                                                                    diff --git a/ring/route_data_validation.html b/ring/route_data_validation.html index a7799bb1..eeface9e 100644 --- a/ring/route_data_validation.html +++ b/ring/route_data_validation.html @@ -1,1136 +1,9 @@ - - - - - - Route Data Validation · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                    -
                                                                                    - - - - - - - - -
                                                                                    - -
                                                                                    - -
                                                                                    - - - - - - - - -
                                                                                    -
                                                                                    - -
                                                                                    -
                                                                                    - -
                                                                                    - -

                                                                                    Route Data Validation

                                                                                    -

                                                                                    Ring route validation works just like with core router, with few differences:

                                                                                    -
                                                                                      -
                                                                                    • reitit.ring.spec/validate should be used instead of reitit.spec/validate - to support validating all endpoints (:get, :post etc.)
                                                                                    • -
                                                                                    • With clojure.spec validation, Middleware can contribute to route spec via :specs key. The effective route data spec is router spec merged with middleware specs.
                                                                                    • -
                                                                                    -

                                                                                    Example

                                                                                    -

                                                                                    A simple app with spec-validation turned on:

                                                                                    -
                                                                                    (require '[clojure.spec.alpha :as s])
                                                                                    -(require '[reitit.ring :as ring])
                                                                                    -(require '[reitit.ring.spec :as rrs])
                                                                                    -(require '[reitit.spec :as rs])
                                                                                    -(require '[expound.alpha :as e])
                                                                                    -
                                                                                    -(defn handler [_]
                                                                                    -  {:status 200, :body "ok"})
                                                                                    -
                                                                                    -(def app
                                                                                    -  (ring/ring-handler
                                                                                    -    (ring/router
                                                                                    -      ["/api"
                                                                                    -       ["/public"
                                                                                    -        ["/ping" {:get handler}]]
                                                                                    -       ["/internal"
                                                                                    -        ["/users" {:get {:handler handler}
                                                                                    -                   :delete {:handler handler}}]]]
                                                                                    -      {:validate rrs/validate
                                                                                    -       ::rs/explain e/expound-str})))
                                                                                    -
                                                                                    -

                                                                                    All good:

                                                                                    -
                                                                                    (app {:request-method :get
                                                                                    -      :uri "/api/internal/users"})
                                                                                    -; {:status 200, :body "ok"}
                                                                                    -
                                                                                    -

                                                                                    Explicit specs via middleware

                                                                                    -

                                                                                    Middleware that requires :zone to be present in route data:

                                                                                    -
                                                                                    (s/def ::zone #{:public :internal})
                                                                                    -
                                                                                    -(def zone-middleware
                                                                                    -  {:name ::zone-middleware
                                                                                    -   :spec (s/keys :req-un [::zone])
                                                                                    -   :wrap (fn [handler]
                                                                                    -           (fn [request]
                                                                                    -             (let [zone (-> request (ring/get-match) :data :zone)]
                                                                                    -               (println zone)
                                                                                    -               (handler request))))})
                                                                                    -
                                                                                    -

                                                                                    Missing route data fails fast at router creation:

                                                                                    -
                                                                                    (def app
                                                                                    -  (ring/ring-handler
                                                                                    -    (ring/router
                                                                                    -      ["/api" {:middleware [zone-middleware]} ;; <--- added
                                                                                    -       ["/public"
                                                                                    -        ["/ping" {:get handler}]]
                                                                                    -       ["/internal"
                                                                                    -        ["/users" {:get {:handler handler}
                                                                                    -                   :delete {:handler handler}}]]]
                                                                                    -      {:validate rrs/validate
                                                                                    -       ::rs/explain e/expound-str})))
                                                                                    -; CompilerException clojure.lang.ExceptionInfo: Invalid route data:
                                                                                    -;
                                                                                    -; -- On route -----------------------
                                                                                    -;
                                                                                    -; "/api/public/ping" :get
                                                                                    -;
                                                                                    -; -- Spec failed --------------------
                                                                                    -;
                                                                                    -; {:middleware ...,
                                                                                    -;  :handler ...}
                                                                                    -;
                                                                                    -; should contain key: `:zone`
                                                                                    -;
                                                                                    -; |   key |  spec |
                                                                                    -; |-------+-------|
                                                                                    -; | :zone | :zone |
                                                                                    -;
                                                                                    -;
                                                                                    -; -- On route -----------------------
                                                                                    -;
                                                                                    -; "/api/internal/users" :get
                                                                                    -;
                                                                                    -; -- Spec failed --------------------
                                                                                    -;
                                                                                    -; {:middleware ...,
                                                                                    -;  :handler ...}
                                                                                    -;
                                                                                    -; should contain key: `:zone`
                                                                                    -;
                                                                                    -; |   key |  spec |
                                                                                    -; |-------+-------|
                                                                                    -; | :zone | :zone |
                                                                                    -;
                                                                                    -;
                                                                                    -; -- On route -----------------------
                                                                                    -;
                                                                                    -; "/api/internal/users" :delete
                                                                                    -;
                                                                                    -; -- Spec failed --------------------
                                                                                    -;
                                                                                    -; {:middleware ...,
                                                                                    -;  :handler ...}
                                                                                    -;
                                                                                    -; should contain key: `:zone`
                                                                                    -;
                                                                                    -; |   key |  spec |
                                                                                    -; |-------+-------|
                                                                                    -; | :zone | :zone |
                                                                                    -
                                                                                    -

                                                                                    Adding the :zone to route data fixes the problem:

                                                                                    -
                                                                                    (def app
                                                                                    -  (ring/ring-handler
                                                                                    -    (ring/router
                                                                                    -      ["/api" {:middleware [zone-middleware]}
                                                                                    -       ["/public" {:zone :public} ;; <--- added
                                                                                    -        ["/ping" {:get handler}]]
                                                                                    -       ["/internal" {:zone :internal} ;; <--- added
                                                                                    -        ["/users" {:get {:handler handler}
                                                                                    -                   :delete {:handler handler}}]]]
                                                                                    -      {:validate rrs/validate
                                                                                    -       ::rs/explain e/expound-str})))
                                                                                    -
                                                                                    -(app {:request-method :get
                                                                                    -      :uri "/api/internal/users"})
                                                                                    -; in zone :internal
                                                                                    -; => {:status 200, :body "ok"}
                                                                                    -
                                                                                    -

                                                                                    Implicit specs

                                                                                    -

                                                                                    By design, clojure.spec validates all fully-qualified keys with s/keys specs even if they are not defined in that keyset. Validation is implicit but powerful.

                                                                                    -

                                                                                    Let's reuse the wrap-enforce-roles from Dynamic extensions and define specs for the data:

                                                                                    -
                                                                                    (require '[clojure.set :as set])
                                                                                    -
                                                                                    -(s/def ::role #{:admin :manager})
                                                                                    -(s/def ::roles (s/coll-of ::role :into #{}))
                                                                                    -
                                                                                    -(defn wrap-enforce-roles [handler]
                                                                                    -  (fn [{::keys [roles] :as request}]
                                                                                    -    (let [required (some-> request (ring/get-match) :data ::roles)]
                                                                                    -      (if (and (seq required) (not (set/subset? required roles)))
                                                                                    -        {:status 403, :body "forbidden"}
                                                                                    -        (handler request)))))
                                                                                    -
                                                                                    -

                                                                                    wrap-enforce-roles silently ignores if the ::roles is not present:

                                                                                    -
                                                                                    (def app
                                                                                    -  (ring/ring-handler
                                                                                    -    (ring/router
                                                                                    -      ["/api" {:middleware [zone-middleware
                                                                                    -                            wrap-enforce-roles]} ;; <--- added
                                                                                    -       ["/public" {:zone :public}
                                                                                    -        ["/ping" {:get handler}]]
                                                                                    -       ["/internal" {:zone :internal}
                                                                                    -        ["/users" {:get {:handler handler}
                                                                                    -                   :delete {:handler handler}}]]]
                                                                                    -      {:validate rrs/validate
                                                                                    -       ::rs/explain e/expound-str})))
                                                                                    -
                                                                                    -(app {:request-method :get
                                                                                    -      :uri "/api/zones/admin/ping"})
                                                                                    -; in zone :internal
                                                                                    -; => {:status 200, :body "ok"}
                                                                                    -
                                                                                    -

                                                                                    But fails if they are present and invalid:

                                                                                    -
                                                                                    (def app
                                                                                    -  (ring/ring-handler
                                                                                    -    (ring/router
                                                                                    -      ["/api" {:middleware [zone-middleware
                                                                                    -                            wrap-enforce-roles]}
                                                                                    -       ["/public" {:zone :public}
                                                                                    -        ["/ping" {:get handler}]]
                                                                                    -       ["/internal" {:zone :internal}
                                                                                    -        ["/users" {:get {:handler handler
                                                                                    -                         ::roles #{:manager} ;; <--- added
                                                                                    -                   :delete {:handler handler
                                                                                    -                            ::roles #{:adminz}}}]]] ;; <--- added
                                                                                    -      {:validate rrs/validate
                                                                                    -       ::rs/explain e/expound-str})))
                                                                                    -; CompilerException clojure.lang.ExceptionInfo: Invalid route data:
                                                                                    -;
                                                                                    -; -- On route -----------------------
                                                                                    -;
                                                                                    -; "/api/internal/users" :delete
                                                                                    -;
                                                                                    -; -- Spec failed --------------------
                                                                                    -;
                                                                                    -; {:middleware ...,
                                                                                    -;  :zone ...,
                                                                                    -;  :handler ...,
                                                                                    -;  :user/roles #{:adminz}}
                                                                                    -;                ^^^^^^^
                                                                                    -;
                                                                                    -; should be one of: `:admin`,`:manager`
                                                                                    -
                                                                                    -

                                                                                    Pushing the data to the endpoints

                                                                                    -

                                                                                    Ability to define (and reuse) route-data in mid-paths is a powerful feature, but having data defined all around might be harder to reason about. There is always an option to define all data at the endpoints.

                                                                                    -
                                                                                    (def app
                                                                                    -  (ring/ring-handler
                                                                                    -    (ring/router
                                                                                    -      ["/api"
                                                                                    -       ["/public"
                                                                                    -        ["/ping" {:zone :public
                                                                                    -                  :get handler
                                                                                    -                  :middleware [zone-middleware
                                                                                    -                               wrap-enforce-roles]}]]
                                                                                    -       ["/internal"
                                                                                    -        ["/users" {:zone :internal
                                                                                    -                   :middleware [zone-middleware
                                                                                    -                                wrap-enforce-roles]
                                                                                    -                   :get {:handler handler
                                                                                    -                         ::roles #{:manager}}
                                                                                    -                   :delete {:handler handler
                                                                                    -                            ::roles #{:admin}}}]]]
                                                                                    -      {:validate rrs/validate
                                                                                    -       ::rs/explain e/expound-str})))
                                                                                    -
                                                                                    -

                                                                                    Or even flatten the routes:

                                                                                    -
                                                                                    (def app
                                                                                    -  (ring/ring-handler
                                                                                    -    (ring/router
                                                                                    -      [["/api/public/ping" {:zone :public
                                                                                    -                            :get handler
                                                                                    -                            :middleware [zone-middleware
                                                                                    -                                         wrap-enforce-roles]}]
                                                                                    -       ["/api/internal/users" {:zone :internal
                                                                                    -                               :middleware [zone-middleware
                                                                                    -                                            wrap-enforce-roles]
                                                                                    -                               :get {:handler handler
                                                                                    -                                     ::roles #{:manager}}
                                                                                    -                               :delete {:handler handler
                                                                                    -                                        ::roles #{:admin}}}]]
                                                                                    -      {:validate rrs/validate
                                                                                    -       ::rs/explain e/expound-str})))
                                                                                    -
                                                                                    -

                                                                                    The common Middleware can also be pushed to the router, here cleanly separating behavior and data:

                                                                                    -
                                                                                    (def app
                                                                                    -  (ring/ring-handler
                                                                                    -    (ring/router
                                                                                    -      [["/api/public/ping" {:zone :public
                                                                                    -                            :get handler}]
                                                                                    -       ["/api/internal/users" {:zone :internal
                                                                                    -                               :get {:handler handler
                                                                                    -                                     ::roles #{:manager}}
                                                                                    -                               :delete {:handler handler
                                                                                    -                                        ::roles #{:admin}}}]]
                                                                                    -      {:data {:middleware [zone-middleware wrap-enforce-roles]}
                                                                                    -       :validate rrs/validate
                                                                                    -       ::rs/explain e/expound-str})))
                                                                                    -
                                                                                    - - -
                                                                                    - -
                                                                                    -
                                                                                    -
                                                                                    - -

                                                                                    results matching ""

                                                                                    -
                                                                                      - -
                                                                                      -
                                                                                      - -

                                                                                      No results matching ""

                                                                                      - -
                                                                                      -
                                                                                      -
                                                                                      - -
                                                                                      -
                                                                                      - -
                                                                                      - - - - - - - - - - - - - - -
                                                                                      - - -
                                                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                                      Go to this page on cljdoc

                                                                                      diff --git a/ring/slash_handler.html b/ring/slash_handler.html index 0fe6fdd0..02f3e224 100644 --- a/ring/slash_handler.html +++ b/ring/slash_handler.html @@ -1,962 +1,9 @@ - - - - - - Slash handler · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                      -
                                                                                      - - - - - - - - -
                                                                                      - -
                                                                                      - -
                                                                                      - - - - - - - - -
                                                                                      -
                                                                                      - -
                                                                                      -
                                                                                      - -
                                                                                      - -

                                                                                      Slash handler

                                                                                      -

                                                                                      The router works with precise matches. If a route is defined without a trailing slash, for example, it won't match a request with a slash.

                                                                                      -
                                                                                      (require '[reitit.ring :as ring])
                                                                                      -
                                                                                      -(def app
                                                                                      -  (ring/ring-handler
                                                                                      -    (ring/router
                                                                                      -      ["/ping" (constantly {:status 200, :body ""})])))
                                                                                      -
                                                                                      -(app {:uri "/ping/"})
                                                                                      -; nil
                                                                                      -
                                                                                      -

                                                                                      Sometimes it is desirable that paths with and without a trailing slash are recognized as the same.

                                                                                      -

                                                                                      Setting the redirect-trailing-slash-handler as a second argument to ring-handler:

                                                                                      -
                                                                                      (def app
                                                                                      -  (ring/ring-handler
                                                                                      -    (ring/router
                                                                                      -      [["/ping" (constantly {:status 200, :body ""})]
                                                                                      -       ["/pong/" (constantly {:status 200, :body ""})]])
                                                                                      -    (ring/redirect-trailing-slash-handler)))
                                                                                      -
                                                                                      -(app {:uri "/ping/"})
                                                                                      -; {:status 308, :headers {"Location" "/ping"}, :body ""}
                                                                                      -
                                                                                      -(app {:uri "/pong"})
                                                                                      -; {:status 308, :headers {"Location" "/pong/"}, :body ""}
                                                                                      -
                                                                                      -

                                                                                      redirect-trailing-slash-handler accepts an optional :method parameter that allows configuring how (whether) to handle missing/extra slashes. The default is to handle both.

                                                                                      -
                                                                                      (def app
                                                                                      -  (ring/ring-handler
                                                                                      -    (ring/router
                                                                                      -      [["/ping" (constantly {:status 200, :body ""})]
                                                                                      -       ["/pong/" (constantly {:status 200, :body ""})]])
                                                                                      -    ; only handle extra trailing slash
                                                                                      -    (ring/redirect-trailing-slash-handler {:method :strip})))
                                                                                      -
                                                                                      -(app {:uri "/ping/"})
                                                                                      -; {:status 308, :headers {"Location" "/ping"}, :body ""}
                                                                                      -
                                                                                      -(app {:uri "/pong"})
                                                                                      -; nil
                                                                                      -
                                                                                      -
                                                                                      (def app
                                                                                      -  (ring/ring-handler
                                                                                      -    (ring/router
                                                                                      -      [["/ping" (constantly {:status 200, :body ""})]
                                                                                      -       ["/pong/" (constantly {:status 200, :body ""})]])
                                                                                      -    ; only handle missing trailing slash
                                                                                      -    (ring/redirect-trailing-slash-handler {:method :add})))
                                                                                      -
                                                                                      -(app {:uri "/ping/"})
                                                                                      -; nil
                                                                                      -
                                                                                      -(app {:uri "/pong"})
                                                                                      -; {:status 308, :headers {"Location" "/pong/"}, :body ""}
                                                                                      -
                                                                                      -

                                                                                      redirect-trailing-slash-handler can be composed with the default handler using ring/routes for more correct http error responses:

                                                                                      -
                                                                                      (def app
                                                                                      -  (ring/ring-handler
                                                                                      -    (ring/router
                                                                                      -      [["/ping" (constantly {:status 200, :body ""})]
                                                                                      -       ["/pong/" (constantly {:status 200, :body ""})]])
                                                                                      -    (ring/routes
                                                                                      -      (ring/redirect-trailing-slash-handler {:method :add})
                                                                                      -      (ring/create-default-handler))))
                                                                                      -
                                                                                      -(app {:uri "/ping/"})
                                                                                      -; {:status 404, :body "", :headers {}}
                                                                                      -
                                                                                      -(app {:uri "/pong"})
                                                                                      -; {:status 308, :headers {"Location" "/pong/"}, :body ""}
                                                                                      -
                                                                                      - - -
                                                                                      - -
                                                                                      -
                                                                                      -
                                                                                      - -

                                                                                      results matching ""

                                                                                      -
                                                                                        - -
                                                                                        -
                                                                                        - -

                                                                                        No results matching ""

                                                                                        - -
                                                                                        -
                                                                                        -
                                                                                        - -
                                                                                        -
                                                                                        - -
                                                                                        - - - - - - - - - - - - - - -
                                                                                        - - -
                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                                        Go to this page on cljdoc

                                                                                        diff --git a/ring/static.html b/ring/static.html index 49414fbb..92139f99 100644 --- a/ring/static.html +++ b/ring/static.html @@ -1,964 +1,9 @@ - - - - - - Static Resources · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                        -
                                                                                        - - - - - - - - -
                                                                                        - -
                                                                                        - -
                                                                                        - - - - - - - - -
                                                                                        -
                                                                                        - -
                                                                                        -
                                                                                        - -
                                                                                        - -

                                                                                        Static Resources (Clojure Only)

                                                                                        -

                                                                                        Static resources can be served using reitit.ring/create-resource-handler. It takes optionally an options map and returns a ring handler to serve files from Classpath.

                                                                                        -

                                                                                        There are two options to serve the files.

                                                                                        -

                                                                                        Internal routes

                                                                                        -

                                                                                        This is good option if static files can be from non-conflicting paths, e.g. "/assets/*".

                                                                                        -
                                                                                        (require '[reitit.ring :as ring])
                                                                                        -
                                                                                        -(ring/ring-handler
                                                                                        -  (ring/router
                                                                                        -    [["/ping" (constantly {:status 200, :body "pong"})]
                                                                                        -     ["/assets/*" (ring/create-resource-handler)]])
                                                                                        -  (ring/create-default-handler))
                                                                                        -
                                                                                        -

                                                                                        To serve static files with conflicting routes, e.g. "/*", one needs to disable the conflict resolution:

                                                                                        -
                                                                                        (require '[reitit.ring :as ring])
                                                                                        -
                                                                                        -(ring/ring-handler
                                                                                        -  (ring/router
                                                                                        -    [["/ping" (constantly {:status 200, :body "pong"})]
                                                                                        -     ["/*" (ring/create-resource-handler)]]
                                                                                        -    {:conflicts (constantly nil)})
                                                                                        -  (ring/create-default-handler))
                                                                                        -
                                                                                        -

                                                                                        External routes

                                                                                        -

                                                                                        A better way to serve files from conflicting paths, e.g. "/*", is to serve them from the default-handler. One can compose multiple default locations using ring-handler. This way, they are only served if none of the actual routes have matched.

                                                                                        -
                                                                                        (ring/ring-handler
                                                                                        -  (ring/router
                                                                                        -    ["/ping" (constantly {:status 200, :body "pong"})])
                                                                                        -  (ring/routes
                                                                                        -    (ring/create-resource-handler {:path "/"})
                                                                                        -    (ring/create-default-handler)))
                                                                                        -
                                                                                        -

                                                                                        Configuration

                                                                                        -

                                                                                        reitit.ring/create-resource-handler takes optionally an options map to configure how the files are being served.

                                                                                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                        keydescription
                                                                                        :parameteroptional name of the wildcard parameter, defaults to unnamed keyword :
                                                                                        :rootoptional resource root, defaults to \"public\"
                                                                                        :pathoptional path to mount the handler to. Works only if mounted outside of a router.
                                                                                        :loaderoptional class loader to resolve the resources
                                                                                        :index-filesoptional vector of index-files to look in a resource directory, defaults to [\"index.html\"]
                                                                                        :not-found-handleroptional handler function to use if the requested resource is missing (404 Not Found)
                                                                                        -

                                                                                        TODO

                                                                                        -
                                                                                          -
                                                                                        • support for things like :cache, :etag, :last-modified?, and :gzip
                                                                                        • -
                                                                                        • support for ClojureScript
                                                                                        • -
                                                                                        • serve from file-system
                                                                                        • -
                                                                                        - - -
                                                                                        - -
                                                                                        -
                                                                                        -
                                                                                        - -

                                                                                        results matching ""

                                                                                        -
                                                                                          - -
                                                                                          -
                                                                                          - -

                                                                                          No results matching ""

                                                                                          - -
                                                                                          -
                                                                                          -
                                                                                          - -
                                                                                          -
                                                                                          - -
                                                                                          - - - - - - - - - - - - - - -
                                                                                          - - -
                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                                          Go to this page on cljdoc

                                                                                          diff --git a/ring/swagger.html b/ring/swagger.html index 2d72162a..97a5ad58 100644 --- a/ring/swagger.html +++ b/ring/swagger.html @@ -1,1188 +1,9 @@ - - - - - - Swagger Support · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                          -
                                                                                          - - - - - - - - -
                                                                                          - -
                                                                                          - -
                                                                                          - - - - - - - - -
                                                                                          -
                                                                                          - -
                                                                                          -
                                                                                          - -
                                                                                          - -

                                                                                          Swagger Support

                                                                                          -
                                                                                          [metosin/reitit-swagger "0.5.5"]
                                                                                          -

                                                                                          Reitit supports Swagger2 documentation, thanks to schema-tools and spec-tools. Documentation is extracted from route definitions, coercion :parameters and :responses and from a set of new documentation keys.

                                                                                          -

                                                                                          To enable swagger-documentation for a ring-router:

                                                                                          -
                                                                                            -
                                                                                          1. annotate your routes with swagger-data
                                                                                          2. -
                                                                                          3. mount a swagger-handler to serve the swagger-spec
                                                                                          4. -
                                                                                          5. optionally mount a swagger-ui to visualize the swagger-spec
                                                                                          6. -
                                                                                          -

                                                                                          Swagger data

                                                                                          -

                                                                                          The following route data keys contribute to the generated swagger specification:

                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                          keydescription
                                                                                          :swaggermap of any swagger-data. Can have :id (keyword or sequence of keywords) to identify the api
                                                                                          :no-docoptional boolean to exclude endpoint from api docs
                                                                                          :tagsoptional set of string or keyword tags for an endpoint api docs
                                                                                          :summaryoptional short string summary of an endpoint
                                                                                          :descriptionoptional long description of an endpoint. Supports http://spec.commonmark.org/
                                                                                          -

                                                                                          Coercion keys also contribute to the docs:

                                                                                          - - - - - - - - - - - - - - - - - -
                                                                                          keydescription
                                                                                          :parametersoptional input parameters for a route, in a format defined by the coercion
                                                                                          :responsesoptional descriptions of responses, in a format defined by coercion
                                                                                          -

                                                                                          There is a reitit.swagger.swagger-feature, which acts as both a Middleware and an Interceptor that is not participating in any request processing - it just defines the route data specs for the routes it's mounted to. It is only needed if the route data validation is turned on.

                                                                                          -

                                                                                          Swagger spec

                                                                                          -

                                                                                          To serve the actual Swagger Specification, there is reitit.swagger/create-swagger-handler. It takes no arguments and returns a ring-handler which collects at request-time data from all routes for the same swagger api and returns a formatted Swagger specification as Clojure data, to be encoded by a response formatter.

                                                                                          -

                                                                                          If you need to post-process the generated spec, just wrap the handler with a custom Middleware or an Interceptor.

                                                                                          -

                                                                                          Swagger-ui

                                                                                          -

                                                                                          Swagger-ui is a user interface to visualize and interact with the Swagger specification. To make things easy, there is a pre-integrated version of the swagger-ui as a separate module.

                                                                                          -
                                                                                          [metosin/reitit-swagger-ui "0.5.5"]
                                                                                          -

                                                                                          reitit.swagger-ui/create-swagger-ui-hander can be used to create a ring-handler to serve the swagger-ui. It accepts the following options:

                                                                                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                          keydescription
                                                                                          :parameteroptional name of the wildcard parameter, defaults to unnamed keyword :
                                                                                          :rootoptional resource root, defaults to "swagger-ui"
                                                                                          :urlpath to swagger endpoint, defaults to /swagger.json
                                                                                          :pathoptional path to mount the handler to. Works only if mounted outside of a router.
                                                                                          :configparameters passed to swagger-ui as-is. See the docs
                                                                                          -

                                                                                          We use swagger-ui from ring-swagger-ui, which can be easily configured from routing application. It stores files swagger-ui in the resource classpath.

                                                                                          -

                                                                                          Webjars also hosts a version of the swagger-ui.

                                                                                          -

                                                                                          NOTE: Currently, swagger-ui module is just for Clojure. ClojureScript-support welcome as a PR!

                                                                                          -

                                                                                          NOTE: If you want to use swagger-ui 2.x you can do so by explicitly downgrading metosin/ring-swagger-ui to 2.2.10.

                                                                                          -

                                                                                          NOTE: If you use swagger-ui 3.x, you need to include :responses for Swagger-UI -to display the response when trying out endpoints. You can define :responses {200 {:schema s/Any}} -at the top-level to show responses for all endpoints.

                                                                                          -

                                                                                          Examples

                                                                                          -

                                                                                          Simple example

                                                                                          -
                                                                                            -
                                                                                          • two routes
                                                                                          • -
                                                                                          • swagger-spec served from "/swagger.json"
                                                                                          • -
                                                                                          • swagger-ui mounted to "/api-docs"
                                                                                          • -
                                                                                          • note that for real-world use, you need a content-negotiation middleware - -see the next example
                                                                                          • -
                                                                                          -
                                                                                          (require '[reitit.ring :as ring])
                                                                                          -(require '[reitit.swagger :as swagger])
                                                                                          -(require '[reitit.swagger-ui :as swagger-ui])
                                                                                          -
                                                                                          -(def app
                                                                                          -  (ring/ring-handler
                                                                                          -    (ring/router
                                                                                          -      [["/api"
                                                                                          -        ["/ping" {:get (constantly {:status 200, :body "ping"})}]
                                                                                          -        ["/pong" {:post (constantly {:status 200, :body "pong"})}]]
                                                                                          -       ["" {:no-doc true}
                                                                                          -        ["/swagger.json" {:get (swagger/create-swagger-handler)}]
                                                                                          -        ["/api-docs/*" {:get (swagger-ui/create-swagger-ui-handler)}]]])))
                                                                                          -
                                                                                          -

                                                                                          The generated swagger spec:

                                                                                          -
                                                                                          (app {:request-method :get :uri "/swagger.json"})
                                                                                          -;{:status 200
                                                                                          -; :body {:swagger "2.0"
                                                                                          -;        :x-id #{:reitit.swagger/default}
                                                                                          -;        :paths {"/api/ping" {:get {}}
                                                                                          -;                "/api/pong" {:post {}}}}}
                                                                                          -
                                                                                          -

                                                                                          Swagger-ui:

                                                                                          -
                                                                                          (app {:request-method :get, :uri "/api-docs/index.html"})
                                                                                          -; ... the swagger-ui index-page, configured correctly
                                                                                          -
                                                                                          -

                                                                                          You might be interested in adding a trailing slash handler to the app to serve the swagger-ui from /api-docs (without the trailing slash) too.

                                                                                          -

                                                                                          Another way to serve the swagger-ui is using the default handler:

                                                                                          -
                                                                                          (def app
                                                                                          -  (ring/ring-handler
                                                                                          -    (ring/router
                                                                                          -      [["/api"
                                                                                          -        ["/ping" {:get (constantly {:status 200, :body "ping"})}]
                                                                                          -        ["/pong" {:post (constantly {:status 200, :body "pong"})}]]
                                                                                          -       ["/swagger.json"
                                                                                          -        {:get {:no-doc true
                                                                                          -               :handler (swagger/create-swagger-handler)}}]]) 
                                                                                          -    (swagger-ui/create-swagger-ui-handler {:path "/api-docs"})))
                                                                                          -
                                                                                          -

                                                                                          More complete example

                                                                                          -
                                                                                            -
                                                                                          • clojure.spec coercion
                                                                                          • -
                                                                                          • swagger data (:tags, :produces, :summary, :basePath)
                                                                                          • -
                                                                                          • swagger-spec served from "/swagger.json"
                                                                                          • -
                                                                                          • swagger-ui mounted to "/"
                                                                                          • -
                                                                                          • set of middleware for content negotiation, exceptions, multipart etc.
                                                                                          • -
                                                                                          • missed routes are handled by create-default-handler
                                                                                          • -
                                                                                          • served via ring-jetty
                                                                                          • -
                                                                                          -

                                                                                          Whole example project is in /examples/ring-swagger.

                                                                                          -
                                                                                          (ns example.server
                                                                                          -  (:require [reitit.ring :as ring]
                                                                                          -            [reitit.swagger :as swagger]
                                                                                          -            [reitit.swagger-ui :as swagger-ui]
                                                                                          -            [reitit.ring.coercion :as coercion]
                                                                                          -            [reitit.coercion.spec]
                                                                                          -            [reitit.ring.middleware.muuntaja :as muuntaja]
                                                                                          -            [reitit.ring.middleware.exception :as exception]
                                                                                          -            [reitit.ring.middleware.multipart :as multipart]
                                                                                          -            [reitit.ring.middleware.parameters :as parameters]
                                                                                          -            [ring.middleware.params :as params]
                                                                                          -            [ring.adapter.jetty :as jetty]
                                                                                          -            [muuntaja.core :as m]
                                                                                          -            [clojure.java.io :as io]))
                                                                                          -
                                                                                          -(def app
                                                                                          -  (ring/ring-handler
                                                                                          -    (ring/router
                                                                                          -      [["/swagger.json"
                                                                                          -        {:get {:no-doc true
                                                                                          -               :swagger {:info {:title "my-api"}
                                                                                          -                         :basePath "/"} ;; prefix for all paths
                                                                                          -               :handler (swagger/create-swagger-handler)}}]
                                                                                          -
                                                                                          -       ["/files"
                                                                                          -        {:swagger {:tags ["files"]}}
                                                                                          -
                                                                                          -        ["/upload"
                                                                                          -         {:post {:summary "upload a file"
                                                                                          -                 :parameters {:multipart {:file multipart/temp-file-part}}
                                                                                          -                 :responses {200 {:body {:file multipart/temp-file-part}}}
                                                                                          -                 :handler (fn [{{{:keys [file]} :multipart} :parameters}]
                                                                                          -                            {:status 200
                                                                                          -                             :body {:file file}})}}]
                                                                                          -
                                                                                          -        ["/download"
                                                                                          -         {:get {:summary "downloads a file"
                                                                                          -                :swagger {:produces ["image/png"]}
                                                                                          -                :handler (fn [_]
                                                                                          -                           {:status 200
                                                                                          -                            :headers {"Content-Type" "image/png"}
                                                                                          -                            :body (io/input-stream (io/resource "reitit.png"))})}}]]
                                                                                          -
                                                                                          -       ["/math"
                                                                                          -        {:swagger {:tags ["math"]}}
                                                                                          -
                                                                                          -        ["/plus"
                                                                                          -         {:get {:summary "plus with spec query parameters"
                                                                                          -                :parameters {:query {:x int?, :y int?}}
                                                                                          -                :responses {200 {:body {:total int?}}}
                                                                                          -                :handler (fn [{{{:keys [x y]} :query} :parameters}]
                                                                                          -                           {:status 200
                                                                                          -                            :body {:total (+ x y)}})}
                                                                                          -          :post {:summary "plus with spec body parameters"
                                                                                          -                 :parameters {:body {:x int?, :y int?}}
                                                                                          -                 :responses {200 {:body {:total int?}}}
                                                                                          -                 :handler (fn [{{{:keys [x y]} :body} :parameters}]
                                                                                          -                            {:status 200
                                                                                          -                             :body {:total (+ x y)}})}}]]]
                                                                                          -
                                                                                          -      {:data {:coercion reitit.coercion.spec/coercion
                                                                                          -              :muuntaja m/instance
                                                                                          -              :middleware [;; query-params & form-params
                                                                                          -                           parameters/parameters-middleware
                                                                                          -                           ;; content-negotiation
                                                                                          -                           muuntaja/format-negotiate-middleware
                                                                                          -                           ;; encoding response body
                                                                                          -                           muuntaja/format-response-middleware
                                                                                          -                           ;; exception handling
                                                                                          -                           exception/exception-middleware
                                                                                          -                           ;; decoding request body
                                                                                          -                           muuntaja/format-request-middleware
                                                                                          -                           ;; coercing response bodys
                                                                                          -                           coercion/coerce-response-middleware
                                                                                          -                           ;; coercing request parameters
                                                                                          -                           coercion/coerce-request-middleware
                                                                                          -                           ;; multipart
                                                                                          -                           multipart/multipart-middleware]}})
                                                                                          -    (ring/routes
                                                                                          -      (swagger-ui/create-swagger-ui-handler {:path "/"})
                                                                                          -      (ring/create-default-handler))))
                                                                                          -
                                                                                          -(defn start []
                                                                                          -  (jetty/run-jetty #'app {:port 3000, :join? false})
                                                                                          -  (println "server running in port 3000"))
                                                                                          -
                                                                                          -

                                                                                          http://localhost:3000 should render now the swagger-ui:

                                                                                          -

                                                                                          Swagger-ui

                                                                                          -

                                                                                          Multiple swagger apis

                                                                                          -

                                                                                          There can be multiple swagger apis within a router. Each route can be part of 0..n swagger apis. Swagger apis are identified by value in route data under key path [:swagger :id]. It can be either a keyword or a sequence of keywords. Normal route data scoping rules rules apply.

                                                                                          -

                                                                                          Example with:

                                                                                          -
                                                                                            -
                                                                                          • 4 routes
                                                                                          • -
                                                                                          • 2 swagger apis ::one and ::two
                                                                                          • -
                                                                                          • 3 swagger specs
                                                                                          • -
                                                                                          -
                                                                                          (require '[reitit.ring :as ring])
                                                                                          -(require '[reitit.swagger :as swagger])
                                                                                          -
                                                                                          -(def ping-route
                                                                                          -  ["/ping" {:get (constantly {:status 200, :body "ping"})}])
                                                                                          -
                                                                                          -(def spec-route
                                                                                          -  ["/swagger.json"
                                                                                          -   {:get {:no-doc true
                                                                                          -          :handler (swagger/create-swagger-handler)}}])
                                                                                          -
                                                                                          -(def app
                                                                                          -  (ring/ring-handler
                                                                                          -    (ring/router
                                                                                          -      [["/common" {:swagger {:id #{::one ::two}}} ping-route]
                                                                                          -       ["/one" {:swagger {:id ::one}} ping-route spec-route]
                                                                                          -       ["/two" {:swagger {:id ::two}} ping-route spec-route
                                                                                          -        ["/deep" {:swagger {:id ::one}} ping-route]]
                                                                                          -       ["/one-two" {:swagger {:id #{::one ::two}}} spec-route]])))
                                                                                          -
                                                                                          -
                                                                                          (-> {:request-method :get, :uri "/one/swagger.json"} app :body :paths keys)
                                                                                          -; ("/common/ping" "/one/ping" "/two/deep/ping")
                                                                                          -
                                                                                          -
                                                                                          (-> {:request-method :get, :uri "/two/swagger.json"} app :body :paths keys)
                                                                                          -; ("/common/ping" "/two/ping")
                                                                                          -
                                                                                          -
                                                                                          (-> {:request-method :get, :uri "/one-two/swagger.json"} app :body :paths keys)
                                                                                          -; ("/common/ping" "/one/ping" "/two/ping" "/two/deep/ping")
                                                                                          -
                                                                                          -

                                                                                          TODO

                                                                                          -
                                                                                            -
                                                                                          • ClojureScript
                                                                                              -
                                                                                            • example for Macchiato
                                                                                            • -
                                                                                            • body formatting
                                                                                            • -
                                                                                            • resource handling
                                                                                            • -
                                                                                            -
                                                                                          • -
                                                                                          - - -
                                                                                          - -
                                                                                          -
                                                                                          -
                                                                                          - -

                                                                                          results matching ""

                                                                                          -
                                                                                            - -
                                                                                            -
                                                                                            - -

                                                                                            No results matching ""

                                                                                            - -
                                                                                            -
                                                                                            -
                                                                                            - -
                                                                                            -
                                                                                            - -
                                                                                            - - - - - - - - - - - - - - -
                                                                                            - - -
                                                                                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                                            Go to this page on cljdoc

                                                                                            diff --git a/ring/transforming_middleware_chain.html b/ring/transforming_middleware_chain.html index 5ca6605d..1a719654 100644 --- a/ring/transforming_middleware_chain.html +++ b/ring/transforming_middleware_chain.html @@ -1,945 +1,9 @@ - - - - - - Transforming Middleware Chain · GitBook - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                                                            -
                                                                                            - - - - - - - - -
                                                                                            - -
                                                                                            - -
                                                                                            - - - - - - - - -
                                                                                            -
                                                                                            - -
                                                                                            -
                                                                                            - -
                                                                                            - -

                                                                                            Transforming the Middleware Chain

                                                                                            -

                                                                                            There is an extra option in ring-router (actually, in the underlying middleware-router): :reitit.middleware/transform to transform the middleware chain per endpoint. Value should be a function or a vector of functions that get a vector of compiled middleware and should return a new vector of middleware.

                                                                                            -

                                                                                            Example Application

                                                                                            -
                                                                                            (require '[reitit.ring :as ring])
                                                                                            -(require '[reitit.middleware :as middleware])
                                                                                            -
                                                                                            -(defn wrap [handler id]
                                                                                            -  (fn [request]
                                                                                            -    (handler (update request ::acc (fnil conj []) id))))
                                                                                            -
                                                                                            -(defn handler [{::keys [acc]}]
                                                                                            -  {:status 200, :body (conj acc :handler)})
                                                                                            -
                                                                                            -(def app
                                                                                            -  (ring/ring-handler
                                                                                            -    (ring/router
                                                                                            -      ["/api" {:middleware [[wrap 1] [wrap 2]]}
                                                                                            -       ["/ping" {:get {:middleware [[wrap 3]]
                                                                                            -                       :handler handler}}]])))
                                                                                            -
                                                                                            -(app {:request-method :get, :uri "/api/ping"})
                                                                                            -; {:status 200, :body [1 2 3 :handler]}
                                                                                            -
                                                                                            -

                                                                                            Reversing the Middleware Chain

                                                                                            -
                                                                                            (def app
                                                                                            -  (ring/ring-handler
                                                                                            -    (ring/router
                                                                                            -      ["/api" {:middleware [[wrap 1] [wrap 2]]}
                                                                                            -       ["/ping" {:get {:middleware [[wrap 3]]
                                                                                            -                       :handler handler}}]]
                                                                                            -      {::middleware/transform reverse})))
                                                                                            -
                                                                                            -(app {:request-method :get, :uri "/api/ping"})
                                                                                            -; {:status 200, :body [3 2 1 :handler]}
                                                                                            -
                                                                                            -

                                                                                            Interleaving Middleware

                                                                                            -
                                                                                            (def app
                                                                                            -  (ring/ring-handler
                                                                                            -    (ring/router
                                                                                            -      ["/api" {:middleware [[wrap 1] [wrap 2]]}
                                                                                            -       ["/ping" {:get {:middleware [[wrap 3]]
                                                                                            -                       :handler handler}}]]
                                                                                            -      {::middleware/transform #(interleave % (repeat [wrap :debug]))})))
                                                                                            -
                                                                                            -(app {:request-method :get, :uri "/api/ping"})
                                                                                            -; {:status 200, :body [1 :debug 2 :debug 3 :debug :handler]}
                                                                                            -
                                                                                            -

                                                                                            Printing Request Diffs

                                                                                            -
                                                                                            [metosin/reitit-middleware "0.5.5"]
                                                                                            -
                                                                                            -

                                                                                            Using reitit.ring.middleware.dev/print-request-diffs transformation, the request diffs between each middleware are printed out to the console. To use it, add the following router option:

                                                                                            -
                                                                                            :reitit.middleware/transform reitit.ring.middleware.dev/print-request-diffs
                                                                                            -
                                                                                            -

                                                                                            Sample output:

                                                                                            -

                                                                                            Ring Request Diff

                                                                                            - - -
                                                                                            - -
                                                                                            -
                                                                                            -
                                                                                            - -

                                                                                            results matching ""

                                                                                            -
                                                                                              - -
                                                                                              -
                                                                                              - -

                                                                                              No results matching ""

                                                                                              - -
                                                                                              -
                                                                                              -
                                                                                              - -
                                                                                              -
                                                                                              - -
                                                                                              - - - - - - - - - - - - - - -
                                                                                              - - -
                                                                                              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

                                                                                              Go to this page on cljdoc

                                                                                              diff --git a/search_index.json b/search_index.json deleted file mode 100644 index ddb668ff..00000000 --- a/search_index.json +++ /dev/null @@ -1 +0,0 @@ -{"index":{"version":"0.5.12","fields":[{"name":"title","boost":10},{"name":"keywords","boost":15},{"name":"body","boost":1}],"ref":"url","documentStore":{"store":{"./":["\"/api/admin/users\"})","\"/api/ipa\")","\"/api/orders/1\")","\"/api/orders/1\"}","\"/api/orders/2\"}","\"/api/orders/:id\"","\"/api/orders/:id\",","\"/api/ping\"","\"/api/ping\")","\"/api/ping\"}","\"0.5.5\"]","\"1\"}","\"ok\",","\"ok\"})","#match{:templ","#methods{...}","#object[user$handler]}","#partialmatch{:templ","#reitit","#{:id}}","&","'())","'[reitit.cor","'[reitit.r","(","(:api","(app","(clojure.spec),","(def","(defn","(fn","(fnil","(handler","(r/match","(r/partial","(r/router","(requir","(ring/get","(ring/r","(ring/rout","(schema","(updat","200,","2})","2},","::ipa)","::order","::ping)","::ping))","::ping]","::ping}","::ping}]",":a",":admin]]}",":admin}",":api]]",":api]]}",":bodi",":data",":get",":get,",":handler",":middlewar",":name",":path",":post",":put,",":request",":requir",":result",":uri",":user/ord",":wrap",";",">","[\"/admin\"","[\"/api\"","[\"/api/orders/:id\"","[\"/ping\"","[\"/users\"","[[\"/api/ping\"","[[#object[user$wrap]","[[wrap","[_]","[handler","[metosin/reitit","[request]","add","apidoc","app","base","bi","bundl","bundled:","class","clojure(script).","clojure.spec","clojure.spec)","clojurian","coercion","common","compilation,","conflict","conj","core","data","dev","develop","direct","discuss","driven","dynam","error","exampl","extend","extens","extra","fast","first","friendli","frontend","functions,","handler","handler}]]])))","help.","helper","http","http,","id","id)","id))","id)))","id]","id]]))","id}","id},","integr","interceptor","introduct","latest","main","match?","messag","method","method.","middlewar","middleware,","modul","modular","more.","name","nil","nil,","optionally,","param","paramet","part","path","pedest","pluggabl","r])","reitit","request)","requir","resolut","revers","ring","ring,","ring])","rout","router","router)","routing:","schema","separately.","sieppari","simpl","slack","spec","style","support","swagger","swagger2","syntax","tool","true","ui","ui.","util","version","wrap","{:get","{:handler","{:id","{:middlewar","{:name","{:request","{:statu","{}"],"basics/route_syntax.html":["\"/\"","\"123\",","\"123\"},","\":8080\"},","\"http://localhost:8080/api/user/123\"))","\"http://localhost:8080/api/user/123\"}","\"http://localhost:8080/api/user/{id}\",","#{:colon","'[reitit.cor","'add","'get","(","(*path).","(:id)","([\"/get","(case","(cqr","(current","(defn","(for","(name","(non","(r/match","(r/router","(requir","(str","/","/foo","/foo%20bar.",":8080","::admin]","::admin}]","::db]]","::db]}","::db}]","::ping]","::ping]]","::ping}]]","::pong}]]","::user",":a",":bracket",":bracket.",":bracket})",":bracket}.",":colon",":command",":data",":get",":let",":name",":number\"]",":path",":post)]]",":queri",":result",":syntax",":user/us",";",";#match{:templ",";;",">","[\"\"","[\"/add","[\"/admin\"","[\"/api\"","[\"/api/:version/ping\"]]","[\"/api/admin/db\"","[\"/api/ping\"","[\"/db\"","[\"/files/fil","[\"/files/{name}.{extension}\"]","[\"/ping\"","[\"/ping\"]","[\"/pong\"","[\"/pong\"]]","[\"/public/*path\"]","[\"/public/{*path}\"]","[\"/user/:us","[\"/user/{us","[\"events.{target}.{type}\"]]","[\"http://localhost:8080/api/user/{id}\"","[::admin],","[::admin]}","[::api","[:command","[[\"/api/:version\"]","[[\"/api/admin\"","[[\"/api/{version}\"]","[[\"/files/fil","[[\"/ping\"","[[\"/ping\"]","[[\"/users/:us","[[\"/users/{us","[[\"broker.{customer}.{device}.{*data}\"]","[[:queri","[[type","[actions]","[add","[get","[interceptor]}}])])","[path","\\","\\.","action","allow","anywher","appli","argument","arguments:","bar","both","bracket","brackets,","catch","caus","chang","charact","child","compil","configur","cqr","creat","creation:","data,","default","default,","defaults:","defin","defined.","e.g.,","easi","enabl","encod","end","error","exampl","explicit","flattened:","follow","free","gener","hardcoded)","have","id\"]","id/orders\"]]","id]","id])","ident","id}\"]","id},","id}/orders\"]]","ignored.","interceptor))","interceptor]","it'","keyword","list","method","multipl","need","nest","nil","nil,","normal","option","order\"","order]])","order]}}])]","param","paramet","parameter:","parameters:","path","paths.","prefix","programmatically:","qualifi","r])","reitit","rout","route:","router","routes.","routes:","same","see","sequential)","set","simpl","slash","start","stop","string","string,","string:","support","supported,","syntax","syntax:","take","termin","terminator.","that,","this.","time","two","type","us","user\"","user]","user]}}]","valid","valu","value.","vector","wildcard","wrap","yourself.","{*user/path}.","{:get","{:id","{:interceptor","{:middlewar","{:name","{:post","{:syntax","{method","{name}","{name}.pdf\"]","{number}.pdf\"]]","{user/id},","{version}.pdf\"]]"],"basics/router.html":["#object[...]","#object[...]}","'[reitit.cor","(def","(defprotocol","(match","(option","(or","(r/option","(r/rout","(r/router","(requir","(reverse)","(rout","(router","(via","::db]])","::ping]","::user]])","::user]]))","::users]",":a",":coerc",":compil",":conflict",":expand",":mix",":router",":user/db}]",":user/ping}",":user/ping}]",":user/user]",":user/users}]",":user/user}",":user/user}]]",":valid",";","[\"/admin\"","[\"/admin/db\"","[\"/api\"","[\"/api/user/:id\"","[\"/db\"","[\"/ping\"","[\"/user/:id\"","[\"/users\"","[\"/users/:id\"","[:user/p","[[\"/admin/ping\"","[[\"/api/ping\"","[[\"/users\"","[admin","[thi","[this])","admin","argument","automat","base","behind","coerc","compil","compos","conflict","creat","created,","data","data,","defin","detail","done:","easi","expand","flatten","follow","forc","function,","implement","instanc","instance,","it'","map.","merg","more","multipl","name","name]","names:","need","nil]","nil]]","option","option)","optionally,","options)","options:","params]))","path","path])","plain","protocol.","protocol:","r])","raw","reitit.core/rout","resolv","rout","router","router)","router:","routers.","routes])","routing,","routing.","satisfi","scene","select","singl","step","take","tree","tree:","user","valid","via","{:lookup","{:name"],"basics/path_based_routing.html":["\"/api/user/1\"","\"/api/user/1\")","\"/api/user/:id\"","\"/hello\")","\"1\"}}","#match{:templ","'[reitit.cor","(def","(onli","(r/match","(r/router","(requir","::ping]","::user]]))",":a",":data",":path",":result",":user/user}",";","[\"/api\"","[\"/ping\"","[\"/user/:id\"","argument","base","done","exact","following:","function.","given","information:","match","match,","matched,","miss","nil","nil,","nil:","on","param","paramet","partialmatch,","path","provid","r])","reitit.core/match","return","revers","rout","router","router:","routing)","take","us","{:id","{:name"],"basics/name_based_routing.html":["\"/api/ping\"","\"/api/ping\"}","\"/api/user/1\"","\"/api/user/1?iso=m%c3%b6ly\"","\"/api/user/:id\"","\"/api/user/:id\",","\"1\"})","\"1\"}}","\"möly\"}))","#match{:templ","#partialmatch{:templ","#{:id}","#{:id}}","'[reitit.cor","(","(current","(def","(r/match","(r/partial","(r/rout","(r/router","(requir","(reverse)","/api/user/:id:","1})","::kikka)","::ping)","::ping]","::user","::user)","::user))","::user]]))",":a",":data",":name",":path",":requir",":result",":user/ping}",":user/user]",":user/user}",":user/user},",";",">",">path",">path))",">path:","[\"/api\"","[\"/ping\"","[\"/user/:id\"","[:user/p","automat","base","booleans,","coerc","data","defin","except","exceptioninfo","given","help","internal)","keyword","list","map","match","match?","miss","name","name!","name.","names:","nil","nil,","nil:","numbers,","objects:","option","param","paramet","parameters:","partialmatch","path","path,","protocol","provid","queri","r])","reitit.core/match","reitit.impl/intostring.","return","returned:","rout","route:","router","router)","router:","set,","strings,","support","take","throw","too:","true","turn","version:","{:id","{:iso","{:name","{}"],"basics/route_data.html":["\"\".","\"/ping\"","\"/ping\")","\"/ping\"}","\"index.html\")])","#(slurp","#match{:templ","#{:admin}","#{:admin}}","#{:db","'[reitit.cor","(def","(expand","(extend","(java.io.file.","(r/expand","(r/match","(r/rout","(r/router","(requir","(via","::api","::api],","::db]","::ping)","::ping]","::ping}]","::pong]]","::pong]]))","::pong}]]","::swagger]","::swagger}]","::users]","::users}",":a",":append,",":data",":data:",":displac",":expand",":handler",":name",":no",":path",":prepend,",":replac",":result",":role",":user/ping}",":user/ping}]",";","[\"/\"","[\"/admin\"","[\"/api","[\"/api\"","[\"/api/admin/db\"","[\"/api/admin/users\"","[\"/api/ping\"","[\"/api/pong\"","[\"/db\"","[\"/ping\"","[\"/pong\"","[\"/swagger.json\"","[\"/users\"","[::api","[::api]","[::api]}","[::db]","[::session","[::session]}}))","[[\"\"","[[\"/api/ping\"","[[\"/ping\"","[[\"/swagger.json\"","[file","^:replac","accumul","ad","add","admin}}]]","admin}}]]]))","allow","application,","argument","argument:","attach","back","behavior","besid","case","client","collect","compon","creat","creation","custom","data","data,","data.","data:","default","default,","direct","doc","docs\"","docs]","docs]]","docs}]","documentation:","empti","exampl","exclud","expand","expans","extend","featur","file)","first","fragment","function","function,","gener","given","identity]","identity]}","identity}]","identity}}]]","identity}}]]))","implement","implementation.","interceptors.","interpret","introduc","java.io.fil","key","keys.","keyword","leaf","level","map","match","match.","merge.","meta","middlewar","naiv","name","nest","nil","nil]","non","option","option)","options)))","options]","overridden","page","param","path","path.","protocol.","r/expand","r])","raw","react.js,","recurs","recursive.","reitit.","resolv","retriev","return","root","rout","router","router)","routes:","see","sequenti","share","support","swagger","swap","target","them,","time.","top","toward","tree","tree:","trees,","true,","true}","type","us","valid","validation.","valu","via","without","{:data","{:get","{:handler","{:interceptor","{:middlewar","{:name","{:no","{:role","{}"],"basics/route_data_validation.html":["\"/api\"","\"/api\",","\"identity\"","\"identity\",","\"identity\"},","\"identity\"}]","\"identity\"}])","\"identity\"}}})},","\"kikka\"}]","#:clojure.spec.alpha{:problem","#object[reitit.core$...]","#{:admin","#{:adminz}}]","#{}))","'[clojure.spec.alpha","'[reitit.cor","'[reitit.dev.pretti","'[reitit.spec","'[spec","(#reitit.spec.problem{:path","()","(default","(r/router","(requir","(s/coll","(s/def","(s/key","(s/merg","({:path","...","2","::descript","::role","::rs/default","::rs/wrap",":a",":coerc",":compil",":data",":except",":in",":into",":manager})",":pred",":problem",":reitit.spec/default",":reitit.spec/handl",":reitit.spec/handler],",":reitit.spec/wrap",":req",":role",":scope",":spec",":val",":valid",":valu",":via",";","=>","[\"/api\"","[::description]))","[:handler]","[:handler],","[:handler]}),","[:reitit.spec/default","a:descript","accident","ad","anything,","app","appli","ariti","at:","author","better","case","catch","clojure.core/fn?,","clojure.lang.exceptioninfo:","clojure.spec","close","compiled.","compilerexcept","compiling:","contain","custom","data","data)","data,","data:","defin","descript","easi","effect","error","errors.","errors:","except","exist","expect","fail","fast","fast,","first","fn?","follow","found.","fulli","function","give","go","helper","hinder","hook","ident","implicitli","in:","instead","invalid","it'","key","level","main","messages:","misspel","much","name.","namespac","nicer","nil,","non","note:","on:","opt","option","options:","part","place.","predicate:","pretti","pretty/exception})","pretty])","problem.","qualifi","r])","read","reitit.cor","reitit.spec","requir","rout","router","rs/valid","rs/validate})","rs])","run","s])","same","side","sight","spec","spec:","specs.","specs:","spell/clos","spell])","string?)","successfulli","throw","tools.spel","tools.spell/clos","top","tree","turn","type","un","us","val:","valid","valu","value:","verifi","way.","whole","without","wrap","wrong.","{:descriptionz","{:handler","{:problem","{:summari","{:valid"],"basics/route_conflicts.html":["#'user/rout","#object[reitit.core$quarantine_router$reifi","#object[reitit.core$quarantine_router$reify]","'[reitit.cor","'[reitit.except","(def","(exception/format","(fn","(legaci","(println","(r/router","(requir","/:user","/:version/statu","/admin/p","/bulk/:bulk","/ping","/public/*path","::admin]","::ping]","::ping]])",":a",":conflict",":path",";",";:reitit.core/p",";compilerexcept","=>",">","[\"/:user","[\"/:version/status\"","[\"/:version/status\"]])","[\"/admin\"","[\"/admin/ping\"","[\"/bulk/:bulk","[\"/public/*path\"","[\"/public/*path\"]","[[\"/ping\"","[[\"/ping\"]","[conflicts]","allow","alternatively,","api)","automatically.","both","case","cases,","check","clojure.lang.exceptioninfo:","compilerexcept","conflict","conflict,","conflicts)))})","conflicts:","contain","creat","data.","data:","default,","defaults:","descript","disabl","ex","except","exception])","fail","fast","id","id\"","id\"]","id/ord","id/orders\"","id/orders\"]","ignor","individu","info","log","message.","name","names.","names:","nil","nil})","on","option","overrid","path","paths:","r])","reitit.core/router,","resolut","resolution.","rout","router","routes)","thrown","true}]","true}]])","via","way","{:conflict"],"basics/error_messages.html":["\"0.5.5\"]","'[reitit.cor","'[reitit.dev.pretti","(in","(r/router","(requir",":a",":except","[\"/:user","[\"/:version/status\"]]","[\"/:version/status\"]])","[\"/bulk/:bulk","[\"/public/*path\"]","[[\"/ping\"]","[metosin/reitit","back","behind","both","caught,","color,","creation","data","default","defin","dev","develop","done","easi","elm","error","eta","exampl","except","expound","extend","extend.","fipp,","format","formatt","friendli","function.","handl","heavi","human","id\"]","id/orders\"]","inspir","lifting.","love","messag","messages,","messages.","module).","more","multimethod,","option.","page.","partli","pretti","pretty/exception})","pretty])","produc","r])","readabl","readable,","reitit","reitit.core/rout","reitit.dev.pretty/except","reitit.exception/exception.","rethrown","ring.","rout","router","runtim","scenes,","see","singl","spec","spell","thrown","us","valid","{:except"],"coercion/coercion.html":["\"/:company/users/:us","\"/metosin/users/123\")","\"/metosin/users/123\"))","\"/metosin/users/123\"}","\"/metosin/users/ikitommi\")","\"/metosin/users/ikitommi\"))","\"123\"},","\"ikitommi\"))}}","\"metosin\",","#coercionerror{:schema","#match{:templ","#object[reitit.coercion$request_coercer$]},","'[reitit.coercion","'[reitit.coercion.schema])","'[reitit.cor","'[schema.cor","(:reitit.coercion/request","(and","(assoc","(coercion/coerce!","(core.clj:4739)","(def","(defn","(done","(if","(integer?","(match","(not","(r/match","(r/router","(requir","(with","123}}","::user",":a",":body,",":coercion",":data",":error",":form,",":header",":paramet",":parameters.",":path",":path.",":query,",":result",":user",":user/us",";","=>",">","[\"/:company/users/:us","[match","[path]","actual","ad","again:","against","another.","any},","appli","applied.","apply.","attach","back.","base","befor","better","blown","both","catch","clojure.core/ex","clojure.spec","coerc","coerce!","coercer","coercers.","coercers}))","coercion","coercion)","coercion,","coercion.","coercion/compil","coercion])","compil","creation","data","data.","default,","defin","defined).","defined,","depend","differ","do","done","done.","done:","effect","enabl","enough","error:","exampl","exceptioninfo","explain","explicit","failed...","failed:","fails,","follow","format","full","function","helper","here'","hold","http","id","id\"","id\",","implement","implementation.","info","int,","interceptor","int}}},","inventoried.","java.lang.string,","key","key.","level,","magical.","make","malli","manual","match","match))))","match:","middleware,","modules:","much","multipl","need","nil,","non","normal","now","on","once,","param","paramet","parameters:","pars","part.","path","path)]","perform","plumat","process","protocol","r])","reitit","reitit,","reitit.coercion.malli/coercion","reitit.coercion.schema/coercion","reitit.coercion.spec/coercion","reitit.coercion/coerce!","reitit.coercion/coercion","reitit.coercion/compil","request","responses)","ring","rout","router","router,","router.","routing.","rule","s/int}}}]","s/int}}}]))","s/str","s])","schema","schema:","scope","see","separ","ship","singl","spec","step","steps.","strings:","success","syntax","thing","this:","thrown,","time),","transform","two","type","under","us","via","view","view,","view]))","view},","why?","wildcard","within","yield","{:compani","{:compil","{:name","{:path","{:user"],"coercion/schema_coercion.html":["\"/:company/users/:us","\"/metosin/users/123\")","\"/metosin/users/123\"}","\"/metosin/users/ikitommi\")","\"123\"},","\"metosin\",","#match{:templ","#object[reitit.coercion$request_coercer$]},","'[reitit.coercion","'[reitit.coercion.schema])","'[reitit.cor","'[schema.cor","(assoc","(coercion/coerce!","(def","(defn","(if","(match","(r/match","(r/router","(requir","123}}","::user",":a",":coercion",":data",":paramet",":path",":result",":user",":user/us",";","=>",">","[\"/:company/users/:us","[match","[path]","clojure(script)","coerce!","coercers}))","coercion","coercion/compil","coercion:","coercion])","data","declar","descript","exceptioninfo","fail","failed...","id","id\"","id\",","int}}},","java.lang.string,","librari","match","match))))","param","path","path)]","plumat","r])","reitit.coercion.schema/coercion","request","router","s/int}}}]","s/str","s])","schema","success","validation.","view","view,","{:compani","{:compil","{:name","{:path"],"coercion/clojure_spec_coercion.html":["\"/:company/users/:us","\"/metosin/users/123\")","\"/metosin/users/123\"}","\"/metosin/users/ikitommi\")","\"100\"","\"100\"}]","\"100\"}]}","\"123\"","\"123\"},","\"123\"}]","\"123\"}]}","\"mation\"}]","\"metosin\",","\"much\"","\"some","\"too\"}]}","#match{:templ","#object[reitit.coercion$request_coercer$]},","'[clojure.spec.alpha","'[reitit.coercion","'[reitit.coercion.spec","'[reitit.coercion.spec])","'[reitit.cor","'[spec","'em","(assoc","(coercion/coerce!","(core","(def","(defn","(if","(like","(match","(r/match","(r/router","(requir","(s/coll","(s/def","(s/key","(st/coerc","100","100}]","100}]}","123","123,","123}]}","123}}","2116","2251",":123}]",":123}],","::compani","::mi","::path","::photo","::photos]","::photos]))","::remark","::sku","::user",":a",":coercion",":data",":height",":here",":infor",":into",":opt",":paramet",":path",":photo",":photo/height",":photo/id",":photo/width",":photo/width]))",":remark",":req",":result",":sku",":sku/id",":user",":user/us",":width",";",";;",";;{:sku","=>",">",">edn","[\"/:company/users/:us","[::compani","[::remarks]))","[::sku","[:photo/height","[:photo/id]","[:photo/id]))","[:sku/id]))","[]))","[match","[path]","[{:id","accept","add","allow","alpha","api","appli","automatic.","back","base","both","chang","clj","clojure.spec","clojure.spec,","clojure.spec.alpha/conform,","coerc","coerce!","coerced.","coercers}))","coercion","coercion.","coercion/compil","coercion:","coercion])","consid","custom","data","data,","data:","deepli","default,","defin","destructur","doesn't","each","easili","elegantly.","exampl","example.","exceptioninfo","extra","fail","failed...","gener","go","height","help","id","id\"","id\",","id]))","infer","int","int?)","integer.","internal,","it'","it,","itself","json","key","keys.","keyword?)","later.","lean","librari","match","match))))","need","nest","of,","omit","on","option","out","param","params}},","params}}]","path","path)]","photo","predicates,","present","previou","r])","rcs/json","rcs])","records.","regex","reitit","reitit.coercion.spec/coercion","remark","remarks\"}","remov","repl.","request","router","s/and,","s/coll","s/every),","s/key","s/keys,","s/map","s/nillabl","s/or,","s])","simpl","solv","spec","spec.","spec])","specifi","specs),","specs,","specs:","st/json","st/string","st])","string","string?)","strip","structur","success","support","suppos","test","tool","tools.cor","tools.core/spec,","tools.spec","transform","transformer)","un","up.","us","usag","valid","view","view,","vote","walk","walker","want","warn","width","wrap","{:compani","{:compil","{:name","{:path","{:sku","{:too"],"coercion/data_spec_coercion.html":["\"/:company/users/:us","\"/metosin/users/123\")","\"/metosin/users/123\"}","\"/metosin/users/ikitommi\")","\"123\"},","\"metosin\",","#match{:templ","#object[reitit.coercion$request_coercer$]},","'[reitit.coercion","'[reitit.coercion.spec])","'[reitit.cor","(assoc","(coercion/coerce!","(def","(defn","(if","(match","(r/match","(r/router","(requir","123}}","::user",":a",":coercion",":data",":paramet",":path",":result",":user",":user/us",";","=>",">","[\"/:company/users/:us","[match","[path]","alternative,","bonus,","box.","clojure.specs.","coerce!","coercers}))","coercion","coercion/compil","coercion:","coercion])","conform","data","defin","exceptioninfo","fail","failed...","free","id","id\"","id\",","int?}}},","int?}}}]","macro","match","match))))","out","param","path","path)]","r])","reitit.coercion.spec/coercion","request","router","runtim","spec","string?","string?,","success","support","syntax","transform","via","view","view,","{:compani","{:compil","{:name","{:path"],"ring/ring.html":["\"\"}","\"/all\"})","\"/api/admin/db\"})","\"/api/get\"})","\"/api/ping\"})","\"/favicon.ico\"})","\"/ping\"","\"/ping\")","\"/ping\"}","\"/ping\"})","\"0.5.5\"]","\"ok\"}","\"ok\"})","#endpoint{...}","#endpoint{...}}","#endpoint{:data","#methods{:get","#object[...]","#object[...]}","#object[...]}}","%","&","'[reitit.cor","'[reitit.r","(","(:get,","(all","(app","(conj","(def","(default","(default:","(defn","(fn","(fnil","(handler","(r/compil","(r/match","(requir","(ring/get","(ring/r","(ring/rout","(see","(updat","200,","::acc","::ping","::ping)",":a",":admin",":admin]]}",":api",":api)]}",":api]]}",":bodi",":data",":db",":db]]",":delet",":delete,",":delete]]",":get",":get,",":handler",":handler)})",":handler]}",":head,",":inject",":middlewar",":ok]}",":option",":options,",":patch,",":path",":post",":post,",":put",":put,",":reitit.core/match",":reitit.core/rout",":reitit.middleware/registri",":reitit.middleware/transform",":reitit.ring/default",":request",":result",":top]]}))",":trace).",":uri",";",";#match{:templ",";;",";[[\"/ping\"","=>",">",">path))","[\"/admin\"","[\"/api\"","[\"/db\"","[\"/get\"","[\"/ping\"","[#(wrap","[:api","[:top","[[\"/all\"","[[mw","[[wrap","[])","[]}","[]}}]]","[_]","[acc]}]","[handler","[metosin/reitit","[middleware]","[request]","[{::key","abstract","acc","accept","access","add","allow","api,","app","app:","appli","applic","applications,","args*]","argument","asynchron","available:","base","befor","boolean","both","catch","chang","clojur","compil","compon","concepts.","conj","construct","contain","correctly:","cors.","data","default","default,","descript","detail","done:","driven","enabl","endpoint","endpoint)","exampl","expand","follow","found.","frameworks.","function","gener","given","handler","handler\"","handler:","handler]","handler}]))","handler}]])","handler}]])))","handler}}]]])))","handling.","higher","http","id))))","id]","identity).","include:","inject","inspir","intomiddlewar","it'","key","keyword","level","librari","lookup","map","match","match?","method","method:","methods)","methods:","middlewar","middleware,","middleware.","middleware:","modular","more","mount","name","name,","nest","nil","normal","option","options,","options:","order","param","path","place","python'","r])","rack.","read","record","refer","registri","reitit.middleware/intomiddlewar","reitit.ring/r","replac","request","respons","return","revers","ring","ring])","rout","router","router)","router))","router,","router:","router?","routes))","routing,","routing:","ruby'","sequenc","servers,","share","simpl","simple,","specif","submap.","support","synchron","thing","this):","top","transform","true)","under","unifi","us","valid","valu","values.","varieti","vector","via","web","wrap","wsgi","{:get","{:handler","{:middlewar","{:name","{:request","{:statu","{}"],"ring/reverse_routing.html":["\"/users\"})","\"/users/0?iso=m%c3%b6ly\"}","\"/users/1?iso=m%c3%b6ly\"}","\"/users/2?iso=m%c3%b6ly\"}","\"/users/3?iso=m%c3%b6ly\"}","\"/users/4?iso=m%c3%b6ly\"}","\"/users/5?iso=m%c3%b6ly\"}","\"/users/6?iso=m%c3%b6ly\"}","\"/users/7?iso=m%c3%b6ly\"}","\"/users/8?iso=m%c3%b6ly\"}","\"/users/9?iso=m%c3%b6ly\"})}","\"möly\"}))})})}]","\"user...\"})}]])))","'[reitit.cor","'[reitit.r","(","(a","(app","(constantli","(def","(fn","(for","(r/match","(rang","(requir","(ring/r","(ring/rout","({:uri","10)]","200","200,","::r/match)","::r/router","::user",":a",":bodi",":get",":get,",":uri",";",";;",">",">path",">path,","[\"/users/:id\"","[[\"/users\"","[i","[router]}]","[{::r/key","app","avail","below","both","convert","endpoints.","exampl","extra","handler","handler:","inject","i})","map","match","method","middlewar","name","on","option","param","paramet","path,","queri","r/match","r])","reitit.ring/r","request","revers","ring","ring])","rout","router","take","that,","too.","us","{:get","{:id","{:iso","{:name","{:request","{:statu","{:uri"],"ring/default_handler.html":["\"\"}","\"\"})","\"\"})))","\"/\"})","\"/invalid\"})","\"/ping\"})","\"/pong\"})","\"kosh\"}","\"kosh\"})","\"kosh\"})})))","'[reitit.r","(app","(constantli","(def","(defn","(handler","(no","(requir","(ring/creat","(ring/r","(ring/rout","200,","404,","405,","406,",":a",":bodi",":get,",":method",":not",":post,",":uri",";","[\"/ping\"","[\"/pong\"","[[\"/ping\"","[_]","accept","allow","app","argument","correct","custom","default","default,","defaults:","differenti","error","found","handler","handler)))","handler:","handler])","handler])))","handler}]","http","match,","matched)","matched),","method","more","nil","nil).","nil)]])","respons","responses,","responses:","return","returned,","ring","ring/creat","ring:","ring])","rout","second","set","used.","valid","{:get","{:not","{:request","{:statu","{:uri"],"ring/slash_handler.html":["\"\",","\"\"}","\"\"})]","\"\"})])))","\"\"})]])","\"/ping\"},","\"/ping/\"})","\"/pong\"})","\"/pong/\"},","'[reitit.r","(app","(constantli","(def","(requir","(ring/creat","(ring/r","(ring/redirect","(ring/rout","(whether)","200,","308,","404,",":a",":add})",":add})))",":bodi",":header",":method",":strip})))",";","[\"/ping\"","[\"/pong/\"","[[\"/ping\"","accept","allow","app","argument","both.","compos","configur","correct","default","defin","desir","error","example,","extra","handl","handler","handler)))","handler))))","handler:","http","match","matches.","miss","missing/extra","more","nil","option","paramet","path","precis","recogn","redirect","request","responses:","ring","ring/rout","ring])","rout","router","same.","second","set","slash","slash,","slash.","slashes.","sometim","trail","us","without","won't","work","{\"location\"","{:method","{:statu","{:uri","{}}"],"ring/static.html":["\"/\"})","\"/*\",","\"/assets/*\".","\"pong\"})]","\"pong\"})])","'[reitit.r","(404","(clojur","(constantli","(requir","(ring/creat","(ring/r","(ring/rout","200,",":",":a",":bodi",":cache,",":etag,",":gzip",":index",":last",":loader",":not",":paramet",":path",":root","[\"/*\"","[\"/assets/*\"","[\"/ping\"","[[\"/ping\"","[\\\"index.html\\\"]","\\\"public\\\"","actual","be","better","class","classpath.","clojurescript","compos","configur","conflict","default","descript","directory,","disabl","e.g.","extern","file","files.","found","found)","function","good","handler","handler))","handler)))","handler)]]","handler)]])","handler.","index","intern","key","keyword","loader","locat","look","map","matched.","miss","modified?,","mount","multipl","name","need","nil)})","non","none","on","only)","option","outsid","parameter,","path","paths,","reitit.ring/cr","request","resolution:","resolv","resourc","return","ring","ring])","root,","rout","router.","routes,","serv","served.","static","support","system","take","thing","to.","todo","two","unnam","us","vector","way","way,","wildcard","work","{:conflict","{:path","{:statu"],"ring/dynamic_extensions.html":["\"/api/admin/ping\",","\"/api/admin/ping\"})","\"/api/ping\"})","\"forbidden\"}","\"ok\"}","\"ok\"}))","#{:admin}}","#{:admin}})","'[clojure.set","'[reitit.r","(affect","(and","(app","(constantli","(def","(defn","(fn","(handler","(if","(let","(not","(requir","(ring/get","(ring/r","(ring/rout","(seq","(set/subset?","(some","200,","403,","::roles)]",":a",":bodi",":data",":get,",":mi",":uri",";",">","[\"/admin\"","[\"/ping\"","[[\"/api\"","[handler]","[mi","[requir","[wrap","[{:key","access","ad","anonym","app","author","base","better.","build","compil","data","driven","dynam","enforc","exampl","extens","extract","guard","handler","handler]","handler]]]]","hoc","inject","match","match)","match.","method","middlewar","mount","much","nice,","public","reitit.ring/get","request","request)))))","request}]","requir","required)","ring","ring])","role","roles)))","roles:","roles]","roles]}})))","rout","route:","router","routes):","routes.","runtim","see","set])","system.","us","user","via","wrap","{::role","{:data","{:middlewar","{:request","{:statu"],"ring/data_driven_middleware.html":["\"/api/ping\"})","\"middlewar","#{:session}","#{:user}","&","'[reitit.middlewar","'[reitit.r","(app","(conj","(def","(defn","(fn","(fnil","(handler","(middleware/map","(of","(optional)","(requir","(ring/r","(ring/rout","(updat","1]","2","200,","2]]}","3","3]]","::acc","::wrap2","::wrap3",":a",":bodi",":compil",":descript",":get,",":handler",":handler)})",":handler]}",":middlewar",":name",":provides.",":requir",":spec",":uri",":wrap",";","=>",">middlewar","[\"/api\"","[\"/ping\"","[1","[[wrap","[[wrap3","[])","[acc]}]","[handler","[request]","[wrap2","[{::key","acc","access","actual","against","allowed.","api","app","appli","arbitrari","arg","authorizationmiddlewar","avail","chain","chain,","class","clojure.spec","compil","compilation.","compos","composit","conj","correctly:","creat","data","data,","data:","debug","default,","defin","definit","depend","descript","details.","doc","downsid","driven","duct","e.g.","easi","enabl","endpoint","entri","etc.","expand","first","follow","form","function","function,","function.","functions,","futur","good","handler","handler}}]])))","hard.","id))))","id]","idea","ident","injectuserintorequestmiddlewar","inventories,","issu","it'","key","keys,","keyword","level","make","map","merg","method","middlewar","middleware)","middleware.","middleware])","mount","name","new","normal","opaqu","optim","order.","penalty.","performance.","processing,","produc","protocol.","provid","purpose:","qualifi","raw","record","reitit","reitit.middleware/intomiddlewar","reitit.middleware/middlewar","rel","request","request.","requir","resolut","respons","response.","results,","ring","ring])","rout","router","router.","runtim","see","set","special","style","support","thing","things.\"","thu","top","transform","type","understand","unwrap","us","valid","valu","vector","welcom","wrap","wrap2","wrap3","wrap})","wrap}))","wrong","yield","zero","{:get","{:middlewar","{:name","{:request","{:statu"],"ring/transforming_middleware_chain.html":["\"/api/ping\"})","\"0.5.5\"]","#(interleav","%","'[reitit.middlewar","'[reitit.r","(actually,","(app","(conj","(def","(defn","(fn","(fnil","(handler","(repeat","(requir","(ring/r","(ring/rout","(updat","1","1]","2","200,","2]]}","3","3]]","::acc",":a",":bodi",":debug",":debug]))})))",":get,",":handler",":handler)})",":handler]}",":reitit.middleware/transform",":uri",";","[\"/api\"","[\"/ping\"","[1","[3","[[wrap","[])","[acc]}]","[handler","[metosin/reitit","[request]","[wrap","[{::key","acc","add","app","applic","between","chain","compil","conj","console.","diff","each","endpoint.","exampl","extra","follow","function","handler","handler}}]]","handler}}]])))","id))))","id]","interleav","it,","method","middlewar","middleware.","middleware])","new","option","option:","out","output:","per","print","reitit.ring.middleware.dev/print","request","return","revers","reverse})))","ring","ring])","router","router):","sampl","transform","transformation,","underli","us","valu","vector","wrap","{::middleware/transform","{:get","{:middlewar","{:request","{:statu"],"ring/middleware_registry.html":["\"/api/bonus\"})","\"go","\"look","'[reitit.middlewar","'[reitit.r","(all","(app","(def","(defn","(fn","(fnil","(handler","(i.e.","(requir","(ring/r","(ring/rout","(updat","+","0)","10]}})))","200,","20]]}","30}}",":a",":bodi",":bonu",":bonus10",":descript",":get",":get,",":id",":middlewar",":reitit.middleware/registri",":uri",";",";avail",";compilerexcept",";|","=>","[\"/api\"","[\"/bonus\"","[:bonu","[:bonus10]","[[:bonu","[bonus]}]","[handler","[request]","[{:key","app","applic","bonu","bonus}})))","bonus}})}]]","clojure.lang.exceptioninfo:","common","complex","configur","contain","creation","data","databases.","default","defin","definition\"","descript","doesn't","duct","easi","edn","enabl","error","evalu","exampl","example,","expected:","extern","extra","fail","fast","file","files.","format","found","good","hand,","handler","handlers)","help","id","indirection,","intomiddleware.","isn't","it'","itself),","keep","key","keyword","keywords.","level","liter","look","make","map","message.","method","middlewar","middleware:","middleware])","more","options.","persist","prefil","referenc","registri","registry,","registry.","registry:","registry?","reitit","reitit.ring_test$wrap_bonus@59fddabb","remov","request","ring","ring.","ring])","rout","router","source\".","store","support","syntax","thing","todo","under","up","us","value))))","value]","work","wrap","{::middleware/registri","{:bonu","{:middlewar","{:request","{:statu","|"],"ring/exceptions.html":["\"/fail\"","\"/fail\"})","\"/fail\"}}","\"0.5.5\"]","\"default\"","\"default\")","\"error\"","\"error\")","\"exception\"","\"exception\")","\"fail\"","\"fail\")))]","\"java.lang.exception\"}}","\"sql","&","'[reitit.r","'[reitit.ring.middleware.except","(.getclass","(:uri","(app","(def","(default","(defn","(deriv","(ex","(exception.","(exception/cr","(fn","(handler","(http","(merg","(no","(partial","(pr","(println","(requir","(ring/r","(ring/rout","(throw","1)","2)","3","3)","4)","400","5)","500","500,","::default","::error","::except","::exception)","::exception/default","::exception/wrap","::failue})))]","::failur","::horror",":a",":bodi",":class",":data",":except",":get,",":muuntaja/decod",":reitit.coercion/request",":reitit.coercion/respons",":reitit.ring/respons",":reitit.ring/response,",":respons",":type",":uri",":user/failue}",";",";;",";{:statu","=>","[\"/fail\"","[_]","[except","[exception/except","[handler","[messag","[metosin/reitit","actual","ancestor","app","ariti","avail","catches:","caught","child","class","class.","clients.","clojure.lang.exceptioninfo","coercion","creat","creation","custom","data","data.","decod","default","default).","default,","default:","descript","e","error","ex","except","exception\")","exception)","exception/cr","exception/default","exception/except","exception])","follow","format","good","handl","handler","handler).","handler.","handlers.","hierarchi","identifi","identifier.","info","it'","java.sql.sqlexcept","key","keyword","level","log","lookup","map","match","messag","method","middlewar","middleware]}})))","muuntaja","noth","option","options.","order:","overrid","practis","preconfigur","print","reitit.ring/r","request","request)))","request))})))","request)}})","request]","respons","response)","return","ring","ring])","router","runtim","safe","select","sqlexcept","stack","str","super","take","thrown","thrown/rais","top","trace","type","us","valu","wrap","{:data","{:messag","{:middlewar","{:request","{:statu","{:type","{;;"],"ring/default_middleware.html":["\"0.5.5\"]","'[reitit.ring.middleware.multipart","(requir",":a",":consum",":multipart]",":reitit.middleware/transform","[:paramet","[metosin/reitit","action:","add","app","application/x","automatically.","better","between","bodi","captur","cases,","chain","common","configur","contain","content","custom","data","data:","default","defin","definit","descript","diff","driven","each","easier","emit","exampl","except","expect","factor","follow","form","format","format.","function.","gener","handl","https://github.com/metosin/reitit/blob/master/examples/r","inspect","it,","key","lift","manag","mani","middlewar","middleware,","middleware.","mount","multipart","multipart/cr","multipart/multipart","multipart])","muuntaja","negoti","negotiation.","note:","option:","output:","paramet","params.","partial","parts:","performance.","preconfigur","prefer","print","queri","reitit","reitit.ring.middleware.dev/print","reitit.ring.middleware.parameters/paramet","request","respons","ring","ring,","ring.","ring.middleware.params/wrap","rout","route.","router","sampl","see","set","swagger","swagger/src/example/server.clj.","transform","two","urlencod","us","wrap","wrapper","www","yield"],"ring/content_negotiation.html":["\"application/json\"","\"application/json\")","\"forc","\"kukka\"})}}]]","\"negoti","\"text/xml\"}","\"total\":","\"yyyi","\"{\\\"value\\\":\\\"2019","#'app","&","'[muuntaja.cor","'[reitit.coercion.spec","'[reitit.r","'[reitit.ring.coercion","'[reitit.ring.middleware.muuntaja","'[ring.adapter.jetti","(","(+","(assoc","(def","(fn","(java.util.date.)}","(jetty/run","(json,","(m/creat","(m/encod","(requir","(ring/r","(ring/rout","10","11","15\\\"}\"","16:59:54","16:59:58","20","200","2018","22","3","3000,","8",":3000/math",":3000/xml",":a",":bigdecimals]",":bodi",":body}",":coercion",":consum",":data",":decod",":encod",":handler",":header",":join?",":middlewar",":muuntaja",":muuntaja/request",":muuntaja/respons",":paramet",":parameters}]",":produc",":respons",":y",";","=>",">",">>","[\"/xml\"","[:format","[[\"/math\"","[_]","[edn].","[muuntaja/format","[x","[{{{:key","accept","accept,","ad","add","alreadi","app","application/json;","aug","automat","base","below","bigdecim","bodi","chang","charset","charset=utf","clojure.","compos","configur","configuration.","content","current","custom","data.","data:","date:","dd\"))))","dd\"})))","decod","default","definit","descript","doesn't","doubl","edn,","emit'","encod","encoding.","exampl","except","exist.","expect","explain","explicit","false})","find","format","format]","formatt","gmt","handler","header","headers.","however,","http","http/1.1","httpie:","inspect","instal","instanc","instance,","instance.","int?,","int?}}","int?}}}","it'","it.","java.util.d","jetti","jetty(9.2.21.v20170120)","jetty])","json","key","keyword","kukka","length:","m","m/default","m/instanc","m])","mani","map,","middlewar","middleware]}})))","mm","more","mount","muuntaja","muuntaja.core/muuntaja","muuntaja/format","muuntaja])","need","negoti","negotiation,","new","now","ok","opt","option","opts]","param","paramet","pars","post","publish","rcs/coercion","rcs])","reitit","request","request.","respons","response\"","result","ring])","rout","router","rrc/coerc","rrc])","sane","server:","set.","singl","slurp)","swagger","take","test","text/xml","therefor","togeth","transit)\"","true)","true)))","type","type\"","type:","us","via","wed,","wrapper","x","x:=1","xml","y)}})}}]","y:=2","y]}","you'd","{","{\"content","{200","{:bodi","{:data","{:date","{:get","{:muuntaja","{:port","{:post","{:statu","{:summari","{:total","{:valu","{:x","}"],"ring/coercion.html":["\"","\"(constrain","\"(not","\"/api/ping\"})","\"/api/plus/3\"","\"/plus\"","\"1\",","\"1\"}","\"abba\"}","\"abba\"},","\"any\"","\"any\"},","\"fail\"}","\"fail\"}})","\"int\",","\"pong\"}","\"pong\"})}]","\"y\"","&","'[expound.alpha","'[reitit.coercion.schema])","'[reitit.cor","'[reitit.r","'[reitit.ring.coercion","'[reitit.ring.middleware.except","'[schema.cor","'positiveint))","(","(+","(app","(coercion","(def","(defn","(exception/cr","(expound/custom","(fn","(handler","(integer?","(let","(mapv","(merg","(positiveint","(printer","(r/match","(requir","(ring/get","(ring/r","(ring/rout","(s/constrain","...","...,","10}})","1}","2\"}})","200","200,","2}})","400)","400,","500)}))","500,","6))\"},","6},","6}}","::mw/coerc","::ping","::ping)","::plu","::plus)",":a",":bodi",":body.",":body]}}",":coercion",":error",":figwheel",":form",":get",":get,",":handler",":header",":in",":middlewar",":name)))",":paramet",":parameters}]",":path",":post",":print",":problems))",":queri",":query,",":query}",":reitit.coercion/request",":reitit.coercion/respons",":request",":respons",":result",":schema,",":type",":uri",":valu",":x)",":y",":y)",":z))]",";","=>",">",">>","[\"/api\"","[\"/ping\"","[\"/plus\"","[\"/plus/:z\"","[(exception/cr","[::mw/coerc","[:request","[:respons","[]","[_]","[except","[parameters]}]","[printer","[rrc/coerc","[status]","[total","[x","[{:key","[{{{:key","\\\"abba\\\"))\"},","^^","^^^^^^","access","actual","against","also,","and/or","anything,","app","app)","appli","apply.","attach","basic","below","bodi","both","chain","clojure.spec","code","coerc","coerced.","coercer","coercion","coercion,","coercion.","coercion/coerc","coercion])","compil","construct","contain","current","data","data.","defin","defined,","defined.","defined:","detail","doesn't","done:","enabl","endpoint","error","errors,","ex","exampl","except","exception/default","exception])","explain","expos","expound","expound])","fail","false})","follow","full","guide.","handler","handler/middlewar","here'","http","implement","int","int?","int?,","int?}}","int?}}}","invalid","inventoried.","it'","itself","key","key.","malli","map","method","middlewar","middleware:","middleware]}})))","models.","modules:","mount","multipl","name","need","normal","optim","param","paramet","params]}}","plu","pluggabl","plumat","po","pos?","positiveint","positiveint)\"},","positiveint}}}","pretti","print","printer","problem","protocol","queri","r])","read","reitit","reitit,","reitit.coercion.malli/coercion","reitit.coercion.schema/coercion","reitit.coercion.spec/coercion","reitit.coercion/coercion","reitit.ring.coercion:","request","request))))","request.","request:","request]","respons","response:","response]","ring","ring,","ring])","rout","route.","router","router,","routes:","rrc/coerc","rrc])","rule","s/int","s/int}","s/int}}","s])","satisfi","schema","schema.","schema:","scope","ship","singl","sourc","spec","specs?","statu","status)]","step","supported:","theme,","thing","total}}))})","total}}))}}]]","transform","type","under","us","used:","valid","valu","value.","within","without","x","y)}})}}]","y]}","{\"x\"","{200","{:bodi","{:coercion","{:data","{:get","{:i","{:middlewar","{:name","{:paramet","{:queri","{:reitit.coercion/request","{:request","{:schema","{:statu","{:theme","{:total","{:uri","{:x","{:z"],"ring/route_data_validation.html":["\"/api/internal/users\"})","\"forbidden\"}","\"ok\"}","\"ok\"})","#{:admin","#{:admin}}}]]","#{:admin}}}]]]","#{:manager}","#{:manager}}","#{:public","#{}))","'[clojure.set","'[clojure.spec.alpha","'[expound.alpha","'[reitit.r","'[reitit.ring.spec","'[reitit.spec","(","(:get,","(and","(app","(def","(defn","(fn","(handler","(if","(let","(not","(println","(requir","(ring/get","(ring/r","(ring/rout","(s/coll","(s/def","(s/key","(seq","(set/subset?","(some","200,","403,","::role","::roles)]","::rs/explain","::zone",":a",":bodi",":data",":delet",":get",":intern",":internal}",":internal})",":into",":manager})",":middlewar",":post",":public",":public}",":req",":spec",":uri",":valid",":wrap",":zone",":zone)]",";",";;",">","[\"/api\"","[\"/api/internal/users\"","[\"/internal\"","[\"/ping\"","[\"/public\"","[\"/users\"","[::zone])","[[\"/api/public/ping\"","[_]","[handler]","[request]","[requir","[roles]","[zone","[{::key","abil","about.","ad","alway","app","around","behavior","cleanli","clojure.spec","common","contribut","core","creation:","data","data:","defin","design,","differences:","dynam","e/expound","e])","effect","endpoint","endpoints.","enforc","etc.)","even","exampl","explicit","extens","fail","fast","feature,","few","fix","flatten","fulli","good:","handler","handler}","handler}]","handler}]]","handler}}]]]","harder","have","here","ignor","implicit","instead","invalid:","key","key.","keyset.","let'","match)","merg","method","mid","middlewar","middleware]}","miss","on:","option","path","power","powerful.","present","present:","problem:","push","qualifi","reason","reitit.ring.spec/valid","reitit.spec/valid","request","request)))))","request))))})","request}]","requir","required)","reus","reuse)","ring","ring])","role","roles)))","roles]","roles]}","roles]}]","roles]}]]","rout","router","router,","routes:","rrs/valid","rrs])","rs])","s/key","s])","separ","set])","silent","simpl","spec","specs.","str})))","support","turn","un","us","valid","validation,","via","work","wrap","zone","zone)","{:data","{:get","{:handler","{:middlewar","{:name","{:request","{:statu","{:valid","{:zone"],"ring/compiling_middleware.html":["\"middlewar","#(respond","%))","%))))","'[buddy.auth.accessrul","'[reitit.spec","(","(:author","(:request","([request","([request]","(accessrules/wrap","(and","(coerc","(coercion/coerc","(coercion/respons","(compiled)","(def","(defn","(fn","(handler","(if","(let","(records,","(requir","(respons","(ring/get","(s/def","(s/key","(s/or","(when","50%","::author","::coerc","::rs/respons",":a",":accessrules/handl",":accessrules/rule))",":author",":coercion",":coercion)",":compil",":compile.",":data",":handler",":opts)]",":req",":respons",":responses)",":result",":rule",":spec",":wrap",":wrap.",";;","=>",">","?intomiddleware.","[::authorize])","[coercer","[coercion","[handler]","[method","[respons","[rout","[rule","[rule]}))","[rule]}))))})","[{:key","_opts]","`reitit.coercion/coercion`","abov","access","accessrules])","actual","approaches,","associ","author","below","better.","but,","case","chain,","closur","code,","coerc","coercer","coercion","coercion.","compil","considered,","creation","data","data)]","data,","decid","defin","demonstr","done","dynam","e.g.","each","easi","easier","empti","enabl","enforc","etc.)","everyth","exact","exampl","expect","express","extend","extens","extract","fast","faster","faster.","function","handler","however,","inform","instead","intended.","it'","it?","itself","key","key.","keys,","know","less","link","local","lookup","map","map,","match","mean","method","middlewar","middleware/interceptor","missing,","mount","mount.\"","mounted,","much","nil","nil.","normal","nothing.\"","opt","optim","opts)]","opts]","otherwis","part","pass","pluggabl","process","processing.","provid","raise))))))","raise)))))))})","raise]","read","reason","reasoning:","record","relev","request","request)","request)))","request.","requir","respond","respons","response))","response)))","responses)","responses]}","return","ring","role","rout","router","rs])","rule","runtim","shape","spec","spec)","specif","still","system.","time","time.","to,","transform","two","type","un","us","validation.","via","want","want,","way","without","wrap","written","yield","{:name","{:rule","{}))})","{}."],"ring/swagger.html":["\"/\"","\"/\"}","\"/\"})","\"/api","\"/api/pong\"","\"/one","\"/one/ping\"","\"/one/swagger.json\"}","\"/swagger.json\"","\"/swagger.json\"})","\"/two/deep/ping\")","\"/two/ping\"","\"/two/ping\")","\"/two/swagger.json\"}","\"0.5.5\"]","\"2.0\"","\"download","\"image/png\"}","\"mi","\"ping\"})}]","\"ping\"})}])","\"plu","\"pong\"})}]]","\"reitit.png\"))})}}]]","\"server","\"swagger","\"upload","#'app","#{::one","#{:reitit.swagger/default}","&","'[reitit.r","'[reitit.swagg","(","(\"/common/ping\"","(+","(:requir","(:tags,","(app","(constantli","(def","(defn","(fn","(io/input","(io/resourc","(jetty/run","(keyword","(n","(println","(requir","(ring/creat","(ring/r","(ring/rout","(swagger","(swagger/cr","(without","...","/api","/examples/r","/swagger.json","0..n","2","2.2.10.","2.x","200","200,","3","3.x,","3000\"))","3000,","4",":","::one","::one}}","::two","::two}}","::two}}}",":a",":basepath",":basepath)",":bodi",":body}",":config",":descript",":get",":get,",":handler",":header",":id",":id].",":join?",":middlewar",":multipart}",":muuntaja",":no",":paramet",":parameters}]",":path",":post",":produces,",":query}",":respons",":root",":summari",":summary,",":swagger",":tag",":uri",":url",":x",":y",";",";;",";{:statu",">","[\"\"","[\"/api","[\"/deep\"","[\"/download\"","[\"/files\"","[\"/math\"","[\"/one","[\"/one\"","[\"/ping\"","[\"/plus\"","[\"/pong\"","[\"/swagger.json\"","[\"/two\"","[\"/upload\"","[\"files\"]}}","[\"image/png\"]}","[\"math\"]}}","[:swagger","[;;","[[\"/api\"","[[\"/common\"","[[\"/swagger.json\"","[]","[_]","[clojure.java.io","[file]}","[metosin/reitit","[muuntaja.cor","[reitit.coercion.spec]","[reitit.r","[reitit.ring.coercion","[reitit.ring.middleware.except","[reitit.ring.middleware.multipart","[reitit.ring.middleware.muuntaja","[reitit.ring.middleware.paramet","[reitit.swagg","[ring.adapter.jetti","[ring.middleware.param","[x","[{{{:key","accept","act","actual","ad","annot","anoth","api","api\"}","apis.","app","application.","apply.","argument","bodi","boolean","both","classpath.","clojur","clojure.","clojure.spec","clojurescript","coerc","coercion","coercion/coerc","coercion]","collect","complet","configur","content","contribut","correctli","creat","currently,","custom","data","data,","data.","decod","default","defin","definitions,","descript","display","doc","docs\"","docs\"})))","docs/*\"","docs/index.html\"})","docs:","document","documentation,","downgrad","each","easili","easy,","enabl","encod","endpoint","endpoint,","endpoint.","endpoints.","etc.","exampl","example.serv","except","exception/except","exception]","exceptions,","exclud","explicitli","extract","false})","feature,","file","file\"","file}})}}]","follow","form","format","formatter.","gener","hander","handl","handler","handler))))","handler)}]","handler)}]]])))","handler)}}]","handler)}}])","handler)}}]])","handler.","handler:","host","http://localhost:3000","http://spec.commonmark.org/","id","identifi","includ","index","input","int?,","int?}}","int?}}}","integr","interact","interceptor","interceptor.","interest","interfac","io]))","is.","it'","jetti","jetty]","key","keys)","keys.","keyword","keywords)","keywords.","level","long","m/instanc","m]","macchiato","make","map","method","metosin/r","middlewar","middleware]}})","miss","modul","module.","more","mount","multipart","multipart/multipart","multipart/temp","multipart]","multipl","muuntaja/format","muuntaja]","name","need","negoti","negotiation,","new","next","normal","note","note:","now","on.","option","options:","out","outsid","page,","param","paramet","parameter,","parameters\"","parameters/paramet","parameters]","params]","part","particip","part}}","part}}}","pass","path","ping","port","post","pr!","pre","prefix","process","project","queri","real","reitit","reitit.coercion.spec/coercion","reitit.swagg","reitit.swagger.swagg","reitit.swagger/cr","render","request","resourc","respons","responses,","return","ring","ring]","ring])","root,","rout","route,","route]","route]]","route]])))","router.","router:","rule","run","s/any}}","same","schema","scope","see","separ","sequenc","serv","set","short","show","simpl","slash","slash)","spec","spec,","spec:","specif","specification,","specification.","specification:","start","store","stream","string","summari","support","swagger","swagger.","swagger2","swagger]","swagger])","tag","take","thank","thing","time","to.","todo","too.","tool","tools.","top","trail","tri","true","true}","turn","two","two\"","two/swagger.json\"}","type\"","ui","ui\"","ui,","ui.","ui/creat","ui:","ui]","ui])","under","unnam","us","use,","user","valid","valu","version","via","visual","want","way","webjar","welcom","whole","wildcard","with:","within","work","world","wrap","x","y)}})}","y)}})}}]]]","y]}","{\"/api/ping\"","{\"content","{200","{:bodi","{:coercion","{:data","{:file","{:get","{:id","{:info","{:multipart","{:no","{:path","{:port","{:post","{:produc","{:queri","{:request","{:schema","{:statu","{:summari","{:swagger","{:tag","{:titl","{:total","{:x","{}}","{}}}}}"],"ring/RESTful_form_methods.html":["\"_method\"","\"_method\"])","\"_method\"]))))","\"delete\"","\"get\"","\"patch\"","\"post\"","(:request","(=","(and","(assoc","(def","(defn","(fn","(get","(handler","(hidden","(if","(keyword","(note:","(or","(pioneer","(reitit.ring/cr","(reitit.ring/r","(reitit.ring/rout","...)","::wrap",":form",":multipart",":post",":request",":wrap",";;","[:form","[:multipart","[fm","[handler]","[reitit.ring.middleware.parameters/paramet","[request]","appli","applic","befor","browser","come","data","default","design","do","don't","field","field.","fm))","form","forms.","given","handler","handler)","here","hidden","insid","look","lot","map","match","method","method.)","method]})","middlewar","need","out","param","pattern","place","rails)","reitit","reitit.ring.middleware.multipart/multipart","reitit.ring/handler.","replac","request","request))","request))))})","request))]","request,","rest","rout","solv","specif","submit","support","swap","this:","us","whatev","wrap","wrapper","wrong","{:middlewar","{:name"],"http/interceptors.html":["\"\",","\"/\"})","\"/api/number\"})","\"0.5.5\"]","'[reitit.http","'[reitit.interceptor.sieppari","'[reitit.r","(app","(def","(defn","(fn","(fnil","(http/ring","(http/router","(requir","(ring/creat","(select","(updat","+","0)","03","08","1)]}","10)]","100)]","111}}","200","200,","404,",":a",":bodi",":executor",":get",":get,",":handler",":header",":interceptor",":middlewar",":number]",":uri",";",";;","[\"/api\"","[\"/number\"","[(interceptor","[:number])})}}]])","[:request","[ctx]","[metosin/reitit","[number]","[req]","altern","app","basic","build","chain","chains.","context.","ctx","data","default","details.","differences:","enqueu","exampl","execut","executor","extra","features.","handl","handler","handler)","have","http","http])","https://quanttype.net/posts/2018","https://www.reddit.com/r/clojure/comments/9csmty/why_interceptors/","implement","instead","interceptor","interceptors.html","interceptors?","key","librari","match","method","middleware.","modul","number))})","option","optionally,","package.","pedest","reitit","reitit.http/http","reitit.http/rout","reitit.interceptor","reitit.interceptor/executor","req","requir","ring","ring])","rout","router","same","see","shipped,","sieppari","sieppari/executor}))","sieppari])","simpl","support","top","type","us","{:enter","{:executor","{:interceptor","{:number","{:request","{:statu","{}}"],"http/pedestal.html":["\"0.5.5\"]","#interceptor","&","'[io.pedestal.http","'[reitit.http","'[reitit.pedest","'[reitit.r","(","(coercion,","(context","(context)","(def","(defn","(fn","(fnil","(http/router","(pedestal/replac","(pedestal/rout","(requir","(select","(server/cr","(server/default","(server/dev","(server/start))","(updat","+","0)","1","1)]}","10)]","100)]","2","200","3000","::server/join?","::server/port","::server/rout",":a",":bodi",":error",":get",":handler",":jetti",":number]",";",";;",">","[\"/api\"","[\"/number\"","[(interceptor","[:number])})}}]])","[:request","[]}","[ctx]","[io.pedestal/pedestal.jetti","[io.pedestal/pedestal.servic","[metosin/reitit","[number]","[req]","altern","ariti","async","backend","backslashes.","be","both","class","clojur","clojure.","clojurian","coercion","common","compar","compat","complet","conflict","ctx","currently,","custom","data","default","defined.","discuss","doc","enabled:","engin","etc.)","even","exampl","except","exception).","fals","faster.","first","fix","framework","frontend.","full","guide.","handl","handler","http])","https://github.com/metosin/reitit/tree/master/examples/pedest","instead","interceptor","interceptors)","interceptors,","interceptors:","key","known","last","minimalist","model,","model.","more","mostli","number))})","on","out","paramet","pedest","pedestal'","pedestal.","pedestal])","problem","provid","read","reitit","reitit,","reitit.http.interceptors.exception/except","req","resolution.","ring])","rout","router","router.","routes)))","routing.","routing?","server)","server])","sieppari","simpl","slack.","spec","support","swagger","swagger.","swap","sync","syntax,","take","trail","us","validation.","web","welcom","{::server/typ","{:enter","{:interceptor","{:statu"],"http/sieppari.html":["\"","\"/api/ping\"}","\"/api/ping\"})","\"0.5.5\"]","\"enter","\"leav","\"pong\"}","\"pong\"}))","&","'[reitit.http","'[reitit.interceptor.sieppari","(app","(def","(defn","(deref","(fn","(futur","(http/ring","(http/router","(let","(println","(promise)]","(requir","1000","200,","::timeout))",":a",":api",":api)]}",":bodi",":get",":get)]",":get,",":handler",":leav",":ping",":ping)]",":uri",";=>",";enter",";leav","[\"/api\"","[\"/ping\"","[(i","[_]","[ctx]","[metosin/reitit","[respond","[x]","app","async","attach","batteri","both","chains.","clojure,","code:","coercion","compil","core.async,","ctx)","ctx)})","default","exampl","example,","execut","fast","handler","handler}}]])","http","http,","http])","https://github.com/metosin/reitit/tree/master/examples/http","implement","interceptor","interceptors,","manifold","method","model,","need","new","nil)","pluggabl","promesa.","reitit","reitit.interceptor.sieppari/executor","respond","ring","router","same","seamlessli","share","sieppari","sieppari.","sieppari/executor}))","sieppari])","simpl","support","support:","swagger","sync","synchron","together.","us","work","x)","{:enter","{:executor","{:interceptor","{:request","{:statu"],"http/default_interceptors.html":["\"0.5.5\"]","[metosin/reitit","action:","app","content","default","exampl","except","handl","https://github.com/metosin/reitit/blob/master/examples/http","interceptor","interceptors.","middleware,","multipart","negoti","paramet","reitit.http.interceptors.exception/except","reitit.http.interceptors.multipart/multipart","reitit.http.interceptors.muuntaja/format","reitit.http.interceptors.parameters/paramet","request","respons","ring","see","swagger/src/example/server.clj."],"http/transforming_interceptor_chain.html":["\"/api/ping\"})","\"0.5.5\"]","#(interleav","%","'[reitit.http","'[reitit.interceptor.sieppari","(actually,","(app","(def","(defn","(fn","(fnil","(http/ring","(http/router","(interceptor","(interceptor/transform","(repeat","(requir","(select","(uncom","(updat","1)","1]}}","2","2)]}","200","200,","3","3)]","3]}}",":a",":bodi",":debug",":debug)))})",":debug]}}",":get,",":handler",":message]",":reitit.interceptor/transform",":uri",";","[\"/api\"","[\"/ping\"","[(interceptor","[1","[3","[:message])})","[:request","[])","[ctx]","[message]","[metosin/reitit","[req]","add","app","appli","applic","between","butlast","chain","chain,","clojure.core/revers","compil","conj","console.","context","ctx","diff","diffs):","each","effect","endpoint.","exampl","extra","first","follow","function","handler","handler,","handler}}]]","handler}}]])","helper","http","http])","https://github.com/metosin/reitit/blob/master/examples/http","https://github.com/metosin/reitit/blob/master/examples/pedest","interceptor","interceptor.","interceptors.","interleav","it,","key","last","make","message))})","method","new","note:","option","option:","out","output:","pedestal:","per","print","put","reitit.http.interceptor.dev/print","reitit.http.interceptors.dev/print","reitit.interceptor/transform","req","rest","return","revers","reverse)})","router","router):","sampl","see","sieppari/executor}))","sieppari:","sieppari])","swagger/src/example/server.clj","transform","transformation,","underli","unreachable.","us","usual","valu","vector","{::interceptor/transform","{:enter","{:executor","{:get","{:interceptor","{:messag","{:request","{:statu"],"frontend/basics.html":[":paramet","addit","allow","attach","basic","break","browser","built","chang","code","coerc","coercer","coercion","compil","console.warn","control","core","default.","due","easi","enabled,","enabled.","error","errors.","event","extens","featur","few","frontend","function","functions:","hash","histori","html","includ","instead","integr","javascript,","layers:","log","match","multipl","name","name!","next","option","orient","origin","param","paramet","parameters.","pars","path","prevent","property,","property.","provid","queri","react","read","regardless","reitit","reitit.frontend","router","same","state","store","string,","throw","uri","us","version","wrap","wrapper"],"frontend/browser.html":["\"about\"]","\"false\"","\"reitithandleclick\"))))})","#.","(.","(.back","(.go","(and","(fn","(gobj/get","(i.e.","(index.html).","(not=","(rfe/href","(rfe/start!","(rfh/ignor","1)","::about)",":data",":ignor",";;","[:a","[router","add","addit","allow","alway","anchor","anyway","api","api:","applications,","back","browser","call","calls.","chang","check","click","click?","control","correct","current","data","dataset","default","directli","disabl","doesn't","downsid","e","easi","el","el)","entri","event","events.","exampl","example.","fals","false}","file","follow","forwards,","fragment","fragment,","frontend","function","go","handl","handler","handling:","histori","history.","href","html5","i.e.","includ","instanc","integr","integrations.","js/window.histori","js/window.history)","know","leav","load)","logic","logic,","look","make","manag","manipul","match","mean","modifi","need","never","normal","normal,","page","part","pass","previou","provid","push","reitit","reitit.frontend.easi","replac","request","requir","respond","return","ring","rout","route,","router","rules).","server","server.","simpl","singl","somewher","stack,","state","store","top","tree","two","uri","uri)","uri]","url","us","without","work:","wrapper","{:href","{:use"],"frontend/controllers.html":["\"item","\"root","&","(","(:control","(:requir","(also","(assoc","(atom","(def","(defn","(defonc","(e.g.","(fn","(get","(js/console.log","(mayb","(n","(rfc/appli","(rfe/start!","(swap!","(when","...])","/item/someth","/item/something,",":a",":control",":id)))",":id)))}]}]",":id]))",":path",":start",":stop",">","[\"/\"","[\"/item/:id\"","[:id]}","[:path","[]","[_]","[item","[match]","[new","[old","[parameters]","[reitit.frontend.control","[reitit.frontend.easi","[{:param","[{:paramet","[{:start","ad","add","affect","again.","all,","altern","alway","api","appli","applic","arbitrari","authent","automat","bad","befor","both","call","callback","chang","change.","changes.","check","code","code,","concaten","consid","contain","control","controller,","current","data","declar","declaration,","describ","differ","disabl","done","done).","done,","done.","easi","else,","else.","elsewher","enabl","enter","even","event","example.","example:","exit","first","frame","frontend.cor","full","function","function,","functions,","get","graphql","handler).","https://github.com/metosin/reitit/tree/master/examples/frontend","id))","id))}]}]]","id]","ident","implement","init!","initi","isn't","item","keechma","last","leav","left.","load","logic","manual","map","match","match)","match))))))))","match,","match]","merged.","miss","navig","need","nest","new","next,","nil))","nil.","old","out","param","paramet","per","possibl","prevent","previou","properties:","query)","re","reinitialized:","reitit.frontend.controllers/appli","reitit.frontend.easy:","rememb","request","requir","resolv","resourc","resources,","resources.","return","rfc]))","rfe]","root","rout","route,","router","run","same","see","server.","set,","similar","solut","someth","start","start\"","start\"))}]}","started.","state","statu","stay","stop","stop\"","take","them.","time","tip","to:","tree,","tree:","tri","unauthent","until","updat","url","us","user","value,","value.","vector.","way","whenev","whole","work","yet.","{:control","{:path"],"advanced/configuring_routers.html":["#{:bracket","#{route}}","()","(data)","(default",":coerc",":colon})",":compil",":conflict",":data",":except",":expand",":path",":rout",":router",":spec",":syntax",":valid","=>","[])","actual","arg","avail","base","clojure.spec","coerc","compil","configur","conflict","creation","data","data,","definit","descript","effect","except","expand","follow","function","handl","handler","implement","initi","key","keyword","nil","opt","option","options.","overrid","paramet","path","reitit.core/expand)","reitit.core/router:","reitit.exception/exception)","reitit.spec","resolv","result","return","rout","route,","router","see","set","side","syntax","throw","time","us","valid","via","{rout","{})"],"advanced/composing_routers.html":["\"/\"","\"/\"))]","\"/avaruus\"","\"/avaruus\"}]","\"/beers/lager\")","\"/beers/sahti\")","\"/beers/saison\")","\"/dynamic\"","\"/dynamic/duo\"","\"/dynamic/duo\")","\"/gin/napue\")","\"/kerran/*\"","\"/kerran/avaruus\"}","\"/olipa/*\"","\"/olipa/iso/kala\"}","\"/olipa/kerran/avaruus\")","\"/olipa/kerran/avaruus\"}","\"/olipa/kerran/iso/kala\")","\"/vodka/russian\")","\"avaruus\"}","\"beer\"","\"bock\"])","\"duo\"","\"kerran/avaruus\"}","\"kerran/iso/kala\"}","\"sahti\"","#object[...]","#object[...]}","#object[reitit.core$lookup_router]}","#object[reitit.core$mixed_router]}","#object[user$reify__24359]}]]","#reitit.core.match{:templ","'[clojure.str","'[compojure.cor","'[reitit.cor","(","(:templat","(add","(app","(appli","(atom","(comp","(con","(constantli","(context","(creat","(def","(defn","(deref","(for","(if","(into","(keyword","(let","(list","(map","(mapv","(merg","(name","(nested)","(r/match","(r/option","(r/rout","(r/router","(rand","(recurs","(reifi","(request","(requir","(reset","(reset!","(some","(str","(str/last","(sub","(swap!","+","/:this/should/:fail","/baz/:id/:subid","/beers/sahti","/beers/saison","/ciders/weston","/dynamic/duo","/gin/napu","/saison","100)))]))))","12000n","20000n","23ns.","40n","440n","600n","::bar]]))","::baz]]))","::fail]])","::foo]","::route1])","::route2])","::route3])))",":a",":avaruus]",":avaruus}",":beer",":beer/bock}]",":beer/lager}]",":beer/sahti}]",":ciders]",":ciders}]",":coerc",":compil",":conflict",":data",":data))))",":duo",":duo)))",":duo55]",":duo71]",":dynam",":dynamic,",":expand",":get})",":ihminen]])}]])}]]))",":kerran",":lager]",":lager]])))",":makkara]",":name",":napue]",":napue}]",":olipa",":olut]",":path",":ping]",":refer",":request",":result",":router",":router)]",":saison]",":saison]])",":user/bar}]",":user/bar}]]",":user/baz}]]",":user/foo}]",":user/route1}]",":user/route2}]",":user/route3}]]",";",";#match{:templ",";[#reitit.core.match{:templ",";[:beer/sahti]",";[[\"/foo\"",";[[\"/gin/napue\"",";[[\"/route1\"",";compilerexcept",";{:lookup",">",">>","@router","@router)","[\"/bar/:id\"","[\"/baz/:id/:subid\"","[\"/beers\"","[\"/beers/*\"","[\"/beers/bock\"","[\"/beers/lager\"","[\"/beers/sahti\"","[\"/ciders/*\"","[\"/duo\"","[\"/dynamic/*\"","[\"/ihminen\"","[\"/kerran/*\"","[\"/makkara\"","[\"/olipa/*\"","[\"/route1\"","[\"/route2\"","[\"/route3\"","[\"lager\"","[&","[(str","[:beer","[:dynam","[:napue]","[:olipa","[[\"/:this/should/:fail\"","[[\"/avaruus\"","[[\"/baz/:id/:subid\"","[[\"/foo\"","[[\"/gin/napue\"","[[\"/lager\"","[[\"/olut\"","[[\"/ping\"","[[\"/saison\"","[]","[_]","[beer","[beers]","[context])","[match","[router","[submatch","[subpath","[subrout","above,","achiev","ad","add","against","ahead","allow","and/or","anyth","app","applied,","approach","around","atom:","avoided.","background,","beer","beer)","beer)])]","beers)))","beers:","beers]","below","benchmark","better","both","can't","cases,","cases.","catch","chains.","chang","changed.","changed:","choice.","clojure.lang.exceptioninfo:","clojure.lang.ideref","compar","compil","compojur","compojure.","compojure:","compos","conflict","constant","contain","core","correctly?","cost.","creat","created,","creation","data","data,","data:","database.","deepli","didn't","disabled,","doesn't","don't","driven","dynam","each","effect","embed","entri","exampl","expected:","expos","extra","faster.","faster?","first,","fulli","function","gave","generation,","have","helper","here'","hook","immut","implement","includ","index","insert","instead","int","interceptor","invalid","it'","it:","key","key,","key.","let'","level","level,","lookup","lookups:","magnitud","make","match","match)","match))))","match,","matches.","matches:","mayb","merg","method","middlewar","modifi","more","much","multipl","name","need","nest","nester","nesting/composition.","new","nil","nil)))","non","normal","not...","now","ns","on","onc","one:","ones,","option","option.","options.","options:","order","origin","over","param","parameter.","path","path)","path)]","path.","path:","path]","paths:","perform","performance.","previou","protocol","queri","quick","r/option","r/options.","r/rout","r])","re","recreat","recurs","recursive,","refer","references:","reitit","reitit.core/merg","request.","request:","reset","resolution:","resolv","return","ring","root","rout","route.","route:","router","router!","router)","router)))","router,","router2","router2)","router:","routers))","routers))))","routers,","routers.","routers:","routers?","routers]","router}]","router}]]))","routes)","routes,","routes.","routes:","routes]","routing,","rule","saison!?","second,","see","separ","slower","slower,","slowest","small","so,","specs,","static","static.","str])","submatch)))","subpath)]","subrout","subrouters.","such","support","sure.","swap","system","that,","that?","then,","this,","through","time","time)","time,","time.","todo","too.","top","tree","tree:","trivial","two","type","under","understand","updat","us","valid","vector","via","walk","wanted,","we'll","whole","work","works:","wrap","{:","{:name","{:uri","{}"],"advanced/different_routers.html":["'[reitit.cor","(def","(r/router","(requir","::ping]","::users]]","::users]]))",":a",":linear",":lookup",":mix",":quarantin",":router",":singl",":trie",";","[\"/api/:users\"","[[\"/ping\"","ask","base","catch","configur","conflict","conflicts.","contain","creat","descript","differ","expand","fast","faster","found.","function","hash","implement","implementation.","implementation:","inspect","lookup","manual","match","much","name","non","on","optim","option,","origin","out","overrid","paramet","path","pedest","protocol,","r/linear","r])","reitit","resolv","rout","route.","router","router)","router,","router:","routers.","routers:","router}))","routes.","search","see","select","set","sever","ship","slow,","start","static","string","suitabl","super","table.","top","trees.","trie","two","until","us","valid","wildcard","work","{:router"],"advanced/route_validation.html":["\"/\"))","\"/\")))","\"/\"))))","\"0.4.0\"]","\"tenant1\"","#'reitit.core/rout","%","%)","'[clojure.spec.alpha","'[clojure.spec.test.alpha","'[expound.alpha","'[reitit.cor","'[reitit.spec","'[reitit.spec])","(*","(?","([\"/api\"","([...","(and","(blank?","(cat","(clojure.core/fn","(clojure.core/or","(clojure.spec.alpha/*","(clojure.spec.alpha/?","(clojure.spec.alpha/and","(clojure.spec.alpha/cat","(clojure.spec.alpha/col","(clojure.spec.alpha/nil","(clojure.spec.alpha/or","(clojure.string/blank?","(clojure.string/start","(def","(fn","(nilabl","(or","(r/router","(requir","(s/explain","(s/valid?","(set!","(start","(stest/instru","...","...])","2","::spec/raw","::tenant1])",":a",":arg",":child",":clojure.spec.alpha/spec",":clojure.spec.alpha/valu",":dev",":into",":path",":path]",":reitit.spec/arg)",":reitit.spec/path",":reitit.spec/path:",":reitit.spec/raw",":rout",":user/tenant1",":user/tenant1]",";","[\"/api\"","[\"/ping\"]","[\"/public\"","[\"pong\"]]])","[\"tenant1\"","[%]","[...","[0]","[1]","[:rout","[:routes]","[]))","[expound","^^^^^^","`reitit/router)","add","argument","at:","bootstrapping:","call","clojure.core/string?","clojure.lang.exceptioninfo:","clojure.spec","compilerexcept","conform","contain","db","db)","definit","depend","detect","develop","error","exampl","expound","expound/printer)","expound])","fail","fals","first","function","go:","higher","in:","instrument","namespac","options.","out*","predicate:","pretti","print","problems.","r])","raw","readi","reitit.core/rout","reitit.spec","relev","rout","route))))","route:","router","routes,","routes:","s/*explain","s])","satisfi","spec","spec:","spec])","stest])","time","to:","tool","us","val:","valid","with?"],"advanced/dev_workflow.html":["!","\"/api/ns2/more/bar\")","\"/api/ns2/more/bar\",","\"/api/ns2/more/bar\"}","#(r/router","'[ns1])","'[ns2])","'[reitit.cor","(:requir","(constantli","(def","(defn","(n","(ns1/routes)]])","(ns2/routes)]","(r/match","(r/router","(requir","(router)","(routes)))","(routes))))",":","::bar","::bar])","::ping]","::ping]])",":a",":data",":ns1/bar",":ns1/bar},",":path",":result",";#reitit.core.match{:templ",";;",";[\"/bar\"",";the","?","[\"/api\"","[\"/bar\"","[\"/more\"","[\"/ns2\"","[\"/ping\"","[[\"/ping\"","[]","[reitit.cor","again","alway","appli","applic","astut","bit","call","chang","consid","contrari","correct,","crude","dev","dev,","development,","development.","differ","dure","dynam","easi","exampl","expect","fast","fix","frankli","full","function","function.","functions.","goal","goe","hit","inde","invocation.","it,","iterations.","let'","mani","match","multipl","name","name]","name])","namespac","namespace,","namespace.","namespaces.","name},","need","new","nil,","notic","now","ns1","ns1)","ns1,","ns1/rout","ns1/routes]])","ns2)","ns2/routes]","ns3)","ns3.","on","onc","order","param","pass","path","perform","possible,","practic","problem","prod","product","production.","queri","quit","r])","r]))","reader","recompil","reitit,","reitit.","reload","replac","requir","result","rout","router","routers,","routes))","sampl","see","slower","small","solut","span","still","sun.","that'","time.","top","tree","tree,","two","under","us","var","want","way","we'll","we'r","whole","without","workflow","{:name","{},"],"advanced/shared_routes.html":["\"/kikka\"","\"/kikka\"}","\"/kikka\"})","\"bar\"})","\"get\"})","\"post\"}","\"post\"})","#?(:clj","#?@(:clj","&","'[reitit.cor","'[reitit.r","(app","(assoc","(declar","(def","(defn","(fn","(if","(in","(keyword?","(mi","(r/expand","(r/match","(r/router","(requir","(ring/r","(ring/rout","(some",".cljc","200,","::bar","::bar]]","::bar]])","::kikka","::kikka)","::kikka]",":a",":bodi",":data",":expand",":handler",":name",":path",":post",":post,",":result",":uri",":user/kikka}",";",";#match{:templ",";;",">","[\"/bar\"","[\"/kikka\"","[:get","[:post","[[\"/kikka\"","[_]","[data","[registry]","app","application,","argument,","backend","backend,","bar","bar})})))","both","both,","clojur","clojurescript,","clojurescript:","common","condit","core","custom","data","data)","data))","default","defin","enabl","expand","file):","files.","first,","frontend","frontend,","function","function.","get","given","handler","kikka","kikka))","kikka}","kikka}])","kikka}])}])","method","multimethod.","multipl","name","need","nil","non","on","option","opts)","opts))))","opts]","param","post","processing,","r])","raw","reader","registri","reitit","reitit.core.rout","reitit.core/expand","request","revers","ring])","rout","router","routes))","routes:","routing.","sequenti","share","tabl","table.","those","us","work","{::kikka","{:expand","{:get","{:handler","{:name","{:request","{:statu"],"performance.html":["\"/auth/login\")))","\"/ping\"})))","\"/workspace/1/1\")))","\"ok\"})])","'[criterium.cor","'[reitit.cor","'[reitit.r","(30x","(a","(app","(ataraxy,","(cc/quick","(constantli","(creat","(def","(defn","(dotim","(let","(matches,","(micro","(or","(per","(r/match","(r/router","(real","(requir","(ring/creat","(ring/r","(ring/rout","(static","(wildcard","(with",")benchmark","+","/api/command/add","1","100","1000)","1000):","1000]","110x","115","130n","16","18","2,5","200,","256","3.2","300","312m","4","50%","50+","500x","6","8.7m","80n",":",":a",":auth/login]",":auth/recovery]",":bodi",":get,",":inject",":lookup",":mix",":request",":segment",":uri",":workspace/page]]))",";;",">","[\"/auth/recovery/token/:token\"","[\"/ping\"","[\"/workspace/:project/:page\"","[[\"/auth/login\"","[_","[app","[options]","`lein","above).","abstract","accur","actual","against.","algorithms,","also,","alway","anoth","api","ataraxi","average,","awesome.","base","baselin","bench","benchmark","benchmark.","best","better","better,","between","bide","bidi,","both","box","busi","but,","cach","cache:","calfpath","can't","card","case,","case.","cc])","chosen","ci","code","compil","compojur","comput","conflict","contain","core","core):","cores:","cqr","creat","creation","data.","default","default,","definit","definitions.","degrade.","depends.","describ","differ","do","don't","dynam","e.g.","effect","enabl","ensur","environment.","error.","errors.","even","exampl","execut","extensions.","fail","fallback","false,","false.","false})]","fast","fast.","faster","faster!","fastest","featur","few","first","flatten","follow","found","framework","full","function","gb","ghz","go","go.","handl","handler","handler)","handler.","have","help","here.","hierarchi","http","hw","i7","idea","identifier:","immut","implementation.","indic","infinit","inject","inlin","intel","interceptor","interceptor)","interceptors,","intern","invok","it'","java","json","jsonista","jvm","kb","kinda","know.","l2","l3","larg","large!","less","lib","librari","libs.","life","life)","life,","linearrouter,","look","lookup","lot","lot.","lupapiste.","macbook","macbookpro11,3","magnitud","magnitude.","manag","map","match","match?","matter","matter?","mb","mean","measur","measure?","memory:","method","mid","middlewar","middleware,","mix","model","modif","more","mount","move","much","multimethod","multipl","mutabl","name:","nano","need","new","nice","nil)]","non","not.","notabl","note:","nothing.","ns","number","ok","on","opensensor","ops/sec","optim","option","options))","order","order.","out","over","paramet","parameters.","path","path)","path.","pedest","pedestal).","perf","perform","performance,","performance.","performance:","pleas","pohjavirta","poke","possibl","precompute/compil","prefix","present.","pro","process","processor","processors:","proof","protocol","pull","quick","quit","r])","radix","rational","re","readme:","real","realistic.","realli","really,","record","regress","reitit","reitit.http/r","reitit.http/rout","reitit.ring/r","remov","repl","repl`","repo","request","request.","rest","rest(ish)","result","revers","ring","ring])","rout","router","router,","router:","router?","routers.","routes,","run","same","sampl","save","scenario","scientif","second","see","serv","set","sets)","setup:","shine","simpl","site","size","slower","slowest","small","snappi","so,","someth","speed:","stabl","stack","start","static","static,","still","style","swagger","tabl","take","taken","techempow","ten","test","test).","test,","tests,","tests.","thank","thing","three","time","time,","tip","todo","total","tree","tree),","tree,","tree.","trees,","tri","trie","trust","two","unmount","us","usual","view","want","web","welcome!","well,","wild","wildcard","wildcard,","without","work","write","{:inject","{:request","{:statu","µs","µs."],"development.html":["\"1.0.0\"","#","./scripts/lein","./scripts/set","./scripts/test.sh","break","build","built","bump","chang","changes!","clean,","cli","clj","clojar","deploy","develop","document","g","gitbook","gitbook.","includ","instal","instruct","lein","level","locally:","modul","never","new","npm","patch","preview","promise:","rememb","run","serv","test","up","us","version","version:","versioning.","work"],"faq.html":["\"/\"","\"/api\"","\"/users/:id\"","\"reitit\"?","#reitit","&","(","(click","(clojure)","(context","(def","(defrout","(fn","(get","(human","(ok","(reitit","(simple)","(wrap","30",":","::ping]","::ping}]",":auth/login]",":auth/recovery]",":bodi",":get",":handler",":id))))}",":name",":page",":rout",":secure]]}",":token]",":workspace/page]])",":workspace/page]]]]])",";;",">","[\"/\"","[\"/api\"","[\"/api/ping\"","[\"/auth/recovery/token/:token\"","[\"/pizza\"","[\"/users/:id\"","[\"/workspace/:project","[\"workspace/\"","[[\"/auth/login\"","[[\"auth/login\"","[[\"auth/recovery/token/\"","[[[:project","[[wrap","[]","[id","[parameters]}]","[wrap","[{:key","ad","algorithm.","allow","alreadi","anoth","api","appli","approximation.","apps,","argument","ask","awesome.","base","behav","best","bi","bidi","bidi.","bidi:","bidi?","both","busi","channel","class","clojur","clojure,","clojure.","clojurescript","clojurescript.","clojurian","coercion.","compil","compojur","compojure,","compojure.","compojure:","compojure?","compos","conflict","contribute?","core","data","data,","debug.","decent","destructur","differ","differences:","differently,","direct","discuss","dispatch","driven","driven,","dynam","easi","effect","english","enough","exist","expos","express","extensions.","extra","faq","fast.","faster","featur","felt","first","frequent","frontend","full","fun","function","goal","good","googl","great","guard","hacki","handler}]]])","hard","here","http","icon","ident","identity,","influenc","int?}}}","interceptor","issues.","it'","it.","job","join","keyword","known","left).","lib","librari","library?","log]","machin","macro","main","make","mani","map","maps.","margin","match","micro","mid","middlewar","missing:","mix","modul","module:","mostli","much","multipl","name","need","none","on","optim","order","origin","overal","param","paramet","part","path","pattern","pedest","pedestal,","pedestal:","pedestal?","perfect.","perform","performance.","pizza","pluggabl","post","process","projects.","pronounc","proven","provid","question","rate","readabl","readable)","realli","really,","reitit","reitit,","reitit.","reitit:","relat","represent","representation.","request.","resolut","resolv","ring","roadmap","rout","router","routes,","same","same.","seconds,","separ","ship","similar","slack","so,","source:","speaker","spec","special","specs,","speed","static","still","string","sub","support","syntax","syntax,","syntax.","syntax:","tabl","take","taken","target","terse,","thank","things.","thu","thus,","time","too).","took","translat","tree","trickeri","trivial","us","user","uuid","uuid\"","uuid/:pag","uuid]","verbose.","wildcard","work","works,","written","{:get","{:id","{:middlewar","{:paramet","{:path","{:post"]},"length":47},"tokenStore":{"root":{"0":{"3":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}},"8":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}},"docs":{},")":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},".":{"docs":{},".":{"docs":{},"n":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"1":{"0":{"0":{"0":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"]":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}},"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"}":{"docs":{},"]":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},"}":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},")":{"docs":{},"]":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},")":{"docs":{},")":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},")":{"docs":{},"]":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}},"]":{"docs":{},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}}},"}":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"1":{"0":{"docs":{},"x":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"1":{"docs":{},"}":{"docs":{},"}":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}},"5":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}},"2":{"0":{"0":{"0":{"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"docs":{}},"docs":{}},"3":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},"}":{"docs":{},"}":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}},"]":{"docs":{},"}":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}}},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}},"docs":{}},"3":{"0":{"docs":{},"n":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"docs":{}},"5":{"docs":{},"\\":{"docs":{},"\"":{"docs":{},"}":{"docs":{},"\"":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}},"6":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},":":{"5":{"9":{"docs":{},":":{"5":{"4":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}},"8":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}}},"8":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},")":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.013761467889908258}}}},"]":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415}},"}":{"docs":{},"}":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},"]":{"docs":{},"}":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}},"2":{"0":{"0":{"0":{"0":{"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"docs":{}},"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.005221932114882507},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}},",":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/ring.html":{"ref":"ring/ring.html","tf":0.01565217391304348},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.015625},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.013333333333333334},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.034220532319391636},"ring/static.html":{"ref":"ring/static.html","tf":0.013824884792626729},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.01951219512195122},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.013100436681222707},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.016666666666666666},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.017241379310344827},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"1":{"8":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}},"docs":{}},"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},"]":{"docs":{},"]":{"docs":{},"}":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}}}}},"1":{"1":{"6":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}},"docs":{}},"docs":{}},"2":{"5":{"1":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}},"docs":{}},"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}},"3":{"docs":{},"n":{"docs":{},"s":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"5":{"6":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"docs":{}},"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"}":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}},"}":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}},"]":{"docs":{},"]":{"docs":{},"}":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415}}}}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"]":{"docs":{},"}":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976}}}}},"\"":{"docs":{},"}":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},".":{"2":{"docs":{},".":{"1":{"0":{"docs":{},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"docs":{}},"docs":{}}},"docs":{},"x":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},",":{"5":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"docs":{}}},"3":{"0":{"0":{"0":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}},",":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"\"":{"docs":{},")":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},"8":{"docs":{},",":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.019011406844106463}}}},"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"}":{"docs":{},"}":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}},"1":{"2":{"docs":{},"m":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"docs":{}},"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}},"]":{"docs":{},"]":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415}}},"}":{"docs":{},"}":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"]":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976}}}},".":{"2":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"docs":{},"x":{"docs":{},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"4":{"0":{"0":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},"3":{"docs":{},",":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}},"4":{"docs":{},",":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.022222222222222223},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}},"5":{"docs":{},",":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.013333333333333334}}}},"6":{"docs":{},",":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.013333333333333334}}}},"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}},"4":{"0":{"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"docs":{}},"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}},"5":{"0":{"0":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051}},",":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},")":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"x":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"docs":{},"%":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"+":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"docs":{},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}},"6":{"0":{"0":{"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"docs":{}},"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},")":{"docs":{},")":{"docs":{},"\"":{"docs":{},"}":{"docs":{},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}},"}":{"docs":{},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}},"8":{"0":{"docs":{},"n":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},".":{"7":{"docs":{},"m":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"docs":{}}},"docs":{},"\"":{"0":{"docs":{},".":{"4":{"docs":{},".":{"0":{"docs":{},"\"":{"docs":{},"]":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}},"docs":{}}},"5":{"docs":{},".":{"5":{"docs":{},"\"":{"docs":{},"]":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.020080321285140562},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}},"docs":{}}},"docs":{}}},"1":{"0":{"0":{"docs":{},"\"":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},"}":{"docs":{},"]":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},"}":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}},"docs":{}},"2":{"3":{"docs":{},"\"":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444}},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"}":{"docs":{},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}},"]":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.008680555555555556}},"}":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.008680555555555556}}}}}}},"docs":{}},"docs":{},"\"":{"docs":{},"}":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}},"}":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.009174311926605505}}},")":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}},".":{"0":{"docs":{},".":{"0":{"docs":{},"\"":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}},"docs":{}}},"docs":{}}},"2":{"docs":{},".":{"0":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"docs":{}}},"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112}},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}},"/":{"docs":{},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.004842615012106538}}}}}}}}}},"d":{"docs":{},"b":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},",":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}},"}":{"docs":{},")":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}}}}}}}}}}}}}},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"\"":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"1":{"docs":{},"\"":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}},"}":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}},"2":{"docs":{},"\"":{"docs":{},"}":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}},"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.004842615012106538}},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}},"}":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976}}}}}}}},"l":{"docs":{},"u":{"docs":{},"s":{"docs":{},"/":{"3":{"docs":{},"\"":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795}}}},"docs":{}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"1":{"docs":{},"\"":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.013761467889908258}},")":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678}}}},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.009174311926605505}},",":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}},"b":{"docs":{},"o":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}}}}},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}}}}},"s":{"2":{"docs":{},"/":{"docs":{},"m":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"b":{"docs":{},"a":{"docs":{},"r":{"docs":{},"\"":{"docs":{},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}},"}":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}}}}}}}}}}}}},"docs":{}}}},"\"":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}},"l":{"docs":{},"l":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}},"s":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{},".":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"u":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"\"":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}}}}}}},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}},")":{"docs":{},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}},"h":{"docs":{},"e":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"\"":{"docs":{},")":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175}},")":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},"}":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.017777777777777778}},")":{"docs":{},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},",":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0076045627376425855}}}}},"/":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.019011406844106463}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.015209125475285171}}}}},"/":{"docs":{},"\"":{"docs":{},"}":{"docs":{},",":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.011406844106463879}}}}}}}}},"l":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}},":":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},":":{"docs":{},"u":{"docs":{},"s":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"1":{"2":{"3":{"docs":{},"\"":{"docs":{},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}},"}":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}},"docs":{}},"docs":{}},"docs":{},"i":{"docs":{},"k":{"docs":{},"i":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{},"\"":{"docs":{},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}}}}}}}},"i":{"docs":{},"l":{"docs":{},"\"":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"}":{"docs":{},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}}},"}":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}},"/":{"0":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"1":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"2":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"3":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"4":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"5":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"6":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"7":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"8":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"9":{"docs":{},"?":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"=":{"docs":{},"m":{"docs":{},"%":{"docs":{},"c":{"3":{"docs":{},"%":{"docs":{},"b":{"6":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}}}},"docs":{}}}},"docs":{}}}}}}}}}},"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889}}}}}}}}}}}},"*":{"docs":{},"\"":{"docs":{},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152}}}}},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}}}}},"l":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"/":{"docs":{},"k":{"docs":{},"a":{"docs":{},"l":{"docs":{},"a":{"docs":{},"\"":{"docs":{},"}":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"/":{"docs":{},"a":{"docs":{},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"u":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}},"}":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"/":{"docs":{},"k":{"docs":{},"a":{"docs":{},"l":{"docs":{},"a":{"docs":{},"\"":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},"}":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}}},"t":{"docs":{},"w":{"docs":{},"o":{"docs":{},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"e":{"docs":{},"p":{"docs":{},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},"l":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"s":{"docs":{},"a":{"docs":{},"h":{"docs":{},"t":{"docs":{},"i":{"docs":{},"\"":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}}}}}}},"d":{"docs":{},"y":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"i":{"docs":{},"c":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"/":{"docs":{},"d":{"docs":{},"u":{"docs":{},"o":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}}}}}},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"n":{"docs":{},"a":{"docs":{},"p":{"docs":{},"u":{"docs":{},"e":{"docs":{},"\"":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"a":{"docs":{},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"u":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"}":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}},"i":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{},"\"":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"}":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}}},"v":{"docs":{},"o":{"docs":{},"d":{"docs":{},"k":{"docs":{},"a":{"docs":{},"/":{"docs":{},"r":{"docs":{},"u":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"a":{"docs":{},"n":{"docs":{},"\"":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"s":{"docs":{},"p":{"docs":{},"a":{"docs":{},"c":{"docs":{},"e":{"docs":{},"/":{"1":{"docs":{},"/":{"1":{"docs":{},"\"":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"docs":{}}},"docs":{}}}}}}}}}}}},"o":{"docs":{},"k":{"docs":{},"\"":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}},"}":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},")":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}},"]":{"docs":{},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},":":{"8":{"0":{"8":{"0":{"docs":{},"\"":{"docs":{},"}":{"docs":{},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"8":{"0":{"8":{"0":{"docs":{},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"1":{"2":{"3":{"docs":{},"\"":{"docs":{},")":{"docs":{},")":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}},"}":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}}},"docs":{}},"docs":{}},"docs":{},"{":{"docs":{},"i":{"docs":{},"d":{"docs":{},"}":{"docs":{},"\"":{"docs":{},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}}}}}}}}}}}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}},"m":{"docs":{},"ö":{"docs":{},"l":{"docs":{},"y":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},"]":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"\"":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.01056338028169014},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625}}}}}}}}}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{},"}":{"docs":{},"]":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}}},"u":{"docs":{},"c":{"docs":{},"h":{"docs":{},"\"":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"i":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}}}}},"\"":{"docs":{},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},"}":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.02666666666666667},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.019011406844106463}},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}},")":{"docs":{},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}}},"]":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.015209125475285171}},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}}},"]":{"docs":{},")":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.015209125475285171}}}}}}},",":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},".":{"docs":{},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{},"\"":{"docs":{},")":{"docs":{},"]":{"docs":{},")":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}}}}}}}},"t":{"docs":{},"\"":{"docs":{},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"d":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},"y":{"docs":{},"\"":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},"}":{"docs":{},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},"]":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}}}}}}},"k":{"docs":{},"i":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{},"\"":{"docs":{},")":{"docs":{},")":{"docs":{},"}":{"docs":{},"}":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"/":{"docs":{},"p":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}}}}},"k":{"docs":{},"i":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{},"\"":{"docs":{},"}":{"docs":{},"]":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}}}}}}}}},"o":{"docs":{},"s":{"docs":{},"h":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.013333333333333334}},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889}},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}}}}}}}}}}},"u":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"/":{"docs":{},"a":{"docs":{},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"u":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"}":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"/":{"docs":{},"k":{"docs":{},"a":{"docs":{},"l":{"docs":{},"a":{"docs":{},"\"":{"docs":{},"}":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}}},"q":{"docs":{},"l":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"a":{"docs":{},"h":{"docs":{},"t":{"docs":{},"i":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"t":{"docs":{},"o":{"docs":{},"o":{"docs":{},"\"":{"docs":{},"}":{"docs":{},"]":{"docs":{},"}":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{},"\"":{"docs":{},":":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},"/":{"docs":{},"x":{"docs":{},"m":{"docs":{},"l":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"1":{"docs":{},"\"":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}},"docs":{}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},".":{"docs":{},".":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}}}}}}}}}}}},"p":{"docs":{},"l":{"docs":{},"o":{"docs":{},"a":{"docs":{},"d":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112}},")":{"docs":{},"]":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152}},")":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}},"}":{"docs":{},"]":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}},")":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}}},"s":{"docs":{},"t":{"docs":{},"\"":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259}},"}":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}},"l":{"docs":{},"u":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"\"":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"b":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"e":{"docs":{},"n":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}}},"c":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},"\"":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},")":{"docs":{},")":{"docs":{},")":{"docs":{},"]":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"}":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}},"l":{"docs":{},"s":{"docs":{},"e":{"docs":{},"\"":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}},"g":{"docs":{},"o":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},"e":{"docs":{},"t":{"docs":{},"\"":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},"}":{"docs":{},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}},"e":{"docs":{},"a":{"docs":{},"v":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"\"":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}},"l":{"docs":{},"e":{"docs":{},"t":{"docs":{},"e":{"docs":{},"\"":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"l":{"docs":{},"o":{"docs":{},"a":{"docs":{},"d":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"u":{"docs":{},"o":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"\"":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}}}}},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}},"j":{"docs":{},"a":{"docs":{},"v":{"docs":{},"a":{"docs":{},".":{"docs":{},"l":{"docs":{},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{},"}":{"docs":{},"}":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543}},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"b":{"docs":{},"a":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"\"":{"docs":{},"]":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}},"n":{"docs":{},"y":{"docs":{},"\"":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"}":{"docs":{},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"u":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"}":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"g":{"docs":{},"o":{"docs":{},"t":{"docs":{},"i":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}},"y":{"docs":{},"y":{"docs":{},"y":{"docs":{},"i":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}},"\"":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}},"{":{"docs":{},"\\":{"docs":{},"\"":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"\\":{"docs":{},"\"":{"docs":{},":":{"docs":{},"\\":{"docs":{},"\"":{"2":{"0":{"1":{"9":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}},"(":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}},"n":{"docs":{},"o":{"docs":{},"t":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"p":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"c":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"k":{"docs":{},"\"":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}}}}}}}}}}}}}},"\"":{"docs":{},"?":{"docs":{"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}}}}},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}},"_":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"\"":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.018867924528301886}},"]":{"docs":{},")":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}}}}}}}}},"b":{"docs":{},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"\"":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"a":{"docs":{},"r":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}},"#":{"docs":{"development.html":{"ref":"development.html","tf":0.046153846153846156}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"{":{"docs":{},":":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.012106537530266344},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.013761467889908258},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"s":{"docs":{},"{":{"docs":{},".":{"docs":{},".":{"docs":{},".":{"docs":{},"}":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}},":":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"[":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"$":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{},"}":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"f":{"docs":{},"y":{"docs":{},"_":{"docs":{},"_":{"2":{"4":{"3":{"5":{"9":{"docs":{},"]":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}},".":{"docs":{},".":{"docs":{},".":{"docs":{},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.016877637130801686},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366}},"}":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"}":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"$":{"docs":{},".":{"docs":{},".":{"docs":{},".":{"docs":{},"]":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}},"q":{"docs":{},"u":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"_":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"$":{"docs":{},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"f":{"docs":{},"i":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}},"y":{"docs":{},"]":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541}}}}}}}}}}}}}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"u":{"docs":{},"p":{"docs":{},"_":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{},"}":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"x":{"docs":{},"e":{"docs":{},"d":{"docs":{},"_":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{},"}":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"$":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"r":{"docs":{},"$":{"docs":{},"]":{"docs":{},"}":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"{":{"docs":{},":":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"{":{"docs":{},":":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}}}}}}}}}}}}}}}}},"{":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"}":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}},"}":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"}":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893}},"}":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}},")":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}},"]":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}},"z":{"docs":{},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}},"d":{"docs":{},"b":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}}},"s":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"}":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"}":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667}}}}}}},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"}":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"}":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633}}}}}}}}}}},"p":{"docs":{},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}},":":{"docs":{},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"t":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}}}}}},"}":{"docs":{},")":{"docs":{},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"}":{"docs":{},"}":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}}}}}},"(":{"docs":{},"s":{"docs":{},"l":{"docs":{},"u":{"docs":{},"r":{"docs":{},"p":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"v":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}}}}}}}}},":":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{},"{":{"docs":{},":":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"'":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}}}}}}},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"{":{"docs":{},":":{"docs":{},"s":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"p":{"docs":{},"o":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"{":{"docs":{},".":{"docs":{},".":{"docs":{},".":{"docs":{},"}":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}},"}":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}},":":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}}}},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}},"?":{"docs":{},"(":{"docs":{},":":{"docs":{},"c":{"docs":{},"l":{"docs":{},"j":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}}}},"@":{"docs":{},"(":{"docs":{},":":{"docs":{},"c":{"docs":{},"l":{"docs":{},"j":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}}}}}}},"&":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.013333333333333334},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"'":{"docs":{},"(":{"docs":{},")":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}},"[":{"docs":{},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}},".":{"docs":{},"s":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},"]":{"docs":{},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}}},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},"]":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}}}}}}}}}}}}},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"j":{"docs":{},"a":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"]":{"docs":{},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}}}}}}},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},".":{"docs":{},"s":{"docs":{},"i":{"docs":{},"e":{"docs":{},"p":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"a":{"docs":{},"d":{"docs":{},"a":{"docs":{},"p":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}}}},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}}}}},"e":{"docs":{},"t":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}},"t":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{},"u":{"docs":{},"m":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333}}}}},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}}}}}},"m":{"docs":{},"u":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"j":{"docs":{},"a":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}}}}}},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}}}},"b":{"docs":{},"u":{"docs":{},"d":{"docs":{},"d":{"docs":{},"y":{"docs":{},".":{"docs":{},"a":{"docs":{},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},".":{"docs":{},"a":{"docs":{},"c":{"docs":{},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"o":{"docs":{},".":{"docs":{},"p":{"docs":{},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{},".":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}}}}}}}}},"n":{"docs":{},"s":{"1":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.01272264631043257}}}}},"2":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}}}}},"docs":{}}}},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}},"e":{"docs":{},"m":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},")":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}}}}}}}}}},"(":{"3":{"0":{"docs":{},"x":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"docs":{}},"4":{"0":{"4":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}},"docs":{}},"docs":{}},"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.009174311926605505},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.014360313315926894},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.01263157894736842},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},":":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}},"i":{"docs":{},"d":{"docs":{},")":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}}}}}}}}}}}}}}}}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}},"i":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}},"u":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}}}}},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{},"s":{"docs":{},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}},"a":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"p":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/ring.html":{"ref":"ring/ring.html","tf":0.01565217391304348},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.044444444444444446},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.034220532319391636},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.007832898172323759},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"l":{"docs":{},"i":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}},"n":{"docs":{},"d":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}},"s":{"docs":{},"s":{"docs":{},"o":{"docs":{},"c":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}},"l":{"docs":{},"l":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},"s":{"docs":{},"o":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"f":{"docs":{},"f":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}}}}}},"c":{"docs":{},"t":{"docs":{},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"y":{"docs":{},",":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"/":{"docs":{},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}}}}}}}}}}},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"x":{"docs":{},"y":{"docs":{},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},"d":{"docs":{},"d":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}},"e":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},")":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{},"/":{"docs":{},"*":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.009828009828009828}}},"?":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.009828009828009828}}},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.012285012285012284}}}}},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.009828009828009828}}}},"o":{"docs":{},"l":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}},"n":{"docs":{},"i":{"docs":{},"l":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.009828009828009828}}}}},"o":{"docs":{},"r":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"b":{"docs":{},"l":{"docs":{},"a":{"docs":{},"n":{"docs":{},"k":{"docs":{},"?":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.007371007371007371}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.007371007371007371}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"f":{"docs":{},"n":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"o":{"docs":{},"r":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}},")":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"i":{"docs":{},"c":{"docs":{},"k":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}},"t":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}},"q":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}},"u":{"docs":{},"r":{"docs":{},"r":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}},"e":{"docs":{},"!":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}},",":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}},"r":{"docs":{},"e":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},".":{"docs":{},"c":{"docs":{},"l":{"docs":{},"j":{"docs":{},":":{"4":{"7":{"3":{"9":{"docs":{},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"j":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"l":{"docs":{},"i":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.02666666666666667},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.034220532319391636},"ring/static.html":{"ref":"ring/static.html","tf":0.018433179723502304},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},")":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}},"m":{"docs":{},"p":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"d":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}}},"c":{"docs":{},"/":{"docs":{},"q":{"docs":{},"u":{"docs":{},"i":{"docs":{},"c":{"docs":{},"k":{"docs":{"performance.html":{"ref":"performance.html","tf":0.006033182503770739}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/router.html":{"ref":"basics/router.html","tf":0.012658227848101266},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.012295081967213115},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.008695652173913044},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.017777777777777778},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.019011406844106463},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.01},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.006527415143603133},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.0189873417721519},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00597609561752988},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.008704061895551257},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.020356234096692113},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.017241379310344827},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}},"n":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.006769825918762089},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.01272264631043257},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.017241379310344827},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"t":{"docs":{},"o":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}}}}}}}},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.040983606557377046}},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175}}}}}}},"o":{"docs":{},"n":{"docs":{},"c":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"r":{"docs":{},"i":{"docs":{},"v":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051}}}},"e":{"docs":{},"f":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"c":{"docs":{},"l":{"docs":{},"a":{"docs":{},"r":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}}}},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}},"t":{"docs":{},"i":{"docs":{},"m":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}}},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{},")":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}}},"f":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.013100436681222707},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.006527415143603133},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.016842105263157894},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.020100502512562814},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"i":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}},"o":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"u":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.010526315789473684},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259}}}}}}}},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}},"/":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976}}}}}}}}}}}},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"e":{"docs":{},"n":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}},"u":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"r":{"docs":{},"/":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.021791767554479417},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.024691358024691357},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.05045871559633028},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.01056338028169014},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.015625},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.016877637130801686},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.006769825918762089}},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/router.html":{"ref":"basics/router.html","tf":0.012658227848101266},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.011389521640091117},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.01791044776119403},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.020491803278688523},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.012572533849129593},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.022988505747126436},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}}}}},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}}},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"i":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.014925373134328358},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.03225806451612903},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.017361111111111112},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0234375},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.015625},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.014814814814814815},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.014360313315926894},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.012658227848101266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.01764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.01606425702811245},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.0171990171990172},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.027989821882951654},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.01293103448275862},"performance.html":{"ref":"performance.html","tf":0.006033182503770739}}}},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}},"p":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"s":{"docs":{},",":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}},"u":{"docs":{},"r":{"docs":{},"s":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}},"e":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"!":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}},"r":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}}}}}}}}},"f":{"docs":{},"i":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"a":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.017777777777777778},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.019011406844106463},"ring/static.html":{"ref":"ring/static.html","tf":0.013824884792626729},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.016877637130801686},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.017777777777777778},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.022813688212927757},"ring/static.html":{"ref":"ring/static.html","tf":0.018433179723502304},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.016877637130801686},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.015209125475285171}}}}}}}}}},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.027649769585253458},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843}},"e":{"docs":{},"r":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}},"s":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}}}}},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}},"d":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"f":{"docs":{},"e":{"docs":{},"/":{"docs":{},"h":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"!":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}},"h":{"docs":{},"/":{"docs":{},"i":{"docs":{},"g":{"docs":{},"n":{"docs":{},"o":{"docs":{},"r":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}}},"c":{"docs":{},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}}},"s":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}}},"t":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"/":{"docs":{},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.010416666666666666}}}}}}}},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"t":{"docs":{},"i":{"docs":{},"c":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"/":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{},"l":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.008955223880597015},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.034722222222222224},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.012152777777777778},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}},"m":{"docs":{},"e":{"docs":{},"r":{"docs":{},"g":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}}}}}},"o":{"docs":{},"r":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"d":{"docs":{},"?":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}},"e":{"docs":{},"e":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},"q":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}},"t":{"docs":{},"/":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"?":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}}},"!":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"l":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}},"v":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},")":{"docs":{},")":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}}}}}},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992}}}}}}}}},"p":{"docs":{},"!":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}},"u":{"docs":{},"b":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"i":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},")":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}},"u":{"docs":{},"p":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}},"n":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}},"*":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},")":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}},"[":{"docs":{},"\"":{"docs":{},"/":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"\"":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}},"]":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}}}},".":{"docs":{},".":{"docs":{},".":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}},"n":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.022900763358778626}},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.008704061895551257}}}}},"o":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"n":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"t":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"e":{"docs":{},":":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}},"=":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"i":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}}}},"s":{"1":{"docs":{},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}}}}}}}},"2":{"docs":{},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},"]":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}}}}}}}}}},"docs":{}}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625}},"e":{"docs":{},"s":{"docs":{},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"p":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}},"v":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"y":{"docs":{},"b":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"i":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}}}}}}},"c":{"docs":{},"r":{"docs":{},"o":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"e":{"docs":{},"r":{"docs":{},"g":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408}}}}}}},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}},"a":{"docs":{},"l":{"docs":{},")":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}}},"r":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.007371007371007371},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"n":{"docs":{},"l":{"docs":{},"i":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678}}}}},"f":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"k":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"v":{"docs":{},"i":{"docs":{},"a":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.02109704641350211},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}},"e":{"docs":{},"x":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"/":{"docs":{},"c":{"docs":{},"u":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}}}},"c":{"docs":{},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}},".":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}}}},".":{"docs":{},"g":{"docs":{},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}},"j":{"docs":{},"a":{"docs":{},"v":{"docs":{},"a":{"docs":{},".":{"docs":{},"i":{"docs":{},"o":{"docs":{},".":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}}}},"u":{"docs":{},"t":{"docs":{},"i":{"docs":{},"l":{"docs":{},".":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},".":{"docs":{},")":{"docs":{},"}":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"y":{"docs":{},"/":{"docs":{},"r":{"docs":{},"u":{"docs":{},"n":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{},"l":{"docs":{},"o":{"docs":{},"g":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.01256281407035176}}}}}}}}}}}}}}}},"#":{"docs":{},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{},"{":{"docs":{},":":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}}}}}}}}}}}}}}}}}}},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.01639344262295082}}},"{":{"docs":{},":":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}},"u":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"l":{"docs":{},"e":{"docs":{},"g":{"docs":{},"a":{"docs":{},"c":{"docs":{},"i":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}},"t":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.010526315789473684},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}},"i":{"docs":{},"k":{"docs":{},"e":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}},"s":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"p":{"docs":{},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"l":{"docs":{},"n":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112}}}},"e":{"docs":{},"r":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}},"o":{"docs":{},"m":{"docs":{},"i":{"docs":{},"s":{"docs":{},"e":{"docs":{},")":{"docs":{},"]":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}}}}},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0113314447592068}}}}}}}},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"c":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}}}},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.004524886877828055}}}}},"i":{"docs":{},"n":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"t":{"docs":{},"e":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"?":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01593625498007968}},"/":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"s":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}}}}}}}}}},"o":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},".":{"docs":{},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{},")":{"docs":{},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}}}}}}}}}}}}},"f":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},".":{"docs":{},"e":{"docs":{},".":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"o":{"docs":{},"/":{"docs":{},"i":{"docs":{},"n":{"docs":{},"p":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"o":{"docs":{},"u":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}},"w":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"l":{"docs":{},"d":{"docs":{},"c":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},"h":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}}}}},"n":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"c":{"docs":{},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}},"o":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}},"t":{"docs":{},"h":{"docs":{},"r":{"docs":{},"o":{"docs":{},"w":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}}}}}}},"+":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}},"\"":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}}}}}}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}},"?":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}}},"=":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"/":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}}}},"?":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}},"b":{"docs":{},"l":{"docs":{},"a":{"docs":{},"n":{"docs":{},"k":{"docs":{},"?":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}},":":{"1":{"2":{"3":{"docs":{},"}":{"docs":{},"]":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444}},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}}}},"docs":{}},"docs":{}},"3":{"0":{"0":{"0":{"docs":{},"/":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"x":{"docs":{},"m":{"docs":{},"l":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}},"docs":{}},"docs":{}},"docs":{}},"8":{"0":{"8":{"0":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"docs":{}},"docs":{}},"docs":{}},"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.01272264631043257},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},":":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.014527845036319613}}}}}},"n":{"docs":{},"e":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"}":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}},"]":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.01366742596810934},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},")":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}}}}},"}":{"docs":{"./":{"ref":"./","tf":0.007263922518159807}},"]":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}}}},"]":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467}},")":{"docs":{},")":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}}},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333}}}}},"h":{"docs":{},"o":{"docs":{},"t":{"docs":{},"o":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.010416666666666666}},"s":{"docs":{},"]":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},")":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}}},"l":{"docs":{},"u":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"s":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}},"}":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}},"p":{"docs":{},"i":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893}},"]":{"docs":{},",":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}}}}},"c":{"docs":{},"c":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805}}}},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421}}}}}}},"b":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},")":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}},"d":{"docs":{},"b":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}},"}":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}},"}":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}},"e":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.01834862385321101},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.015625}},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}},"s":{"docs":{},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"]":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}},")":{"docs":{},")":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}},"}":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}},")":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.009174311926605505}},")":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}},"k":{"docs":{},"i":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},")":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},"]":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}}}}},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467}}},"}":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}}}},"k":{"docs":{},"u":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.010416666666666666}}}},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"j":{"docs":{},"o":{"docs":{},"i":{"docs":{},"n":{"docs":{},"?":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}},"p":{"docs":{},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}}},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"/":{"docs":{},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}}}}}}},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.011940298507462687},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.023206751054852322}},"s":{"docs":{},")":{"docs":{},"]":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}},"u":{"docs":{},"t":{"docs":{},"e":{"1":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"2":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"3":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"docs":{}}}}},"s":{"docs":{},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.008955223880597015}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}}}}}},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}}},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"k":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}},"/":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},")":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"i":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}},"m":{"docs":{},"i":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.015625}}},"w":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"2":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"3":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051}}}}}},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051}}},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}}}}}}}}}}}}}}}},"f":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},"]":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}}}},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"o":{"docs":{},"o":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}},"z":{"docs":{},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}}}}}},"t":{"docs":{},"w":{"docs":{},"o":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"}":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}},"i":{"docs":{},"m":{"docs":{},"e":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},")":{"docs":{},")":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"1":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}},"docs":{}}}}}}},"b":{"docs":{},"a":{"docs":{},"r":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"]":{"docs":{},"]":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}}},"z":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}},"a":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.014925373134328358},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.01232394366197183},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.024193548387096774},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.015625},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.015625},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.014814814814814815},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.01174934725848564},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.014767932489451477},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.01693227091633466},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.01764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.01606425702811245},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.014742014742014743},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.01293103448275862},"performance.html":{"ref":"performance.html","tf":0.006033182503770739}},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}},"]":{"docs":{},"]":{"docs":{},"}":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"}":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}},"d":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}},")":{"docs":{},")":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}}}}}},"p":{"docs":{},"i":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.022222222222222223}},"]":{"docs":{},"]":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}},"}":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},")":{"docs":{},"]":{"docs":{},"}":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},",":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}},"c":{"docs":{},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"/":{"docs":{},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},")":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"]":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}}}},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},"]":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}}}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"u":{"docs":{},"u":{"docs":{},"s":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}},"}":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"r":{"docs":{},"g":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.014742014742014743}}}}},"b":{"docs":{},"o":{"docs":{},"d":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/ring.html":{"ref":"ring/ring.html","tf":0.01565217391304348},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0234375},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.06222222222222222},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.057034220532319393},"ring/static.html":{"ref":"ring/static.html","tf":0.013824884792626729},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.03184713375796178},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.01951219512195122},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.013100436681222707},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.024804177545691905},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.010548523206751054},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.012948207171314742},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.01764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.016666666666666666},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01593625498007968},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.017241379310344827},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"y":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},"}":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},".":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},"]":{"docs":{},"}":{"docs":{},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}},"n":{"docs":{},"u":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}},"s":{"1":{"0":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}},"docs":{}},"docs":{}}}}},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"}":{"docs":{},")":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}},"i":{"docs":{},"g":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"i":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"s":{"docs":{},"]":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"/":{"docs":{},"b":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"l":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"s":{"docs":{},"a":{"docs":{},"h":{"docs":{},"t":{"docs":{},"i":{"docs":{},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.014527845036319613},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.01834862385321101},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.01263157894736842},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.005802707930367505},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},":":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"c":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}},"b":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}},"]":{"docs":{},"]":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843}},"e":{"docs":{},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435}}},"]":{"docs":{},"]":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"b":{"docs":{},"u":{"docs":{},"g":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984}},"]":{"docs":{},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805}}}}}}}},"}":{"docs":{},"}":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}},")":{"docs":{},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}},"v":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"u":{"docs":{},"o":{"5":{"5":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"docs":{}},"7":{"1":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"docs":{}},"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"y":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}},"i":{"docs":{},"c":{"docs":{},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.005221932114882507},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.014767932489451477},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.027777777777777776},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.02666666666666667},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},")":{"docs":{},"]":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}},"}":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"z":{"docs":{},"i":{"docs":{},"p":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0069721115537848604},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},")":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805}}}}},"]":{"docs":{},"}":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415}}}}}}}}}},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.022813688212927757},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"i":{"docs":{},"g":{"docs":{},"h":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444}}}}}},"r":{"docs":{},"e":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"m":{"docs":{},"i":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}}}},"x":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.017241379310344827},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"a":{"docs":{},"n":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"}":{"docs":{},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}}}},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"]":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}},"u":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"j":{"docs":{},"a":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}}}}}}}}}}}}},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259}},"]":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.015945330296127564},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.01293103448275862},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}},"p":{"docs":{},"u":{"docs":{},"e":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}},"]":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}},"o":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"t":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.013333333333333334},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}},"s":{"1":{"docs":{},"/":{"docs":{},"b":{"docs":{},"a":{"docs":{},"r":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}},"}":{"docs":{},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}}}}}}}}},"docs":{}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.026634382566585957},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.011299435028248588},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.024691358024691357},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.03211009174311927},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.01584507042253521},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.009138381201044387},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.007736943907156673},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.014742014742014743},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.020356234096692113},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},"]":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"c":{"docs":{},"h":{"docs":{},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.01584507042253521},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.03225806451612903},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.03125},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.006527415143603133},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00597609561752988},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},"}":{"docs":{},"]":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}}}}}}}}}}}},"g":{"docs":{},"e":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.006527415143603133},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},")":{"docs":{},"]":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}},"u":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633}},"}":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}}}}}}}},"r":{"docs":{},"e":{"docs":{},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},",":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}},"d":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}},"o":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}},"s":{"docs":{},")":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}},"v":{"docs":{},"i":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},"e":{"docs":{},"s":{"docs":{},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"h":{"docs":{},"o":{"docs":{},"t":{"docs":{},"o":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.020833333333333332}},"/":{"docs":{},"h":{"docs":{},"e":{"docs":{},"i":{"docs":{},"g":{"docs":{},"h":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}},"i":{"docs":{},"d":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}},"w":{"docs":{},"i":{"docs":{},"d":{"docs":{},"t":{"docs":{},"h":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},"]":{"docs":{},")":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.022222222222222223}},")":{"docs":{},"]":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.012152777777777778},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"i":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}},"s":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.014527845036319613},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.01834862385321101},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.008802816901408451},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.006527415143603133},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0069721115537848604}},"e":{"docs":{},"s":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}}}},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"c":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}}}}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}}}}}},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.014742014742014743}}}}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.0171990171990172}},":":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.04176904176904177}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"s":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"e":{"docs":{},",":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"/":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"s":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984}}}}}}}}}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"k":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}}}},"f":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.009828009828009828},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"e":{"docs":{},"r":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.013539651837524178},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}},")":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"l":{"docs":{},"e":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}}}},"o":{"docs":{},"t":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}},"u":{"docs":{},"r":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/ring.html":{"ref":"ring/ring.html","tf":0.01565217391304348},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.035555555555555556},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0113314447592068},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.005221932114882507},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},"l":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.022887323943661973},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.03225806451612903},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.03125}},"/":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}},"u":{"docs":{},"s":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}},"s":{"docs":{},"}":{"docs":{},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}}},"}":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.009174311926605505}},"]":{"docs":{},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843}}}},",":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}},"d":{"docs":{},"b":{"docs":{},"}":{"docs":{},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"}":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}},"f":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"}":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}},"o":{"docs":{},"o":{"docs":{},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525}}}}}}},"b":{"docs":{},"a":{"docs":{},"r":{"docs":{},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}},"z":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"1":{"docs":{},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"2":{"docs":{},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"3":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"docs":{}}}}}},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"1":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"]":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"docs":{}}}}}}},"k":{"docs":{},"i":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{},"}":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.01},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},".":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}},"i":{"docs":{},"d":{"docs":{},"t":{"docs":{},"h":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}}}},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"s":{"docs":{},"p":{"docs":{},"a":{"docs":{},"c":{"docs":{},"e":{"docs":{},"/":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"]":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},"}":{"docs":{},")":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}}},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.01263157894736842},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}},"e":{"docs":{},".":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.014084507042253521},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.005221932114882507},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421}},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}}},"n":{"docs":{},"f":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.012295081967213115},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"i":{"docs":{},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"s":{"docs":{},"u":{"docs":{},"m":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}}}}}}},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}}},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{},"/":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}},"h":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.014742014742014743}}}}}}},"l":{"docs":{},"e":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"a":{"docs":{},"v":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"]":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"o":{"docs":{},"a":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}},"o":{"docs":{},"k":{"docs":{},"u":{"docs":{},"p":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.022988505747126436}}}}}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.013054830287206266}}},"y":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"i":{"docs":{},"n":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}}}}}}},"s":{"docs":{},"y":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"x":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}}},"c":{"docs":{},"o":{"docs":{},"p":{"docs":{},"e":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.014925373134328358},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}},"k":{"docs":{},"u":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},"/":{"docs":{},"i":{"docs":{},"d":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}}}}},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}}}}}}},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055}}}}},"o":{"docs":{},"p":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055}}}}},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"y":{"docs":{},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}}}}}}}},"a":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"]":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"l":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218}}}}}},"e":{"docs":{},"g":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"c":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},"]":{"docs":{},"]":{"docs":{},"}":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.011940298507462687},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}},"e":{"docs":{},"c":{"docs":{},"u":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}}}},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224}}}}}},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}},"n":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}},"i":{"docs":{},"d":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}},"u":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}},"i":{"docs":{},"a":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}},"i":{"docs":{},"n":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}},"t":{"docs":{},"o":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633}},"a":{"docs":{},"l":{"docs":{},"}":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}}}}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"performance.html":{"ref":"performance.html","tf":0.004524886877828055}}}}}},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}},"d":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"]":{"docs":{},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},")":{"docs":{},")":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},")":{"docs":{},")":{"docs":{},")":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"}":{"docs":{},"]":{"docs":{},"}":{"docs":{},"]":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}},")":{"docs":{},"}":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"g":{"docs":{},"n":{"docs":{},"o":{"docs":{},"r":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}}}}}},"h":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"n":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}},"i":{"docs":{},"g":{"docs":{},"w":{"docs":{},"h":{"docs":{},"e":{"docs":{},"e":{"docs":{},"l":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.008680555555555556}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.008695652173913044}},"s":{"docs":{},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175}}}}}}},"s":{"docs":{},")":{"docs":{},"]":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}},"k":{"docs":{},"]":{"docs":{},"}":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"l":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525}}}}},"u":{"docs":{},"t":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"t":{"docs":{},"o":{"docs":{},"p":{"docs":{},"]":{"docs":{},"]":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}},"k":{"docs":{},"e":{"docs":{},"n":{"docs":{},"]":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"e":{"docs":{},")":{"docs":{},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}},"i":{"docs":{},"e":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218}}}}},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0113314447592068},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795}}}}},"a":{"docs":{},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"j":{"docs":{},"o":{"docs":{},"i":{"docs":{},"n":{"docs":{},"?":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}},"y":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}},"x":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}},"z":{"docs":{},")":{"docs":{},")":{"docs":{},"]":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}},")":{"docs":{},"]":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525}}}}}}}}},";":{"docs":{"./":{"ref":"./","tf":0.08958837772397095},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.03389830508474576},"basics/router.html":{"ref":"basics/router.html","tf":0.04219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.07407407407407407},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.11467889908256881},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.05694760820045558},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.029850746268656716},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.13114754098360656},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.06338028169014084},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.08064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.026041666666666668},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.03826086956521739},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0859375},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.044444444444444446},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.04182509505703422},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.013100436681222707},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0226628895184136},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.04960835509138381},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00796812749003984},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.01606425702811245},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.05415860735009671},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.2727272727272727},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.021551724137931036}},"#":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"{":{"docs":{},":":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"{":{"docs":{},":":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}}}}}}}}}}}}}}}}}}}}}}}}}},";":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.024305555555555556},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.014164305949008499},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00796812749003984},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.050314465408805034},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.012875536480686695},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.020356234096692113},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.017241379310344827},"performance.html":{"ref":"performance.html","tf":0.027149321266968326},"faq.html":{"ref":"faq.html","tf":0.00816326530612245}},"{":{"docs":{},":":{"docs":{},"s":{"docs":{},"k":{"docs":{},"u":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}},":":{"docs":{},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"p":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}}}}}}},"[":{"docs":{},"[":{"docs":{},"\"":{"docs":{},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}},"f":{"docs":{},"o":{"docs":{},"o":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525}}}}}},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"n":{"docs":{},"a":{"docs":{},"p":{"docs":{},"u":{"docs":{},"e":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"1":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"docs":{}}}}}}}}},"#":{"docs":{},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"{":{"docs":{},":":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}}}}}}}}}}}},":":{"docs":{},"b":{"docs":{},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"s":{"docs":{},"a":{"docs":{},"h":{"docs":{},"t":{"docs":{},"i":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}},"\"":{"docs":{},"/":{"docs":{},"b":{"docs":{},"a":{"docs":{},"r":{"docs":{},"\"":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}}},"a":{"docs":{},"v":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}},"|":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.013100436681222707}}},"{":{"docs":{},":":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"u":{"docs":{},"p":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}},"=":{"docs":{},">":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.03333333333333333}}}}}}},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"v":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.03333333333333333}}}}}},"t":{"docs":{},"h":{"docs":{},"e":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}},">":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.009174311926605505},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.06557377049180328},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.010434782608695653},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.01263157894736842},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}},")":{"docs":{},")":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},":":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}},",":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"e":{"docs":{},"d":{"docs":{},"n":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}}}},">":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"[":{"0":{"docs":{},"]":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}},"1":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984}},"]":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"3":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}},"docs":{},"\"":{"docs":{},"/":{"docs":{},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}},"/":{"docs":{},"d":{"docs":{},"b":{"docs":{},"\"":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}}}}}}},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}},"p":{"docs":{},"i":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"\"":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.00847457627118644},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.01791044776119403},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.012658227848101266},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"/":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}}}}}}}}},":":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218}}}}}}}}},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"d":{"docs":{},"b":{"docs":{},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.011389521640091117}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}}}}}},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},"/":{"docs":{},"t":{"docs":{},"o":{"docs":{},"k":{"docs":{},"e":{"docs":{},"n":{"docs":{},"/":{"docs":{},":":{"docs":{},"t":{"docs":{},"o":{"docs":{},"k":{"docs":{},"e":{"docs":{},"n":{"docs":{},"\"":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}},"z":{"docs":{},"z":{"docs":{},"a":{"docs":{},"\"":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},"]":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}},"/":{"docs":{},"\"":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.015209125475285171}}}}}}},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"/":{"docs":{},"*":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"\"":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787}}}}}}}}},"{":{"docs":{},"*":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"}":{"docs":{},"\"":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}},"\"":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}},"l":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"/":{"docs":{},":":{"docs":{},"z":{"docs":{},"\"":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633}}},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"/":{"docs":{},":":{"docs":{},"u":{"docs":{},"s":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}},"{":{"docs":{},"u":{"docs":{},"s":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}},"p":{"docs":{},"l":{"docs":{},"o":{"docs":{},"a":{"docs":{},"d":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"d":{"docs":{},"b":{"docs":{},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},"e":{"docs":{},"e":{"docs":{},"p":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"l":{"docs":{},"o":{"docs":{},"a":{"docs":{},"d":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"u":{"docs":{},"o":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"y":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"i":{"docs":{},"c":{"docs":{},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366}}}}}}}}}}}},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"/":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.00847457627118644}}}}},"{":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"}":{"docs":{},".":{"docs":{},"{":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"}":{"docs":{},"\"":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}}}}}}}}}}},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},"\"":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}}}}}}},"\"":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}}}}}}}}}}}}}}},":":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}},"]":{"docs":{},"]":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}},")":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},":":{"docs":{},"u":{"docs":{},"s":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"u":{"docs":{},"l":{"docs":{},"k":{"docs":{},"/":{"docs":{},":":{"docs":{},"b":{"docs":{},"u":{"docs":{},"l":{"docs":{},"k":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787}}}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}}}}}},"a":{"docs":{},"r":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366}}}}}}},"\"":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}},"z":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"/":{"docs":{},":":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"b":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"l":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"s":{"docs":{},"a":{"docs":{},"h":{"docs":{},"t":{"docs":{},"i":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"\"":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}},"*":{"docs":{},"\"":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}},"x":{"docs":{},"m":{"docs":{},"l":{"docs":{},"\"":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"\"":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}}}}}}}}},"h":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"n":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"\"":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}}}}},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"l":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}},"t":{"docs":{},"w":{"docs":{},"o":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}},"s":{"2":{"docs":{},"\"":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}}}},"docs":{}}},"c":{"docs":{},"i":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}},"i":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{},"\"":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"1":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"2":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}},"3":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}},"docs":{}}}}}},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"s":{"docs":{},"p":{"docs":{},"a":{"docs":{},"c":{"docs":{},"e":{"docs":{},"/":{"docs":{},":":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"/":{"docs":{},":":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"\"":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}}}}}}}}}}}}}}}}}}},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"s":{"docs":{},".":{"docs":{},"{":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"}":{"docs":{},".":{"docs":{},"{":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"}":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"8":{"0":{"8":{"0":{"docs":{},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"{":{"docs":{},"i":{"docs":{},"d":{"docs":{},"}":{"docs":{},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}}}}}}}}}}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"}":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}},"i":{"docs":{},"m":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"/":{"docs":{},"p":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"}":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"l":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"1":{"docs":{},"\"":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}},"docs":{}}}}}}},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{},"s":{"docs":{},"p":{"docs":{},"a":{"docs":{},"c":{"docs":{},"e":{"docs":{},"/":{"docs":{},"\"":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}}}},"[":{"docs":{},"\"":{"docs":{},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}}}}},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}}}}}}}}}}}}}},":":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}},"{":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"}":{"docs":{},"\"":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}},"\"":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}}}}}}}}}},"l":{"docs":{},"l":{"docs":{},"\"":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"u":{"docs":{},"u":{"docs":{},"s":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"\"":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}}},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"/":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}},"o":{"docs":{},"o":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.015209125475285171},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},":":{"docs":{},"u":{"docs":{},"s":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}},"{":{"docs":{},"u":{"docs":{},"s":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}},"\"":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}}},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}},"a":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"\"":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},":":{"docs":{},"t":{"docs":{},"h":{"docs":{},"i":{"docs":{},"s":{"docs":{},"/":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"u":{"docs":{},"l":{"docs":{},"d":{"docs":{},"/":{"docs":{},":":{"docs":{},"f":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"a":{"docs":{},"z":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"/":{"docs":{},":":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"n":{"docs":{},"a":{"docs":{},"p":{"docs":{},"u":{"docs":{},"e":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}}},"l":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"o":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{},"\"":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"k":{"docs":{},"i":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{},"\"":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}}}}}},"b":{"docs":{},"r":{"docs":{},"o":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"{":{"docs":{},"c":{"docs":{},"u":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"r":{"docs":{},"}":{"docs":{},".":{"docs":{},"{":{"docs":{},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},"i":{"docs":{},"c":{"docs":{},"e":{"docs":{},"}":{"docs":{},".":{"docs":{},"{":{"docs":{},"*":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{},"}":{"docs":{},"\"":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"\"":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}},"a":{"docs":{},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"\"":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},"/":{"docs":{},"t":{"docs":{},"o":{"docs":{},"k":{"docs":{},"e":{"docs":{},"n":{"docs":{},"/":{"docs":{},"\"":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}}}}}}}}}}}}}},"#":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"[":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"$":{"docs":{},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{},"]":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}}}}}}}}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"3":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.02926829268292683},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},":":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}},"b":{"docs":{},"o":{"docs":{},"n":{"docs":{},"u":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}},"m":{"docs":{},"w":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175}}}},"[":{"docs":{},":":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}},"_":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"]":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.01293103448275862}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"]":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}}},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"g":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"e":{"docs":{},"]":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"]":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}},"i":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},"]":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175}}}}}}}}}}}},"u":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"j":{"docs":{},"a":{"docs":{},"/":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"]":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259}}}}}},"i":{"docs":{},"r":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}},"]":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},"d":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}},"r":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"j":{"docs":{},"a":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}},"e":{"docs":{},"a":{"docs":{},"s":{"docs":{},"i":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}}}}}}}}}}}},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"]":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}},"e":{"docs":{},"r":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525}},"]":{"docs":{},"}":{"docs":{},"]":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}}}},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"]":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}},"r":{"docs":{},"c":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}},"]":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"a":{"docs":{},"d":{"docs":{},"a":{"docs":{},"p":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}}}}}}}}},":":{"docs":{},":":{"docs":{},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"]":{"docs":{},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}},"}":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}},"p":{"docs":{},"i":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}},"}":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}}}}},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"]":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}}}}}}},"d":{"docs":{},"b":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}},"e":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}},"]":{"docs":{},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}}}}}}},"k":{"docs":{},"u":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}}},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"i":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"k":{"docs":{},"s":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}}}}},"m":{"docs":{},"w":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}},"z":{"docs":{},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{},"]":{"docs":{},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"p":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},"}":{"docs":{},")":{"docs":{},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}}}}}}}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"e":{"docs":{},"s":{"docs":{},"]":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}}}}}},"p":{"docs":{},"h":{"docs":{},"o":{"docs":{},"t":{"docs":{},"o":{"docs":{},"/":{"docs":{},"h":{"docs":{},"e":{"docs":{},"i":{"docs":{},"g":{"docs":{},"h":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}},"i":{"docs":{},"d":{"docs":{},"]":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},")":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}}}}},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}}},"t":{"docs":{},"h":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}},"s":{"docs":{},"k":{"docs":{},"u":{"docs":{},"/":{"docs":{},"i":{"docs":{},"d":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}}}}}}}},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"a":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},"p":{"docs":{},"i":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175}}}}},"t":{"docs":{},"o":{"docs":{},"p":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"b":{"docs":{},"o":{"docs":{},"n":{"docs":{},"u":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}},"s":{"1":{"0":{"docs":{},"]":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}}},"docs":{}},"docs":{}}}}},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},"a":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543}}}}}}}},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}}}},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"]":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}}},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}}}}}}},"a":{"docs":{},"p":{"docs":{},"u":{"docs":{},"e":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"i":{"docs":{},"d":{"docs":{},"]":{"docs":{},"}":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}},"d":{"docs":{},"y":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}},"o":{"docs":{},"l":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}},"c":{"docs":{},"]":{"docs":{},"}":{"docs":{},"]":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805}}}}}}},"d":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}}}},"p":{"docs":{},"p":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}},"i":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"]":{"docs":{},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{},")":{"docs":{},"]":{"docs":{},")":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}}}}}}},"o":{"docs":{},".":{"docs":{},"p":{"docs":{},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{},"/":{"docs":{},"p":{"docs":{},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{},".":{"docs":{},"j":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"i":{"docs":{},"c":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}}}},"d":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}},"]":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"]":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}},"}":{"docs":{},"]":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}},"t":{"docs":{},"h":{"docs":{},"i":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.012658227848101266}},"s":{"docs":{},"]":{"docs":{},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.016877637130801686}}}}}}},"o":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"]":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"m":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"s":{"docs":{},"]":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421}}}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"j":{"docs":{},"a":{"docs":{},"v":{"docs":{},"a":{"docs":{},".":{"docs":{},"i":{"docs":{},"o":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}},"t":{"docs":{},"x":{"docs":{},"]":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}},"]":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.01272264631043257},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}},"}":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}},"{":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.041666666666666664}}}},":":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}},"r":{"docs":{},"/":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"e":{"docs":{},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}},"{":{"docs":{},"{":{"docs":{},":":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}}}}}}}}},"#":{"docs":{},"(":{"docs":{},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}},"\\":{"docs":{},"\"":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},".":{"docs":{},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{},"\\":{"docs":{},"\"":{"docs":{},"]":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}}}}}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"2":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.01951219512195122},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"b":{"docs":{},"o":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"]":{"docs":{},"}":{"docs":{},"]":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}}}}}}}},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"s":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}}}}}}}}},"p":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}},"d":{"docs":{},"n":{"docs":{},"]":{"docs":{},".":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}},"x":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},"]":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}},"(":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}}}}},"i":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.016666666666666666}},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.01764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.02390438247011952}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{},"s":{"docs":{},"]":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}},"u":{"docs":{},"b":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"z":{"docs":{},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.02109704641350211}}}}}},";":{"docs":{},";":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}},"e":{"docs":{},"w":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"]":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}},"&":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"%":{"docs":{},"]":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.007371007371007371}}}},".":{"docs":{},".":{"docs":{},".":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}},"a":{"docs":{},"d":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"d":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.008704061895551257},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"i":{"docs":{},"t":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"]":{"docs":{},")":{"docs":{},")":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.015625},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00796812749003984},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"performance.html":{"ref":"performance.html","tf":0.006033182503770739},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"d":{"docs":{},"o":{"docs":{},"c":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}},")":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},"\"":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"s":{"docs":{},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},":":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}},"p":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/ring.html":{"ref":"ring/ring.html","tf":0.01217391304347826},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.017777777777777778},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.019011406844106463},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.0189873417721519},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00796812749003984},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.044444444444444446},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"l":{"docs":{},"i":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.008802816901408451},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.006527415143603133},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"c":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},"s":{"docs":{},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}},"/":{"docs":{},"x":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},";":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"y":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}},"r":{"docs":{},"o":{"docs":{},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"e":{"docs":{},"s":{"docs":{},",":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}},"x":{"docs":{},"i":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}}},"s":{"docs":{},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"c":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},":":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223}}}}}},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"c":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805}},"u":{"docs":{},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467}}}}},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"i":{"docs":{},"d":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},",":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},"s":{"docs":{},"s":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421}},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"]":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}}}}},"h":{"docs":{},"i":{"docs":{},"e":{"docs":{},"v":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"l":{"docs":{},"y":{"docs":{},",":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}},",":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}}}}}}}},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"i":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"s":{"docs":{},"o":{"docs":{},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"w":{"docs":{},"a":{"docs":{},"y":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.006033182503770739}}}}},"g":{"docs":{},"o":{"docs":{},"r":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"m":{"docs":{},"s":{"docs":{},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}},"n":{"docs":{},"y":{"docs":{},"w":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}}},"a":{"docs":{},"y":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"t":{"docs":{},"h":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}},"}":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}},"o":{"docs":{},"t":{"docs":{},"h":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}}},"n":{"docs":{},"y":{"docs":{},"m":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714}}}}}},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.030042918454935622}}}}}},"d":{"docs":{},"/":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"n":{"docs":{},"o":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"r":{"docs":{},"g":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.01639344262295082}},"u":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"s":{"docs":{},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}},":":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},",":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}},"s":{"docs":{},"*":{"docs":{},"]":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224}}}}},"b":{"docs":{},"i":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"u":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"i":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"y":{"docs":{},".":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}}},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}},"i":{"docs":{},"z":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.035175879396984924}}}}}}},"g":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}},"t":{"docs":{},"t":{"docs":{},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}}}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.007371007371007371}}},"o":{"docs":{},"m":{"docs":{},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"x":{"docs":{},"i":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},":":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}},"g":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}},":":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},"s":{"docs":{},"t":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}}}}}},"b":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"i":{"docs":{},"l":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},".":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}},"v":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},"e":{"docs":{},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},")":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"s":{"docs":{},"y":{"docs":{},"n":{"docs":{},"c":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.022222222222222223}},"h":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}}},"s":{"docs":{},"o":{"docs":{},"c":{"docs":{},"i":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}},"k":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"t":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}},"v":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}}}},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},"f":{"docs":{},"f":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"w":{"docs":{},"e":{"docs":{},"s":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":3.3580246913580245},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":3.3379204892966357},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"i":{"docs":{},"c":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"frontend/basics.html":{"ref":"frontend/basics.html","tf":10.01}}}}},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}},"c":{"docs":{},"k":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},",":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}}},"s":{"docs":{},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"e":{"docs":{},"s":{"docs":{},".":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}},"g":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}},"d":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"i":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},"g":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"i":{"docs":{},"m":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}},"t":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},"d":{"docs":{},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"i":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0163265306122449}},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},":":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"?":{"docs":{"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}}}},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"development.html":{"ref":"development.html","tf":0.015384615384615385}}},"t":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}},"t":{"docs":{},",":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984}}}}}}},"s":{"docs":{},"i":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"m":{"docs":{},"p":{"docs":{"development.html":{"ref":"development.html","tf":0.03076923076923077}}}}},"o":{"docs":{},"t":{"docs":{},"h":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.01020408163265306}},".":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}},",":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"n":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"s":{"docs":{},",":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},":":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}}},"n":{"docs":{},"u":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}},"s":{"docs":{},",":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}}}}}}}}}},"x":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}},"d":{"docs":{},"i":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749}}}}},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}},"s":{"docs":{},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}},"o":{"docs":{},"w":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.03},"frontend/browser.html":{"ref":"frontend/browser.html","tf":5.0257510729613735}}}}}}},"e":{"docs":{},"a":{"docs":{},"k":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"development.html":{"ref":"development.html","tf":0.03076923076923077}}}}}},"e":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}},"h":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}},"a":{"docs":{},"v":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"i":{"docs":{},"o":{"docs":{},"r":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}},"s":{"docs":{},"i":{"docs":{},"d":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}},"t":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"w":{"docs":{},"e":{"docs":{},"e":{"docs":{},"n":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"e":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.006769825918762089}},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"]":{"docs":{},")":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"s":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"n":{"docs":{},"c":{"docs":{},"h":{"docs":{"performance.html":{"ref":"performance.html","tf":0.006033182503770739}},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"k":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}}},"c":{"docs":{},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},".":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},".":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.017241379310344827},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"e":{"docs":{},"(":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{},")":{"docs":{"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258}},".":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}}}}}}},".":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.008955223880597015},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":10.005208333333334},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}}}}}}}}}},"s":{"docs":{},".":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"f":{"docs":{},"n":{"docs":{},"?":{"docs":{},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}},"e":{"docs":{},"x":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}},"r":{"docs":{},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"?":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}}},"l":{"docs":{},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"i":{"docs":{},"n":{"docs":{},"f":{"docs":{},"o":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}}}}},"i":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}},",":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},":":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.006122448979591836}}}}}}}}},",":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}}}},"i":{"docs":{},"a":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"a":{"docs":{},"r":{"docs":{"development.html":{"ref":"development.html","tf":0.03076923076923077}}}}},"s":{"docs":{},"e":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.011940298507462687}}},"u":{"docs":{},"r":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}},"i":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"s":{"docs":{},".":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}},"c":{"docs":{},"k":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.02145922746781116}},"?":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.012875536480686695}}}}}},"j":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"development.html":{"ref":"development.html","tf":0.03076923076923077}}},"e":{"docs":{},"a":{"docs":{},"n":{"docs":{},"l":{"docs":{},"i":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}},",":{"docs":{"development.html":{"ref":"development.html","tf":0.03076923076923077}}}}}}},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.007832898172323759},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.009685230024213076},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":5.035211267605634},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.012152777777777778},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.014164305949008499},"ring/coercion.html":{"ref":"ring/coercion.html","tf":5.031331592689295},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.018947368421052633},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02}},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795}}},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"faq.html":{"ref":"faq.html","tf":0.00816326530612245}}},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},":":{"docs":{"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625}}}}}},"e":{"docs":{},"!":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.024193548387096774},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0234375}}},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.008802816901408451},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.016842105263157894},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}},"s":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},"}":{"docs":{},")":{"docs":{},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}}},"d":{"docs":{},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}},"m":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.014084507042253521},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.016666666666666666},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":5.014736842105263},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}},"r":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}},"o":{"docs":{},"s":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":5.003868471953578},"faq.html":{"ref":"faq.html","tf":0.00816326530612245}},"i":{"docs":{},"t":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}},"n":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.00816326530612245}},"e":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}},"?":{"docs":{"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}}}},"l":{"docs":{},"e":{"docs":{},"x":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}},"a":{"docs":{},"r":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224}}}},"u":{"docs":{},"t":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"e":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}},"n":{"docs":{},"f":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":5.05327868852459},"ring/static.html":{"ref":"ring/static.html","tf":0.018433179723502304},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"performance.html":{"ref":"performance.html","tf":0.004524886877828055},"faq.html":{"ref":"faq.html","tf":0.00816326530612245}},",":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}},"s":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}}},":":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.01639344262295082}}},".":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.017241379310344827}}}}}}}},"i":{"docs":{},"g":{"docs":{},"u":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":5.016393442622951},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}}}},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}},"j":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.01639344262295082},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.018633540372670808},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":5.019753086419753},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223}}}},"x":{"docs":{},"t":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01593625498007968}},".":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}},"r":{"docs":{},"i":{"docs":{},"b":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},"e":{"docs":{},"?":{"docs":{"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}}}},"o":{"docs":{},"l":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":10.087939698492463}},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}},"s":{"docs":{},"i":{"docs":{},"d":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"e":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"n":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}}}}}}}}},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"s":{"docs":{},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}},"d":{"docs":{},"i":{"docs":{},"t":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}},"r":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.03},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{},"a":{"docs":{},"s":{"docs":{},"y":{"docs":{},"n":{"docs":{},"c":{"docs":{},",":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}}}},")":{"docs":{},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"s":{"docs":{},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},"l":{"docs":{},"y":{"docs":{},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"?":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"i":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}},"s":{"docs":{},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"l":{"docs":{},"l":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}},"d":{"docs":{},"e":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},",":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},":":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}},"s":{"docs":{},"t":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.005802707930367505},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}},"e":{"docs":{},"s":{"docs":{},":":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}},"u":{"docs":{},"s":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"g":{"docs":{},"h":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},",":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}}},"s":{"docs":{},"e":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},"s":{"docs":{},",":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"p":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}},"l":{"docs":{},"l":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.02512562814070352},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}},"s":{"docs":{},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}}}},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}},"f":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"c":{"docs":{},"h":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"e":{"docs":{},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"r":{"docs":{},"d":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.012875536480686695},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.01272264631043257},"development.html":{"ref":"development.html","tf":0.015384615384615385}},"e":{"docs":{},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},"s":{"docs":{},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},"!":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}},"d":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"n":{"docs":{},"e":{"docs":{},"l":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},"=":{"docs":{},"u":{"docs":{},"t":{"docs":{},"f":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}},"i":{"docs":{},"n":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":3.3479674796747965},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.018633540372670808},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":3.3492695883134127}},",":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}},"s":{"docs":{},".":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.012875536480686695},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055}}}}},"o":{"docs":{},"i":{"docs":{},"c":{"docs":{},"e":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"q":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.016877637130801686},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.012295081967213115},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.014506769825918761},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}},"u":{"docs":{},"d":{"docs":{},"e":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}}}},"u":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.01293103448275862}}}}}},"r":{"docs":{},"r":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"l":{"docs":{},"y":{"docs":{},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}},"t":{"docs":{},"x":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}},")":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}},"}":{"docs":{},")":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}},"c":{"docs":{},"]":{"docs":{},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"i":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.009685230024213076},"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":5.034168564920273},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":3.357213930348258},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.008802816901408451},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":5.015625},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":3.3499999999999996},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0169971671388102},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.007832898172323759},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":3.3502109704641345},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.014736842105263158},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.008964143426294821},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.02459016393442623},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.01293103448275862},"faq.html":{"ref":"faq.html","tf":0.012244897959183673}},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.008955223880597015},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"faq.html":{"ref":"faq.html","tf":0.01020408163265306}}},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},":":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"]":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},"s":{"docs":{},".":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}},"e":{"docs":{},":":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}}},"e":{"docs":{},"v":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":5.010178117048346}},"e":{"docs":{},"l":{"docs":{},"o":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"development.html":{"ref":"development.html","tf":5.015384615384615}},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},".":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}}}}},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":5.022222222222222},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.011406844106463879},"ring/static.html":{"ref":"ring/static.html","tf":0.03686635944700461},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":5.012422360248447},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00597609561752988},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.020080321285140562},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":5.066666666666666},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"s":{"docs":{},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}}},")":{"docs":{},".":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}},":":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}},".":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}}}}},"i":{"docs":{},"n":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.01056338028169014},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.008680555555555556},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.01},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.010548523206751054},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.01293103448275862}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},")":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},":":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}},"i":{"docs":{},"t":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},"s":{"docs":{},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}}},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"s":{"docs":{},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}},"b":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}},"i":{"docs":{},"r":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}},"g":{"docs":{},"n":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},",":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"s":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"l":{"docs":{},"o":{"docs":{},"y":{"docs":{"development.html":{"ref":"development.html","tf":0.03076923076923077}}}}}},"c":{"docs":{},"l":{"docs":{},"a":{"docs":{},"r":{"docs":{"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}}},"o":{"docs":{},"d":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"i":{"docs":{},"d":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"e":{"docs":{},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"b":{"docs":{},"u":{"docs":{},"g":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}},"g":{"docs":{},"r":{"docs":{},"a":{"docs":{},"d":{"docs":{},"e":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},"i":{"docs":{},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},"o":{"docs":{},"r":{"docs":{},"y":{"docs":{},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}},"l":{"docs":{},"i":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}},"s":{"docs":{},"c":{"docs":{},"u":{"docs":{},"s":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"f":{"docs":{},"f":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.01951219512195122},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.018633540372670808},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01593625498007968}},"e":{"docs":{},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":5.011494252873563},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.014285714285714285}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"i":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}},"l":{"docs":{},"y":{"docs":{},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},":":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}}}}}},"s":{"docs":{},")":{"docs":{},":":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}},"d":{"docs":{},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"r":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":3.3366666666666664},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"y":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":5.012738853503185},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.013539651837524178},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"o":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"n":{"docs":{},"e":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},":":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}},")":{"docs":{},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"'":{"docs":{},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"c":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.011389521640091117},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.008964143426294821},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}},"s":{"docs":{},"\"":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}}},"}":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}},"/":{"docs":{},"*":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},".":{"docs":{},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}},":":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"u":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"development.html":{"ref":"development.html","tf":0.03076923076923077}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},":":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}},"e":{"docs":{},"s":{"docs":{},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"w":{"docs":{},"n":{"docs":{},"s":{"docs":{},"i":{"docs":{},"d":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"g":{"docs":{},"r":{"docs":{},"a":{"docs":{},"d":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}}},"e":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}},"r":{"docs":{},"e":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}}}}},"d":{"docs":{},"\"":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}},"b":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}},"e":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.011940298507462687},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":5.053097345132743},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0113314447592068},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.005221932114882507},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"s":{"docs":{},".":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},":":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"x":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0169971671388102},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0069721115537848604},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.020080321285140562},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.044444444444444446},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"e":{"docs":{},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},",":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}},":":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}},"c":{"docs":{},"t":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},".":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}},"s":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":5.019108280254777},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}},"r":{"docs":{},"n":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}},"r":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"c":{"docs":{},"t":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"i":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"l":{"docs":{},"i":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":5.001760563380282},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.03017241379310345}}},"s":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}}}},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"]":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"/":{"docs":{},"p":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}}},"s":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.061946902654867256},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":3.4126534466477807},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.018633540372670808},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.009138381201044387},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.02459016393442623}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"i":{"docs":{},"n":{"docs":{},"f":{"docs":{},"o":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},"\"":{"docs":{},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}},".":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"s":{"docs":{},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"l":{"docs":{},"u":{"docs":{},"d":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"e":{"docs":{},"c":{"docs":{},"u":{"docs":{},"t":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"o":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941}}}}}}}}},".":{"docs":{},"g":{"docs":{},".":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.013824884792626729},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}},"a":{"docs":{},"s":{"docs":{},"i":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"l":{"docs":{},"i":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"e":{"docs":{},"r":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}},"y":{"docs":{},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"c":{"docs":{},"h":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525}}}}},"n":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},",":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}},".":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}}}}}},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.00847457627118644},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.012345679012345678},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}},"p":{"docs":{},"o":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.01},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},"s":{"docs":{},".":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}},".":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"o":{"docs":{},"u":{"docs":{},"g":{"docs":{},"h":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.02109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947}}}}}},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"e":{"docs":{},"r":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"u":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"h":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"s":{"docs":{},"u":{"docs":{},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"v":{"docs":{},"i":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}}}},"m":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}},"i":{"docs":{},"t":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}},"'":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},"b":{"docs":{},"e":{"docs":{},"d":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"f":{"docs":{},"f":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"l":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}},"m":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}},"e":{"docs":{},"g":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"l":{"docs":{},"y":{"docs":{},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}}},")":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}},"s":{"docs":{},"e":{"docs":{},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},"w":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}},"t":{"docs":{},"a":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}},"c":{"docs":{},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}},"d":{"docs":{},"n":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}},",":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}},"e":{"docs":{},"n":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"t":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.012875536480686695},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"s":{"docs":{},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}},"r":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843}}}}}}}}}},"]":{"docs":{},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}},"f":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},",":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},"e":{"docs":{},"r":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.006033182503770739},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}},".":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"?":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"!":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"s":{"docs":{},"t":{"docs":{"performance.html":{"ref":"performance.html","tf":0.006033182503770739}}}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}},"i":{"docs":{},"l":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.011940298507462687},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.012285012285012284},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{},".":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}},":":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}},"s":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}},"l":{"docs":{},"s":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"e":{"docs":{},"}":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"]":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"l":{"docs":{},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"q":{"docs":{"faq.html":{"ref":"faq.html","tf":10}}}},"i":{"docs":{},"r":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}},"l":{"docs":{},"e":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.03686635944700461},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}},")":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},":":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}},"s":{"docs":{},".":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"p":{"docs":{},"p":{"docs":{},",":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}},"n":{"docs":{},"d":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}},"x":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},"e":{"docs":{},"l":{"docs":{},"d":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.018867924528301886}},".":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}}}},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}},",":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}},"e":{"docs":{},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"a":{"docs":{},"g":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.012875536480686695}},",":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}},"m":{"docs":{},"e":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"s":{"docs":{},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}}}},"n":{"docs":{},"k":{"docs":{},"l":{"docs":{},"i":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}},"u":{"docs":{},"n":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.008955223880597015},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"ring/ring.html":{"ref":"ring/ring.html","tf":0.008695652173913044},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.016666666666666666},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.03},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.017167381974248927},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.05737704918032787},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.005802707930367505},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.017811704834605598},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"s":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},":":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}},".":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}},",":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},".":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}},"l":{"docs":{},"l":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.00816326530612245}},"i":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}},"o":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},":":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678}}}}}}}}}},"r":{"docs":{},"c":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}},"m":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":3.3459119496855343}},"a":{"docs":{},"t":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.02654867256637168},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992}},"t":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},".":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}},"]":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},"s":{"docs":{},".":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{},"s":{"docs":{},",":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}},")":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}}},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.01020408163265306}},"e":{"docs":{},",":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"s":{"docs":{},".":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}}}},"w":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"l":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"n":{"docs":{},"?":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}},"m":{"docs":{},")":{"docs":{},")":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.015209125475285171},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":3.341831916902738},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.049689440993788817},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.06666666666666667},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.02575107296137339},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.01639344262295082},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.009685230024213076},"ring/ring.html":{"ref":"ring/ring.html","tf":0.03130434782608696},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.015625},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":5.04},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":5.0494296577946765},"ring/static.html":{"ref":"ring/static.html","tf":0.041474654377880185},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.013333333333333334},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.01951219512195122},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.053824362606232294},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.01174934725848564},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.0379746835443038},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.012948207171314742},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01593625498007968},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.01293103448275862},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"}":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"]":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"]":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}},"]":{"docs":{},")":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},")":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}},")":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}},")":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984}},"]":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}},")":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}},")":{"docs":{},")":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805}}}}}}}}},"\"":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"]":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}},")":{"docs":{},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}}}},"]":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}}}}},")":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},")":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152}},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}},")":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"]":{"docs":{},"]":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}},")":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}},".":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},"}":{"docs":{},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"]":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"}":{"docs":{},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"]":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},".":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.013824884792626729},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"s":{"docs":{},")":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},".":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}},"/":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}}},",":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},":":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}},",":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},"e":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"r":{"docs":{},"d":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"d":{"docs":{},")":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"e":{"docs":{},"r":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}},"v":{"docs":{},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"s":{"docs":{},"h":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}},"c":{"docs":{},"k":{"docs":{},"i":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"e":{"docs":{},"l":{"docs":{},"p":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.004835589941972921}}}}}},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}},"s":{"docs":{},".":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}},"r":{"docs":{},"e":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},"'":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"i":{"docs":{},"g":{"docs":{},"h":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333}}}}}}},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.01764705882352941},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}},"s":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"/":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},"/":{"docs":{},"b":{"docs":{},"l":{"docs":{},"o":{"docs":{},"b":{"docs":{},"/":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"/":{"docs":{},"r":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}},"p":{"docs":{},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},"/":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"/":{"docs":{},"p":{"docs":{},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224}}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112}}}}}},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"q":{"docs":{},"u":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},".":{"docs":{},"n":{"docs":{},"e":{"docs":{},"t":{"docs":{},"/":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"s":{"docs":{},"/":{"2":{"0":{"1":{"8":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}},"w":{"docs":{},"w":{"docs":{},"w":{"docs":{},".":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"d":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"/":{"docs":{},"r":{"docs":{},"/":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"s":{"docs":{},"/":{"9":{"docs":{},"c":{"docs":{},"s":{"docs":{},"m":{"docs":{},"t":{"docs":{},"y":{"docs":{},"/":{"docs":{},"w":{"docs":{},"h":{"docs":{},"y":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"/":{"1":{"docs":{},".":{"1":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}},"docs":{}}},"docs":{}},"i":{"docs":{},"e":{"docs":{},":":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"3":{"0":{"0":{"0":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"k":{"docs":{},".":{"docs":{},"o":{"docs":{},"r":{"docs":{},"g":{"docs":{},"/":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}}}}}}}}}}},"]":{"docs":{},")":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}},"m":{"docs":{},"l":{"5":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.017167381974248927}}},"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}},"g":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"r":{"docs":{},"c":{"docs":{},"h":{"docs":{},"i":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},"d":{"docs":{},"d":{"docs":{},"e":{"docs":{},"n":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.03773584905660377}}}}}},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"i":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.030042918454935622}}},"y":{"docs":{},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}},"t":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"l":{"docs":{},"d":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}},"c":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}},"w":{"docs":{},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}},"s":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"u":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}}}}},"w":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"i":{"7":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.01639344262295082},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.02464788732394366},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.03225806451612903},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.03125},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805}}}},"}":{"docs":{},"]":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}},"]":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}},"]":{"docs":{},")":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}},")":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},"}":{"docs":{"./":{"ref":"./","tf":0.004842615012106538}},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}},"\"":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}},"/":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}},"\"":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787}}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}},"/":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}},"]":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.02512562814070352},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"i":{"docs":{},"t":{"docs":{},"y":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"}":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}},"}":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}},")":{"docs":{},")":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}},")":{"docs":{},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"f":{"docs":{},"i":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}},"a":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"n":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"e":{"docs":{},"g":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.04},"frontend/browser.html":{"ref":"frontend/browser.html","tf":5.008583690987124}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.009685230024213076},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":10.064705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.040160642570281124},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.022222222222222223},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":5.222222222222222},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":3.381142098273572},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},")":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"s":{"docs":{},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}},"?":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}},")":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224}}},",":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},":":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984}}}}}}}}},"n":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"a":{"docs":{},"l":{"docs":{},")":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"t":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"v":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"f":{"docs":{},"a":{"docs":{},"c":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"t":{"docs":{"./":{"ref":"./","tf":10.002421307506053}}}}}}}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},"}":{"docs":{},"}":{"docs":{},"}":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258}}}}}},"?":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.008680555555555556}}},"}":{"docs":{},"}":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},"}":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},",":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}},"]":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}},",":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}},"o":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}},"e":{"docs":{},".":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"n":{"docs":{},"c":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}},"e":{"docs":{},",":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}},".":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}}},"l":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"development.html":{"ref":"development.html","tf":0.06153846153846154}}}},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"r":{"docs":{},"u":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}},"c":{"docs":{},"t":{"docs":{"development.html":{"ref":"development.html","tf":5.015384615384615}}}}}}},"p":{"docs":{},"i":{"docs":{},"r":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}},"i":{"docs":{},"d":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"f":{"docs":{},"o":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"r":{"docs":{},"m":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},":":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.007371007371007371}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"d":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.008955223880597015},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},":":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},"s":{"docs":{},",":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}}}},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}}},"k":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"d":{"docs":{},"i":{"docs":{},"v":{"docs":{},"i":{"docs":{},"d":{"docs":{},"u":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}}}}},"c":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"e":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"x":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"c":{"docs":{},"l":{"docs":{},"u":{"docs":{},"d":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"development.html":{"ref":"development.html","tf":0.015384615384615385}},"e":{"docs":{},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"i":{"docs":{},"t":{"docs":{},"!":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},"i":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.01639344262295082}}}}},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"g":{"docs":{},"n":{"docs":{},"o":{"docs":{},"r":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}},"t":{"docs":{},"'":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}}},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},"s":{"docs":{},"e":{"docs":{},"l":{"docs":{},"f":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},")":{"docs":{},",":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}}},".":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"?":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},"e":{"docs":{},"m":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.010050251256281407}}},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},".":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}}}}},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.017241379310344827}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},":":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}}}}}}}}},"i":{"docs":{},"c":{"docs":{},"i":{"docs":{},"t":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}},"l":{"docs":{},"i":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}},"m":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"}":{"docs":{},")":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}},"s":{"docs":{},"s":{"docs":{},"u":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}},"e":{"docs":{},"s":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"o":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},".":{"docs":{},"e":{"docs":{},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"l":{"2":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"3":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}},"r":{"docs":{},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"s":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"y":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},":":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}}}}},"r":{"docs":{},"g":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"e":{"docs":{},"!":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}},"f":{"docs":{},"t":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}}},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"b":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},"r":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.01020408163265306}}},"y":{"docs":{},"?":{"docs":{"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}}},"s":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}},"n":{"docs":{},"k":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}}}}},"e":{"docs":{},"a":{"docs":{},"f":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},"n":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}},"v":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"v":{"docs":{},"e":{"docs":{},"l":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/ring.html":{"ref":"ring/ring.html","tf":0.01217391304347826},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"development.html":{"ref":"development.html","tf":0.015384615384615385}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"n":{"docs":{},"g":{"docs":{},"t":{"docs":{},"h":{"docs":{},":":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}}}},"t":{"docs":{},"'":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.007736943907156673},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}}},"s":{"docs":{},"s":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"f":{"docs":{},"t":{"docs":{},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},")":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"i":{"docs":{},"n":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}},"o":{"docs":{},"g":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}},"i":{"docs":{},"c":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},",":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"]":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"v":{"docs":{},"e":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}},"o":{"docs":{},"k":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"u":{"docs":{},"p":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.006033182503770739}},"s":{"docs":{},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"a":{"docs":{},"d":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055}},"e":{"docs":{},"r":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}},")":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}},"l":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},"l":{"docs":{},"y":{"docs":{},":":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}}}}},"n":{"docs":{},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"u":{"docs":{},"p":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}}},"m":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.04938271604938271},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.01834862385321101},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.008802816901408451},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.015625},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.021052631578947368},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.04},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.017587939698492462},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0183752417794971},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.017241379310344827},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.006033182503770739},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"?":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},",":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678}}},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}},",":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}}},".":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}},"s":{"docs":{},".":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}},")":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},")":{"docs":{},")":{"docs":{},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}},":":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804}}},"]":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}}}},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"?":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"p":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}},",":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},"s":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"g":{"docs":{},"i":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}}},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"u":{"docs":{},"d":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"performance.html":{"ref":"performance.html","tf":0.004524886877828055}},"e":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}},"k":{"docs":{},"e":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"l":{"docs":{},"l":{"docs":{},"i":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}},"n":{"docs":{},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}},"a":{"docs":{},"g":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"i":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},"f":{"docs":{},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}},"p":{"docs":{},"u":{"docs":{},"l":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}}}}}}},"c":{"docs":{},"r":{"docs":{},"o":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"c":{"docs":{},"h":{"docs":{},"i":{"docs":{},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"p":{"docs":{},"r":{"docs":{},"o":{"1":{"1":{"docs":{},",":{"3":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"docs":{}}},"docs":{}},"docs":{}}}}}}}},"h":{"docs":{},"i":{"docs":{},"n":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"y":{"docs":{},"b":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}},"r":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"g":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":5.017699115044247},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"e":{"docs":{},"s":{"docs":{},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},",":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}},".":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}},".":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/ring.html":{"ref":"ring/ring.html","tf":0.029565217391304348},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.04},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.007832898172323759},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.010526315789473684},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":3.40251572327044},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.006033182503770739}},".":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}},")":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},"s":{"docs":{},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},"]":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}},"a":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"r":{"docs":{},"g":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.006769825918762089}},"e":{"docs":{},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},"d":{"docs":{},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}},"a":{"docs":{},"n":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},"s":{"docs":{},"u":{"docs":{},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.004524886877828055}},"e":{"docs":{},"?":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"m":{"docs":{},"o":{"docs":{},"r":{"docs":{},"y":{"docs":{},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"i":{"docs":{},"d":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/ring.html":{"ref":"ring/ring.html","tf":0.02608695652173913},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":3.413333333333333},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":3.3723577235772355},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":5.056768558951965},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0226628895184136},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":5.086956521739131},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.022222222222222223},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.018276762402088774},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.029535864978902954},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":5.0336842105263155},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.010956175298804782},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.03773584905660377},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},"e":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.018633540372670808},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941}}},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},")":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"]":{"docs":{},")":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},"}":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}},"}":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}},"/":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"s":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"p":{"docs":{},"e":{"docs":{},"l":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}}}}}},",":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},":":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"n":{"docs":{},"i":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}},"x":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"c":{"docs":{},"r":{"docs":{},"o":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"development.html":{"ref":"development.html","tf":0.046153846153846156},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"a":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},"e":{"docs":{},")":{"docs":{},".":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}},"s":{"docs":{},":":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},":":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"i":{"docs":{},"f":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"i":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"e":{"docs":{},"d":{"docs":{},"?":{"docs":{},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}}}}},"e":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"s":{"docs":{},".":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},",":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}},".":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}},"r":{"docs":{},"e":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.004524886877828055}},".":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0069721115537848604},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{},"\"":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}},"s":{"docs":{},"t":{"docs":{},"l":{"docs":{},"i":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"v":{"docs":{},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"l":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.031055900621118012},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223}},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},",":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}},".":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}}}}},"c":{"docs":{},"h":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}}}},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"j":{"docs":{},"a":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.019753086419753086}},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"m":{"docs":{},"u":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"j":{"docs":{},"a":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}}}}}}}},"/":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}}}}}}}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"n":{"docs":{},"c":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}},"m":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}},"b":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.014527845036319613},"basics/router.html":{"ref":"basics/router.html","tf":0.03375527426160337},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":3.3792048929663605},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.01639344262295082},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.017241379310344827},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}},"s":{"docs":{},":":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}},"p":{"docs":{},"a":{"docs":{},"c":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"e":{"docs":{},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},".":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},"s":{"docs":{},".":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}},".":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}},"!":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}},".":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},"}":{"docs":{},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"i":{"docs":{},"v":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}},"v":{"docs":{},"i":{"docs":{},"g":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.017587939698492462}}}}},"n":{"docs":{},"o":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"i":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.021791767554479417},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.024691358024691357},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.01834862385321101},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.011406844106463879},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.008704061895551257},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.009174311926605505},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}},"]":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}},":":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}},"}":{"docs":{},")":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}},")":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}},".":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}},"]":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"]":{"docs":{},")":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889}}}}},"}":{"docs":{},")":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}},")":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},".":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"c":{"docs":{},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"r":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},",":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}}}}},"e":{"docs":{},"e":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.005802707930367505},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"s":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.012572533849129593}},"e":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}}}}},"w":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.009876543209876543},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.007736943907156673},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"development.html":{"ref":"development.html","tf":0.015384615384615385}}},"g":{"docs":{},"o":{"docs":{},"t":{"docs":{},"i":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":5.012345679012346},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.044444444444444446}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}},",":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}},"x":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}}},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},",":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}},"n":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"e":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"t":{"docs":{},"e":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"performance.html":{"ref":"performance.html","tf":0.004524886877828055}}}},"h":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"\"":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"i":{"docs":{},"c":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}}},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"w":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.004835589941972921},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.022900763358778626}}}},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"s":{"docs":{},",":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}},"s":{"1":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}}},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"e":{"docs":{},"s":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}}}}}}},"2":{"docs":{},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"]":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}}}}},"3":{"docs":{},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}}},".":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}},"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"p":{"docs":{},"m":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.040983606557377046}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.010416666666666666},"ring/ring.html":{"ref":"ring/ring.html","tf":0.010434782608695653},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.055299539170506916},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.019753086419753086},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"y":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},"s":{"docs":{},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.02109704641350211}},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},")":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}},":":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"]":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},".":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},".":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},":":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}},",":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}},"m":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"s":{"docs":{},"]":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"]":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421}}},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}},"a":{"docs":{},"q":{"docs":{},"u":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}},"e":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{},"s":{"docs":{},"o":{"docs":{},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}},"s":{"docs":{},"/":{"docs":{},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}}}}},"r":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.007541478129713424},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{},")":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},":":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}},"i":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}}},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"n":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.017241379310344827},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}},"c":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"e":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}},"l":{"docs":{},"y":{"docs":{},")":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"e":{"docs":{},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"s":{"docs":{},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"s":{"docs":{},":":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.004524886877828055}},"r":{"docs":{},"i":{"docs":{},"d":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}},"d":{"docs":{},"e":{"docs":{},"n":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}},"a":{"docs":{},"l":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"f":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}},"m":{"docs":{},"i":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},"u":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"s":{"docs":{},"i":{"docs":{},"d":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"p":{"docs":{},"u":{"docs":{},"t":{"docs":{},":":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}},"*":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}},"k":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"t":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{},"w":{"docs":{},"i":{"docs":{},"s":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}}},"l":{"docs":{},"d":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{"./":{"ref":"./","tf":0.014527845036319613},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.022935779816513763},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.008802816901408451},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.016971279373368148},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.03773584905660377},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"e":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.022598870056497175},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.013761467889908258},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.014084507042253521},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.018633540372670808},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.020887728459530026},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.03},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.020100502512562814},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"e":{"docs":{},"r":{"docs":{},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"s":{"docs":{},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804}}},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}},"/":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},".":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"s":{"docs":{},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}},"}":{"docs":{},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}},"}":{"docs":{},"}":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}},"]":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},".":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204}}}}}},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}},",":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678}}}}}}}}}},"c":{"docs":{},"i":{"docs":{},"p":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"l":{"docs":{},"i":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},"s":{"docs":{},":":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}},"}":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"s":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}},"t":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.04519774011299435},"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":3.4320987654320985},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.01834862385321101},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.028688524590163935},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.03225806451612903},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.03125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.01639344262295082},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.022243713733075435},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.022988505747126436},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"performance.html":{"ref":"performance.html","tf":0.00904977375565611},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}},"s":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},":":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152}}}},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}},",":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"]":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"c":{"docs":{},"h":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}},"g":{"docs":{},"e":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},".":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"s":{"docs":{},"s":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}},"c":{"docs":{},"k":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},".":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}}}},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.009685230024213076},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":10.040160642570282},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.004524886877828055},"faq.html":{"ref":"faq.html","tf":0.0163265306122449}},"a":{"docs":{},"l":{"docs":{},"'":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},".":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},"]":{"docs":{},")":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}},":":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},")":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"?":{"docs":{"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}}}}},"r":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"f":{"docs":{"performance.html":{"ref":"performance.html","tf":0.010558069381598794}},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"performance.html":{"ref":"performance.html","tf":10.00603318250377},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}},"a":{"docs":{},"n":{"docs":{},"c":{"docs":{},"e":{"docs":{},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"s":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"t":{"docs":{},"y":{"docs":{},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}},"l":{"docs":{},"u":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"g":{"docs":{},"g":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/coercion.html":{"ref":"ring/coercion.html","tf":5},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"faq.html":{"ref":"faq.html","tf":0.00816326530612245}}}}}}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":5.016129032258065},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}},"c":{"docs":{},"e":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},".":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}},"e":{"docs":{},"a":{"docs":{},"s":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"r":{"docs":{},"e":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"f":{"docs":{},"i":{"docs":{},"x":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"l":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}},"e":{"docs":{},"r":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.007371007371007371}}},"s":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}}},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}},"y":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"}":{"docs":{},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.011940298507462687},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}}}}}}}}}},"]":{"docs":{},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}}},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}},":":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"v":{"docs":{},"i":{"docs":{},"o":{"docs":{},"u":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"e":{"docs":{},"w":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}}}}},"c":{"docs":{},"i":{"docs":{},"s":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},"u":{"docs":{},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}}}},"m":{"docs":{},"p":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}}}}}}}},"o":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"g":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"y":{"docs":{},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}}}},"t":{"docs":{},"o":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},":":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}},",":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}}}},"v":{"docs":{},"i":{"docs":{},"d":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}},"e":{"docs":{},"n":{"docs":{"faq.html":{"ref":"faq.html","tf":0.006122448979591836}}}}},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},".":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},":":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}},"s":{"docs":{},".":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}},"d":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}},"u":{"docs":{},"c":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}},"t":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}}}}}}}},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},".":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}},"o":{"docs":{},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"s":{"docs":{},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"s":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"m":{"docs":{},"e":{"docs":{},"s":{"docs":{},"a":{"docs":{},".":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}},"i":{"docs":{},"s":{"docs":{},"e":{"docs":{},":":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}}}},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{},"y":{"docs":{},",":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}},".":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},":":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}},"o":{"docs":{},"f":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"n":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"faq.html":{"ref":"faq.html","tf":0.006122448979591836}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"e":{"docs":{},"r":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"s":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}},"c":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}},"!":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"h":{"docs":{},"o":{"docs":{},"t":{"docs":{},"o":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{},"'":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}},"s":{"docs":{},"h":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}},"r":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},":":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}},"s":{"docs":{},"h":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}},"t":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}},"l":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"o":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}},"s":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.017241379310344827},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"?":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}},")":{"docs":{},"\"":{"docs":{},"}":{"docs":{},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"}":{"docs":{},"}":{"docs":{},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}}}}}}},"s":{"docs":{},"i":{"docs":{},"b":{"docs":{},"l":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"e":{"docs":{},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}}}}}},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"f":{"docs":{},"u":{"docs":{},"l":{"docs":{},".":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}},"r":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"h":{"docs":{},"j":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"r":{"docs":{},"t":{"docs":{},"a":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}},"k":{"docs":{},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749}}}},"z":{"docs":{},"z":{"docs":{},"a":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"r":{"docs":{},"]":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},")":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}},"e":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.04116222760290557},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.013100436681222707},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.01764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.028112449799196786},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.016666666666666666},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.02575107296137339},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.012066365007541479},"faq.html":{"ref":"faq.html","tf":0.04897959183673469}},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}},"e":{"docs":{},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}},":":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}},"e":{"docs":{},"r":{"docs":{},"g":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},")":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}}}}}},".":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"i":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}}}}}}},"s":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795}}}}}}}}}}}}}}}},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"!":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}}}}}}}}}}}}},"i":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"/":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}}}}}}}}}}},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"e":{"docs":{},"c":{"docs":{},"u":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"s":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}},".":{"docs":{},"s":{"docs":{},"i":{"docs":{},"e":{"docs":{},"p":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"e":{"docs":{},"c":{"docs":{},"u":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"/":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"d":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}}}},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"y":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}},")":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"r":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"c":{"docs":{},"r":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}}}}},".":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},"/":{"docs":{},"p":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"/":{"docs":{},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},":":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"/":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"d":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}}}}}},"_":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"$":{"docs":{},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{},"_":{"docs":{},"b":{"docs":{},"o":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"@":{"5":{"9":{"docs":{},"f":{"docs":{},"d":{"docs":{},"d":{"docs":{},"a":{"docs":{},"b":{"docs":{},"b":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}}}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"/":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}},"r":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},".":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"s":{"docs":{},".":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223}}}}}}}}}}}}}}}}}},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"/":{"docs":{},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"j":{"docs":{},"a":{"docs":{},"/":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.08888888888888889}}}}}}}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223}}}}}}}}}}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},"/":{"docs":{},"p":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}}},".":{"docs":{},"d":{"docs":{},"e":{"docs":{},"v":{"docs":{},"/":{"docs":{},"p":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}},".":{"docs":{},"e":{"docs":{},"a":{"docs":{},"s":{"docs":{},"i":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}},"y":{"docs":{},":":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}}},":":{"docs":{"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}}}}}},"q":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.008802816901408451},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625},"ring/ring.html":{"ref":"ring/ring.html","tf":0.01565217391304348},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.013333333333333334},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.024390243902439025},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0113314447592068},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.031055900621118012},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.024691358024691357},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.010443864229765013},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.021052631578947368},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00597609561752988},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.0440251572327044},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.044444444444444446},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.010526315789473684}},")":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},")":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}},"}":{"docs":{},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}},"]":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}},"}":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}},"}":{"docs":{},"]":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"]":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},":":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}},",":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}},"i":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.010526315789473684},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"e":{"docs":{},"d":{"docs":{},")":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}},"s":{"docs":{},"o":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"faq.html":{"ref":"faq.html","tf":0.00816326530612245}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},":":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"v":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.01639344262295082},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"u":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":5.050691244239632},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.010050251256281407}},"e":{"docs":{},"s":{"docs":{},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0113314447592068},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.022222222222222223},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.014360313315926894},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.031578947368421054},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0069721115537848604},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223}},"e":{"docs":{},"s":{"docs":{},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421}}},",":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},":":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}},"]":{"docs":{},"}":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}},".":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},")":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}},"\"":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}},":":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},"]":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}},"d":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"s":{"docs":{},",":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}}},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":3.3459119496855343},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"(":{"docs":{},"i":{"docs":{},"s":{"docs":{},"h":{"docs":{},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"e":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":5.015625},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"e":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805}}}}}},")":{"docs":{},"}":{"docs":{},")":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"n":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.024691358024691357},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}},",":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}}}}}}},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"v":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}},"h":{"docs":{},"r":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}}}},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}},".":{"docs":{},"j":{"docs":{},"s":{"docs":{},",":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}},"d":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"e":{"docs":{},",":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}},")":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"i":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}},"e":{"docs":{},"r":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}},"m":{"docs":{},"e":{"docs":{},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},":":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}},"l":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"performance.html":{"ref":"performance.html","tf":0.006033182503770739}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"i":{"docs":{},"c":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"l":{"docs":{},"i":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"y":{"docs":{},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"c":{"docs":{},"u":{"docs":{},"r":{"docs":{},"s":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.004835589941972921}},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.02},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"s":{"docs":{},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"g":{"docs":{},"n":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}}}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"g":{"docs":{},"e":{"docs":{},"x":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":5.021834061135372},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},"y":{"docs":{},",":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}},".":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},":":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}},"?":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}}}},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"k":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333}},"s":{"docs":{},"\"":{"docs":{},"}":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}}}}}},"o":{"docs":{},"v":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"e":{"docs":{},"m":{"docs":{},"b":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}}},"p":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}},"a":{"docs":{},"c":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}},"`":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"o":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}}}}}}}},"f":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366}},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}},"e":{"docs":{},"s":{"docs":{},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.011406844106463879}}}}}}}},"l":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}},"e":{"docs":{},"v":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}},"o":{"docs":{},"a":{"docs":{},"d":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}}}},"a":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"u":{"docs":{},"s":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"e":{"docs":{},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"./":{"ref":"./","tf":0.012106537530266344},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"ring/ring.html":{"ref":"ring/ring.html","tf":5.022608695652174},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0234375},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":3.336166194523135},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.018633540372670808},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.022222222222222223},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},",":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},".":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"s":{"docs":{},"/":{"docs":{},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}}}}}}}}}}}}}}}}}}}}},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}}}}},":":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.021791767554479417},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":5.0423728813559325},"basics/router.html":{"ref":"basics/router.html","tf":0.0759493670886076},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":3.3703703703703702},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":3.356269113149847},"basics/route_data.html":{"ref":"basics/route_data.html","tf":5.063781321184511},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":3.369154228855721},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":5.061475409836065},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.01936619718309859},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":5.015625},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.013824884792626729},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.013333333333333334},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.009138381201044387},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":3.3502109704641345},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.035789473684210524},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.018924302788844622},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.01764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.024096385542168676},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.02575107296137339},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.03015075376884422},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.11475409836065574},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.037717601547388784},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.04597701149425287},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":5.031941031941032},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.04834605597964377},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":5.0344827586206895},"performance.html":{"ref":"performance.html","tf":0.043740573152337855},"faq.html":{"ref":"faq.html","tf":0.07346938775510205}},"e":{"docs":{},"r":{"2":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"docs":{"./":{"ref":"./","tf":0.03389830508474576},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.00847457627118644},"basics/router.html":{"ref":"basics/router.html","tf":10.050632911392405},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.04938271604938271},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.029612756264236904},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.008955223880597015},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.03278688524590164},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.02112676056338028},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625},"ring/ring.html":{"ref":"ring/ring.html","tf":5.013913043478261},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.015625},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.013100436681222707},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.030042918454935622},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":5.032786885245901},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":5.0638297872340425},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":5.1321839080459775},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.027989821882951654},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414},"performance.html":{"ref":"performance.html","tf":0.00904977375565611},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}},")":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/router.html":{"ref":"basics/router.html","tf":0.02531645569620253},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.004835589941972921},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218}},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},":":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}},":":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"s":{"docs":{},".":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218}}},"?":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.006033182503770739}}},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},"?":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},"!":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}},"}":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"]":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}},")":{"docs":{},")":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}},"s":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.022988505747126436}}},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.004835589941972921},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},")":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}},")":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.012295081967213115},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},")":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}},":":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}}},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},".":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.017241379310344827}}},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.014742014742014743}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.009685230024213076},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}},",":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}},".":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},")":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678}}},"?":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}},"o":{"docs":{},"t":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366}},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"l":{"docs":{},"e":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.012738853503184714},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}},"s":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}},":":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}},"]":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422}},"}":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633}},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}}}}},"]":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"]":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"a":{"docs":{},"w":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}},"c":{"docs":{},"k":{"docs":{},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"i":{"docs":{},"s":{"docs":{},"e":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},")":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}}},"]":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}},"l":{"docs":{},"s":{"docs":{},")":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}},"d":{"docs":{},"i":{"docs":{},"x":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"e":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893}}}}}}}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"s":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}}}}},"s":{"docs":{},"/":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"d":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.014925373134328358}},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"}":{"docs":{},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}}}},"]":{"docs":{},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}},"u":{"docs":{},"n":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055},"performance.html":{"ref":"performance.html","tf":0.004524886877828055},"development.html":{"ref":"development.html","tf":0.015384615384615385}},"t":{"docs":{},"i":{"docs":{},"m":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}},"l":{"docs":{},"e":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}},"s":{"docs":{},")":{"docs":{},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}},"b":{"docs":{},"y":{"docs":{},"'":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}},"c":{"docs":{},"s":{"docs":{},"/":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}}}},"]":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"r":{"docs":{},"c":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}}},"]":{"docs":{},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}},"s":{"docs":{},"/":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"d":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843}}}}}}}},"]":{"docs":{},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}},"f":{"docs":{},"c":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}},"e":{"docs":{},"]":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}},"s":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":5.016129032258065},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},":":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},".":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}}}}}}},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}},"s":{"docs":{},",":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{},"o":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"o":{"docs":{},"p":{"docs":{},"e":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"i":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"i":{"docs":{},"f":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},"e":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"l":{"docs":{},"y":{"docs":{},".":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}}}}}}}},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.01},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.018633540372670808},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"i":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"a":{"docs":{},"l":{"docs":{},")":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}},"c":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},",":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},"]":{"docs":{},")":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}},".":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}},"s":{"docs":{},")":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"u":{"docs":{},"p":{"docs":{},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}}},"l":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}},"r":{"docs":{},"v":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.03686635944700461},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00796812749003984},"performance.html":{"ref":"performance.html","tf":0.004524886877828055},"development.html":{"ref":"development.html","tf":0.015384615384615385}},"e":{"docs":{},"r":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}},"s":{"docs":{},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},":":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}},")":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},"]":{"docs":{},")":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}},".":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"d":{"docs":{},".":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"s":{"docs":{},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"a":{"docs":{},"m":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"l":{"docs":{},"i":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}}}},"r":{"docs":{},"c":{"docs":{},"h":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}},"i":{"docs":{},"e":{"docs":{},"p":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":10.027777777777779}},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"e":{"docs":{},"c":{"docs":{},"u":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976}}}}}}}}}}}}}},"]":{"docs":{},")":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}},".":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}},":":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"e":{"docs":{},",":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}},"i":{"docs":{},"l":{"docs":{},"a":{"docs":{},"r":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"n":{"docs":{},"g":{"docs":{},"l":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"d":{"docs":{},"e":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}},"g":{"docs":{},"h":{"docs":{},"t":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}},"l":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}},"t":{"docs":{},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"z":{"docs":{},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"l":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}},"s":{"docs":{},"h":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":5.0418250950570345},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},",":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}},".":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}},"e":{"docs":{},"s":{"docs":{},".":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}}},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"u":{"docs":{},"r":{"docs":{},"p":{"docs":{},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"o":{"docs":{},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.004524886877828055}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"s":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},",":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.03582089552238806},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.019097222222222224},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":5.015625},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.006527415143603133},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.016877637130801686},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.008421052631578947},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.013944223107569721},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.012285012285012284},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.009828009828009828}}},"s":{"docs":{},".":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}},")":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}}},"?":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}},"]":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"i":{"docs":{},"f":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},"i":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},":":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}},"a":{"docs":{},"l":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"l":{"docs":{},"l":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}},"/":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"s":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343}}}}}}},"]":{"docs":{},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}},"e":{"docs":{},"d":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},":":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"a":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"a":{"docs":{},"n":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}},"t":{"docs":{},"y":{"docs":{},"l":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.017587939698492462},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"\"":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},")":{"docs":{},")":{"docs":{},"}":{"docs":{},"]":{"docs":{},"}":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}}}}}},"t":{"docs":{},"i":{"docs":{},"c":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":5.018433179723503},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.004835589941972921},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.022988505747126436},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"u":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}},"s":{"docs":{},")":{"docs":{},"]":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"e":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.012875536480686695},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"c":{"docs":{},"k":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},",":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"y":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}},"b":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"o":{"docs":{},"p":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.01256281407035176}},"\"":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"r":{"docs":{},"e":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463}}}}},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"s":{"docs":{},",":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.009174311926605505}}},":":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804}}}},"?":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}},",":{"docs":{"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}},"p":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843}}}}}},"e":{"docs":{},"a":{"docs":{},"m":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"]":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"e":{"docs":{},"p":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"s":{"docs":{},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}},"s":{"docs":{},"t":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}},"/":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444}}}}}}}}},"]":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"u":{"docs":{},"p":{"docs":{},"p":{"docs":{},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.009685230024213076},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":5.00398406374502},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.014285714285714285}},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},":":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}},":":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}},"s":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},"e":{"docs":{},"r":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}},"c":{"docs":{},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}},"f":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},"i":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}},"h":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"b":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}},"i":{"docs":{},"t":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},")":{"docs":{},"]":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"r":{"docs":{},"e":{"docs":{},".":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"i":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}}},"n":{"docs":{},".":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}}},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"2":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"docs":{"./":{"ref":"./","tf":0.007263922518159807},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":5.059760956175299},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"/":{"docs":{},"s":{"docs":{},"r":{"docs":{},"c":{"docs":{},"/":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"/":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"c":{"docs":{},"l":{"docs":{},"j":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984}},".":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"http/default_interceptors.html":{"ref":"http/default_interceptors.html","tf":0.022222222222222223}}}}}}}}}}}}}}}}}}}}}}}}}},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}}},"p":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.008032128514056224},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"y":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"x":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":5.011299435028248},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"faq.html":{"ref":"faq.html","tf":0.01020408163265306}},":":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},",":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"c":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}},"h":{"docs":{},"r":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112}}}}}}}},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},".":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.02},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"p":{"docs":{},"l":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"t":{"docs":{},"i":{"docs":{},"s":{"docs":{},"f":{"docs":{},"i":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}}}},"f":{"docs":{},"e":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}},"n":{"docs":{},"e":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"!":{"docs":{},"?":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}},"v":{"docs":{},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"h":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":5.012931034482759}}}},"p":{"docs":{},"e":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}},"i":{"docs":{},"p":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}},"p":{"docs":{},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}},"n":{"docs":{},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"w":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"]":{"docs":{},")":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}},"/":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.005221932114882507}},"}":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}},"}":{"docs":{},"]":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258}},")":{"docs":{},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258}}}}},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}},"y":{"docs":{},"}":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{},"l":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},")":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},"s":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},"n":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},"*":{"docs":{},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}},"o":{"docs":{},"l":{"docs":{},"v":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}},"u":{"docs":{},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.007633587786259542}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"i":{"docs":{},"m":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}},"h":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"w":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}},"u":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"e":{"docs":{},"\"":{"docs":{},".":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}},":":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"q":{"docs":{},"l":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}}},"n":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"i":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"t":{"docs":{},"o":{"docs":{},"o":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},"s":{"docs":{},".":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"l":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}},"l":{"docs":{},"/":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"s":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}},"c":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}},"e":{"docs":{},"/":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},",":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}}}}}}}}}}},":":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}},".":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},")":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"k":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"p":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/ring.html":{"ref":"ring/ring.html","tf":0.010434782608695653},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}},".":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}},"d":{"docs":{},"o":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556}}}}}}}}},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}}}},",":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},":":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}},"r":{"docs":{},"u":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}},",":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}},"}":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"]":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.012295081967213115}},"]":{"docs":{},")":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}},")":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},")":{"docs":{},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"s":{"docs":{},"t":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"e":{"docs":{},"e":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.012658227848101266},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},":":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.012658227848101266},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"s":{"docs":{},",":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},".":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},")":{"docs":{},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"a":{"docs":{},"n":{"docs":{},"s":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":3.3430894308943087},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":3.3492695883134127}},"e":{"docs":{},"r":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.010416666666666666}}}}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}},"i":{"docs":{},"t":{"docs":{},")":{"docs":{},"\"":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"i":{"docs":{},"l":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.04182509505703422},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}},"c":{"docs":{},"e":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}},"i":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"v":{"docs":{},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"e":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}},"a":{"docs":{},"k":{"docs":{},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/static.html":{"ref":"ring/static.html","tf":0.009216589861751152},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"n":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"r":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"b":{"docs":{},"l":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"e":{"docs":{},".":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}},"e":{"docs":{},"r":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.00847457627118644}},"a":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},"s":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"performance.html":{"ref":"performance.html","tf":0.0196078431372549},"development.html":{"ref":"development.html","tf":0.03076923076923077}},")":{"docs":{},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"s":{"docs":{},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"x":{"docs":{},"t":{"docs":{},"/":{"docs":{},"x":{"docs":{},"m":{"docs":{},"l":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"o":{"docs":{},"w":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},"n":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"h":{"docs":{},"a":{"docs":{},"t":{"docs":{},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"?":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},"'":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}},"n":{"docs":{},"k":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"performance.html":{"ref":"performance.html","tf":0.004524886877828055},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"i":{"docs":{},"s":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},":":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259}}},")":{"docs":{},":":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"n":{"docs":{},"g":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"s":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"\"":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667}}}}}}}},"r":{"docs":{},"o":{"docs":{},"w":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}},"n":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}},"/":{"docs":{},"r":{"docs":{},"a":{"docs":{},"i":{"docs":{},"s":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}},"u":{"docs":{},"g":{"docs":{},"h":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"e":{"docs":{},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"e":{"docs":{},"m":{"docs":{},",":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}},"e":{"docs":{},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}},"n":{"docs":{},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"u":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"s":{"docs":{},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}},"i":{"docs":{},"m":{"docs":{},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"performance.html":{"ref":"performance.html","tf":0.004524886877828055},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"p":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"w":{"docs":{},"o":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"/":{"docs":{},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}}}}}}}},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.008802816901408451},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0038684719535783366}},"\"":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},":":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}}}},"u":{"docs":{},"r":{"docs":{},"n":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"u":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.02390438247011952}},".":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992}}}}}}}},":":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"t":{"docs":{},"i":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.002421307506053269}}}}},"s":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.008955223880597015},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.017699115044247787},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.013824884792626729},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.01},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.018633540372670808},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.029411764705882353},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.03},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.012875536480686695},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.010050251256281407},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.004835589941972921},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.03879310344827586},"performance.html":{"ref":"performance.html","tf":0.007541478129713424},"development.html":{"ref":"development.html","tf":0.015384615384615385},"faq.html":{"ref":"faq.html","tf":0.01020408163265306}},"e":{"docs":{},"r":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.008438818565400843},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"\"":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294}}}}}}},"d":{"docs":{},".":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}},":":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}},",":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"a":{"docs":{},"g":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"n":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.020833333333333332},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/ring.html":{"ref":"ring/ring.html","tf":0.008695652173913044},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.005221932114882507},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}},"l":{"docs":{},"i":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}},"i":{"docs":{},"f":{"docs":{},"i":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}}}}}}},"a":{"docs":{},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}},"t":{"docs":{},"i":{"docs":{},"l":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}},"m":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"p":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"development.html":{"ref":"development.html","tf":0.015384615384615385}},".":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}},"r":{"docs":{},"l":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.012875536480686695},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}}}}},"i":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},")":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}},"]":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}},"u":{"docs":{},"i":{"docs":{},"d":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"\"":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"/":{"docs":{},":":{"docs":{},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"]":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"development.html":{"ref":"development.html","tf":0.03076923076923077}},":":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"development.html":{"ref":"development.html","tf":0.015384615384615385}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}}}}}}},"i":{"docs":{},"f":{"docs":{},"i":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}},"b":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},".":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":3.36318407960199},"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":3.3459915611814344},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.022988505747126436},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":5.002457002457002}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}},",":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}}}}},"u":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}},"e":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},"s":{"docs":{},".":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}}}}},"]":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055}}}}},":":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.007371007371007371}}}},"r":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"i":{"docs":{},"e":{"docs":{},"t":{"docs":{},"i":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}}}}},"i":{"docs":{},"a":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.01639344262295082},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.004219409282700422},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.01639344262295082},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}},"e":{"docs":{},"w":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.00528169014084507},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}},"]":{"docs":{},")":{"docs":{},")":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}},"}":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}}},"s":{"docs":{},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}}}}},"o":{"docs":{},"t":{"docs":{},"e":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"2":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"3":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}},"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.013100436681222707},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.02109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.012578616352201259},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"}":{"docs":{},")":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}},")":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}},"p":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}},".":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}},"i":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},"e":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"c":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.011494252873563218},"performance.html":{"ref":"performance.html","tf":0.006033182503770739},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0076045627376425855},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.008583690987124463},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}},"i":{"docs":{},"n":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},":":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"?":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.009828009828009828}}}}},"d":{"docs":{},"t":{"docs":{},"h":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.005208333333333333}}}}}},"a":{"docs":{},"y":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},".":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}},",":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}},"l":{"docs":{},"k":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"e":{"docs":{},"r":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}}},"n":{"docs":{},"t":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},",":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}},"r":{"docs":{},"n":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}}}},"h":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}}},"y":{"docs":{},"?":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"v":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}}}}},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"v":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}},"e":{"docs":{},"b":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"j":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"l":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}},"e":{"docs":{},"!":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"l":{"docs":{},",":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"d":{"docs":{},",":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}},"'":{"docs":{},"l":{"docs":{},"l":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}}},"r":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028}}}}},"s":{"docs":{},"g":{"docs":{},"i":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088}}}}},"o":{"docs":{},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928}}}}},"r":{"docs":{},"k":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697},"development.html":{"ref":"development.html","tf":0.015384615384615385},"faq.html":{"ref":"faq.html","tf":0.00816326530612245}},":":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}},"s":{"docs":{},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},",":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"f":{"docs":{},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":5.005089058524173}}}}}}},"l":{"docs":{},"d":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},"w":{"docs":{},"w":{"docs":{"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602}}}}},"{":{"2":{"0":{"0":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992}}},"docs":{}},"docs":{}},"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}},":":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0029013539651837525}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.00683371298405467},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.008438818565400843},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.010956175298804782},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002421307506053269},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.01791044776119403},"ring/ring.html":{"ref":"ring/ring.html","tf":0.006956521739130435},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.0189873417721519},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}},"i":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.006527415143603133}},"d":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.027522935779816515},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.01694915254237288},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.011389521640091117},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.01764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.012048192771084338},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.016666666666666666},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.02390438247011952}}}}}}}}}}},"f":{"docs":{},"o":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"s":{"docs":{},"o":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.007263922518159807},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.00847457627118644},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"ring/ring.html":{"ref":"ring/ring.html","tf":0.010434782608695653},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.02926829268292683},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.017467248908296942},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.010548523206751054},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.011406844106463879}}}}}},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"g":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976}}}}}}},"u":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"j":{"docs":{},"a":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.012106537530266344},"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.011299435028248588},"basics/router.html":{"ref":"basics/router.html","tf":0.03375527426160337},"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.01834862385321101},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.01366742596810934},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.01232394366197183},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.016129032258064516},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.015625},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.027079303675048357},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}}},"o":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992}},"t":{"docs":{"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.0044444444444444444}}}},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}}}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/ring.html":{"ref":"ring/ring.html","tf":0.01565217391304348},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.035555555555555556},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.014634146341463415},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.005221932114882507},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.0049800796812749},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}}}}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.009111617312072893}}}},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/different_routers.html":{"ref":"advanced/different_routers.html","tf":0.005747126436781609}}}}}}},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"ring/ring.html":{"ref":"ring/ring.html","tf":0.01565217391304348},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.0234375},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.06222222222222222},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.057034220532319393},"ring/static.html":{"ref":"ring/static.html","tf":0.013824884792626729},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.03184713375796178},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.006666666666666667},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.01951219512195122},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.013100436681222707},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.010443864229765013},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.010548523206751054},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.008964143426294821},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.01764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.016666666666666666},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01593625498007968},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.017241379310344827},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"y":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"x":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992}}}}}}}},"k":{"docs":{},"u":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.017361111111111112}}}},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00796812749003984}}}}}}}}},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.005649717514124294},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"r":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.017605633802816902},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.03225806451612903},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.03125},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"u":{"docs":{},"p":{"docs":{"basics/router.html":{"ref":"basics/router.html","tf":0.004219409282700422}}}}}}}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0056657223796034},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},"e":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}},"e":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"z":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}}}}}}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"d":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.014925373134328358},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.006329113924050633}}}},"u":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.02459016393442623},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}}},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.007537688442211055}}}}}}},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"i":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.022887323943661973},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.03225806451612903},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.03125}}}}},"i":{"docs":{},"l":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"basics/error_messages.html":{"ref":"basics/error_messages.html","tf":0.008849557522123894}}}}}},"e":{"docs":{},"c":{"docs":{},"u":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.01195219123505976}}}}}}}},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.005555555555555556},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},"r":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902}}}}},"r":{"docs":{},"i":{"docs":{"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.078125},"ring/default_handler.html":{"ref":"ring/default_handler.html","tf":0.008888888888888889},"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.034220532319391636},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"t":{"docs":{},"o":{"docs":{},"o":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111}}},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.014360313315926894},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992}}}}}},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051}}}}},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}},"a":{"docs":{},"g":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}},"i":{"docs":{},"t":{"docs":{},"l":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},":":{"docs":{},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.006369426751592357}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"s":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.00975609756097561}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"/":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"s":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00796812749003984}}}}}}}}}}}}}}}}}}}}}}},"k":{"docs":{},"i":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}},"b":{"docs":{},"o":{"docs":{},"n":{"docs":{},"u":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.021834061135371178}}}},"d":{"docs":{},"i":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00398406374501992}}}}}},"x":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.009138381201044387},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}},"z":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533}},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.0189873417721519}}}}}},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}}}}}}},"}":{"docs":{"./":{"ref":"./","tf":0.004842615012106538},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"}":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.0038022813688212928},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705}},"}":{"docs":{},"}":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}},")":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}},")":{"docs":{},"}":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}},".":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},",":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}}},"*":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"}":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"}":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},".":{"docs":{},"p":{"docs":{},"d":{"docs":{},"f":{"docs":{},"\"":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"}":{"docs":{},".":{"docs":{},"p":{"docs":{},"d":{"docs":{},"f":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"i":{"docs":{},"d":{"docs":{},"}":{"docs":{},",":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"}":{"docs":{},".":{"docs":{},"p":{"docs":{},"d":{"docs":{},"f":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"]":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}}}}}}}}}}},"\"":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"\"":{"docs":{"ring/slash_handler.html":{"ref":"ring/slash_handler.html","tf":0.019011406844106463}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}},"x":{"docs":{},"\"":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.006527415143603133}}}},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}},";":{"docs":{},";":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541}}}}}}},"/":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},"f":{"docs":{},"o":{"docs":{},"o":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},"%":{"2":{"0":{"docs":{},"b":{"docs":{},"a":{"docs":{},"r":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}},"docs":{}},"docs":{}}}}},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},":":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"/":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}}}}}}},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"p":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}}}}}},":":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.00819672131147541}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.01639344262295082}}}}}}}}}}}}}}},"t":{"docs":{},"h":{"docs":{},"i":{"docs":{},"s":{"docs":{},"/":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"u":{"docs":{},"l":{"docs":{},"d":{"docs":{},"/":{"docs":{},":":{"docs":{},"f":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"u":{"docs":{},"l":{"docs":{},"k":{"docs":{},"/":{"docs":{},":":{"docs":{},"b":{"docs":{},"u":{"docs":{},"l":{"docs":{},"k":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.01639344262295082}}}}}}}}}}},"a":{"docs":{},"z":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"/":{"docs":{},":":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"i":{"docs":{},"d":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},"s":{"docs":{},"a":{"docs":{},"h":{"docs":{},"t":{"docs":{},"i":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.004098360655737705}}}}},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"/":{"docs":{},"*":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.01639344262295082}}}}}}}}}}}}}},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"/":{"docs":{},"r":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}},"s":{"docs":{},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}}}},"a":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"/":{"docs":{},"s":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.005025125628140704}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}}}}}}}}}}},"c":{"docs":{},"i":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},"w":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"n":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}}}}}},"d":{"docs":{},"y":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"i":{"docs":{},"c":{"docs":{},"/":{"docs":{},"d":{"docs":{},"u":{"docs":{},"o":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}}}},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"n":{"docs":{},"a":{"docs":{},"p":{"docs":{},"u":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}}},"\\":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}},"\"":{"docs":{},"p":{"docs":{},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"\\":{"docs":{},"\"":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576}}}}}}}}}},"a":{"docs":{},"b":{"docs":{},"b":{"docs":{},"a":{"docs":{},"\\":{"docs":{},"\"":{"docs":{},")":{"docs":{},")":{"docs":{},"\"":{"docs":{},"}":{"docs":{},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}}}}}}}}}}}}}},"g":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}}}}}}}},"t":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.01507537688442211},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717}},"n":{"docs":{"basics/path_based_routing.html":{"ref":"basics/path_based_routing.html","tf":0.012345679012345678},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629},"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}},"t":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{"development.html":{"ref":"development.html","tf":0.046153846153846156}},".":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}}}}}},"o":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"o":{"docs":{},"d":{"docs":{"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"faq.html":{"ref":"faq.html","tf":0.006122448979591836}},":":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}},"g":{"docs":{},"l":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}},":":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}},"a":{"docs":{},"l":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}},"e":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"u":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{"ring/dynamic_extensions.html":{"ref":"ring/dynamic_extensions.html","tf":0.01910828025477707},"faq.html":{"ref":"faq.html","tf":0.004081632653061225}}}}},"i":{"docs":{},"d":{"docs":{},"e":{"docs":{},".":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112}}}}}}},"m":{"docs":{},"t":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{},"h":{"docs":{},"q":{"docs":{},"l":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"faq.html":{"ref":"faq.html","tf":0.00816326530612245}}}}}},"a":{"docs":{},"v":{"docs":{},"e":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}}},"b":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}},"h":{"docs":{},"z":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.011940298507462687},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.006944444444444444},"ring/ring.html":{"ref":"ring/ring.html","tf":0.008695652173913044},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.013333333333333334},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0084985835694051},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.014814814814814815},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.00631578947368421},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00597609561752988},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.011764705882352941},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.00819672131147541},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.00847457627118644},"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0052173913043478265},"ring/static.html":{"ref":"ring/static.html","tf":0.004608294930875576},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.017467248908296942},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.01639344262295082},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}},"?":{"docs":{},")":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.003472222222222222}}}},"s":{"docs":{},".":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}},"s":{"docs":{},".":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}},",":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}},"e":{"docs":{},"t":{"docs":{},".":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}},")":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00298804780876494}}}},".":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0039164490861618795},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}},",":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}}}},"e":{"docs":{},"p":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236}}},"c":{"docs":{},"h":{"docs":{},"m":{"docs":{},"a":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}}}},"u":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"n":{"docs":{},"o":{"docs":{},"w":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}},"n":{"docs":{"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"i":{"docs":{},"k":{"docs":{},"k":{"docs":{},"a":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.01293103448275862}},")":{"docs":{},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.008620689655172414}}}},"}":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"]":{"docs":{},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}},"}":{"docs":{},"]":{"docs":{},")":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}}}}}}},"n":{"docs":{},"d":{"docs":{},"a":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"b":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"q":{"docs":{},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"f":{"docs":{},"i":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147},"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{"basics/name_based_routing.html":{"ref":"basics/name_based_routing.html","tf":0.0045871559633027525},"ring/reverse_routing.html":{"ref":"ring/reverse_routing.html","tf":0.015625},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.012422360248447204},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996},"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.010178117048346057}}},"y":{"docs":{},")":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}},"s":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}}}},"i":{"docs":{},"c":{"docs":{},"k":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}},"t":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.005089058524173028},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"y":{"docs":{},"o":{"docs":{},"u":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"l":{"docs":{},"f":{"docs":{},".":{"docs":{"basics/route_syntax.html":{"ref":"basics/route_syntax.html","tf":0.002824858757062147}}}}}}}},"'":{"docs":{},"d":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}},"i":{"docs":{},"e":{"docs":{},"l":{"docs":{},"d":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0017605633802816902},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335},"ring/default_middleware.html":{"ref":"ring/default_middleware.html","tf":0.006211180124223602},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}},")":{"docs":{},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},"}":{"docs":{},"]":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"]":{"docs":{},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}}}}}}}}}}},":":{"docs":{},"=":{"2":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}},"docs":{}}},"]":{"docs":{},"}":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}}},"e":{"docs":{},"t":{"docs":{},".":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352}}}}}},"^":{"docs":{},":":{"docs":{},"r":{"docs":{},"e":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"c":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.002277904328018223}}}}}}}}},"^":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}},"^":{"docs":{},"^":{"docs":{},"^":{"docs":{},"^":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.004914004914004914}}}}}}}},"j":{"docs":{},"a":{"docs":{},"v":{"docs":{},"a":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},".":{"docs":{},"i":{"docs":{},"o":{"docs":{},".":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{"basics/route_data.html":{"ref":"basics/route_data.html","tf":0.004555808656036446}}}}}}}},"l":{"docs":{},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.007042253521126761},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258}}}}}}}}}}}}}},"s":{"docs":{},"q":{"docs":{},"l":{"docs":{},".":{"docs":{},"s":{"docs":{},"q":{"docs":{},"l":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0028328611898017}}}}}}}}}}}}}}},"u":{"docs":{},"t":{"docs":{},"i":{"docs":{},"l":{"docs":{},".":{"docs":{},"d":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}}},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{},",":{"docs":{"frontend/basics.html":{"ref":"frontend/basics.html","tf":0.01}}}}}}}}}}}},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.017361111111111112},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.007407407407407408},"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}},"/":{"docs":{},"w":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"o":{"docs":{},"w":{"docs":{},".":{"docs":{},"h":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"i":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}},"y":{"docs":{},")":{"docs":{"frontend/browser.html":{"ref":"frontend/browser.html","tf":0.004291845493562232}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}}},"y":{"docs":{},"(":{"9":{"docs":{},".":{"2":{"docs":{},".":{"2":{"1":{"docs":{},".":{"docs":{},"v":{"2":{"0":{"1":{"7":{"0":{"1":{"2":{"0":{"docs":{},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0049382716049382715}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}},"docs":{}},"docs":{}}},"docs":{}}},"docs":{}},"]":{"docs":{"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498}},")":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}}}}}},"v":{"docs":{},"m":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}}},"o":{"docs":{},"b":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}},"i":{"docs":{},"n":{"docs":{"faq.html":{"ref":"faq.html","tf":0.0020408163265306124}}}}}},".":{"docs":{},".":{"docs":{},".":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.0029850746268656717},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00099601593625498},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}},",":{"docs":{"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266}}},")":{"docs":{"ring/RESTful_form_methods.html":{"ref":"ring/RESTful_form_methods.html","tf":0.006289308176100629}}},"]":{"docs":{},")":{"docs":{"frontend/controllers.html":{"ref":"frontend/controllers.html","tf":0.002512562814070352},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}},"c":{"docs":{},"l":{"docs":{},"j":{"docs":{},"c":{"docs":{"advanced/shared_routes.html":{"ref":"advanced/shared_routes.html","tf":0.004310344827586207}}}}}},"/":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{},"s":{"docs":{},"/":{"docs":{},"l":{"docs":{},"e":{"docs":{},"i":{"docs":{},"n":{"docs":{"development.html":{"ref":"development.html","tf":0.046153846153846156}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"development.html":{"ref":"development.html","tf":0.015384615384615385}}}}},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},".":{"docs":{},"s":{"docs":{},"h":{"docs":{"development.html":{"ref":"development.html","tf":0.03076923076923077}}}}}}}}}}}}}}}}}}},"=":{"docs":{},">":{"docs":{"basics/route_data_validation.html":{"ref":"basics/route_data_validation.html","tf":0.005970149253731343},"basics/route_conflicts.html":{"ref":"basics/route_conflicts.html","tf":0.01639344262295082},"coercion/coercion.html":{"ref":"coercion/coercion.html","tf":0.0035211267605633804},"coercion/schema_coercion.html":{"ref":"coercion/schema_coercion.html","tf":0.008064516129032258},"coercion/clojure_spec_coercion.html":{"ref":"coercion/clojure_spec_coercion.html","tf":0.001736111111111111},"coercion/data_spec_coercion.html":{"ref":"coercion/data_spec_coercion.html","tf":0.0078125},"ring/ring.html":{"ref":"ring/ring.html","tf":0.0034782608695652175},"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.013333333333333334},"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.004366812227074236},"ring/exceptions.html":{"ref":"ring/exceptions.html","tf":0.0113314447592068},"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0026109660574412533},"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737},"advanced/configuring_routers.html":{"ref":"advanced/configuring_routers.html","tf":0.05737704918032787}}}},"%":{"docs":{"ring/ring.html":{"ref":"ring/ring.html","tf":0.0017391304347826088},"ring/transforming_middleware_chain.html":{"ref":"ring/transforming_middleware_chain.html","tf":0.004878048780487805},"http/transforming_interceptor_chain.html":{"ref":"http/transforming_interceptor_chain.html","tf":0.00398406374501992},"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.009828009828009828}},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.009828009828009828}},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}},")":{"docs":{},")":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}},"z":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{"ring/data_driven_middleware.html":{"ref":"ring/data_driven_middleware.html","tf":0.0033333333333333335}}}}},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}},")":{"docs":{"ring/route_data_validation.html":{"ref":"ring/route_data_validation.html","tf":0.002109704641350211}}}}}}},"+":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.008733624454148471},"http/interceptors.html":{"ref":"http/interceptors.html","tf":0.0058823529411764705},"http/pedestal.html":{"ref":"http/pedestal.html","tf":0.004016064257028112},"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683},"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}}},"|":{"docs":{"ring/middleware_registry.html":{"ref":"ring/middleware_registry.html","tf":0.021834061135371178}}},"x":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358},"ring/coercion.html":{"ref":"ring/coercion.html","tf":0.0013054830287206266},"ring/swagger.html":{"ref":"ring/swagger.html","tf":0.00199203187250996}},":":{"docs":{},"=":{"1":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}},"docs":{}}},"m":{"docs":{},"l":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}}},")":{"docs":{"http/sieppari.html":{"ref":"http/sieppari.html","tf":0.011111111111111112}}}},"}":{"docs":{"ring/content_negotiation.html":{"ref":"ring/content_negotiation.html","tf":0.0024691358024691358}}},"?":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.002544529262086514}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.002105263157894737}}}}}}}}}}}}}}}}}},"_":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"s":{"docs":{},"]":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}},"`":{"docs":{},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"`":{"docs":{"ring/compiling_middleware.html":{"ref":"ring/compiling_middleware.html","tf":0.004210526315789474}}}}}}}}}}}}}}}}}}}}},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{"advanced/route_validation.html":{"ref":"advanced/route_validation.html","tf":0.002457002457002457}}}}}}}}}}}}}}}},"l":{"docs":{},"e":{"docs":{},"i":{"docs":{},"n":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}},"@":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0009671179883945841}},")":{"docs":{"advanced/composing_routers.html":{"ref":"advanced/composing_routers.html","tf":0.0019342359767891683}}}}}}}}}},"!":{"docs":{"advanced/dev_workflow.html":{"ref":"advanced/dev_workflow.html","tf":0.01272264631043257}}},")":{"docs":{},"b":{"docs":{},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"h":{"docs":{},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"k":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}}}}}}}},"µ":{"docs":{},"s":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0030165912518853697}},".":{"docs":{"performance.html":{"ref":"performance.html","tf":0.0015082956259426848}}}}}},"length":7805},"corpusTokens":["!","\"","\"\",","\"\".","\"\"}","\"\"})","\"\"})))","\"\"})]","\"\"})])))","\"\"})]])","\"(constrain","\"(not","\"/\"","\"/\"))","\"/\")))","\"/\"))))","\"/\"))]","\"/\"}","\"/\"})","\"/*\",","\"/:company/users/:us","\"/all\"})","\"/api","\"/api\"","\"/api\",","\"/api/admin/db\"})","\"/api/admin/ping\",","\"/api/admin/ping\"})","\"/api/admin/users\"})","\"/api/bonus\"})","\"/api/get\"})","\"/api/internal/users\"})","\"/api/ipa\")","\"/api/ns2/more/bar\")","\"/api/ns2/more/bar\",","\"/api/ns2/more/bar\"}","\"/api/number\"})","\"/api/orders/1\")","\"/api/orders/1\"}","\"/api/orders/2\"}","\"/api/orders/:id\"","\"/api/orders/:id\",","\"/api/ping\"","\"/api/ping\")","\"/api/ping\"}","\"/api/ping\"})","\"/api/plus/3\"","\"/api/pong\"","\"/api/user/1\"","\"/api/user/1\")","\"/api/user/1?iso=m%c3%b6ly\"","\"/api/user/:id\"","\"/api/user/:id\",","\"/assets/*\".","\"/auth/login\")))","\"/avaruus\"","\"/avaruus\"}]","\"/beers/lager\")","\"/beers/sahti\")","\"/beers/saison\")","\"/dynamic\"","\"/dynamic/duo\"","\"/dynamic/duo\")","\"/fail\"","\"/fail\"})","\"/fail\"}}","\"/favicon.ico\"})","\"/gin/napue\")","\"/hello\")","\"/invalid\"})","\"/kerran/*\"","\"/kerran/avaruus\"}","\"/kikka\"","\"/kikka\"}","\"/kikka\"})","\"/metosin/users/123\")","\"/metosin/users/123\"))","\"/metosin/users/123\"}","\"/metosin/users/ikitommi\")","\"/metosin/users/ikitommi\"))","\"/olipa/*\"","\"/olipa/iso/kala\"}","\"/olipa/kerran/avaruus\")","\"/olipa/kerran/avaruus\"}","\"/olipa/kerran/iso/kala\")","\"/one","\"/one/ping\"","\"/one/swagger.json\"}","\"/ping\"","\"/ping\")","\"/ping\"}","\"/ping\"})","\"/ping\"})))","\"/ping\"},","\"/ping/\"})","\"/plus\"","\"/pong\"})","\"/pong/\"},","\"/swagger.json\"","\"/swagger.json\"})","\"/two/deep/ping\")","\"/two/ping\"","\"/two/ping\")","\"/two/swagger.json\"}","\"/users\"})","\"/users/0?iso=m%c3%b6ly\"}","\"/users/1?iso=m%c3%b6ly\"}","\"/users/2?iso=m%c3%b6ly\"}","\"/users/3?iso=m%c3%b6ly\"}","\"/users/4?iso=m%c3%b6ly\"}","\"/users/5?iso=m%c3%b6ly\"}","\"/users/6?iso=m%c3%b6ly\"}","\"/users/7?iso=m%c3%b6ly\"}","\"/users/8?iso=m%c3%b6ly\"}","\"/users/9?iso=m%c3%b6ly\"})}","\"/users/:id\"","\"/vodka/russian\")","\"/workspace/1/1\")))","\"0.4.0\"]","\"0.5.5\"]","\"1\",","\"1\"}","\"1\"})","\"1\"}}","\"1.0.0\"","\"100\"","\"100\"}]","\"100\"}]}","\"123\"","\"123\",","\"123\"},","\"123\"}]","\"123\"}]}","\"2.0\"","\":8080\"},","\"_method\"","\"_method\"])","\"_method\"]))))","\"abba\"}","\"abba\"},","\"about\"]","\"any\"","\"any\"},","\"application/json\"","\"application/json\")","\"avaruus\"}","\"bar\"})","\"beer\"","\"bock\"])","\"default\"","\"default\")","\"delete\"","\"download","\"duo\"","\"enter","\"error\"","\"error\")","\"exception\"","\"exception\")","\"fail\"","\"fail\")))]","\"fail\"}","\"fail\"}})","\"false\"","\"forbidden\"}","\"forc","\"get\"","\"get\"})","\"go","\"http://localhost:8080/api/user/123\"))","\"http://localhost:8080/api/user/123\"}","\"http://localhost:8080/api/user/{id}\",","\"identity\"","\"identity\",","\"identity\"},","\"identity\"}]","\"identity\"}])","\"identity\"}}})},","\"ikitommi\"))}}","\"image/png\"}","\"index.html\")])","\"int\",","\"item","\"java.lang.exception\"}}","\"kerran/avaruus\"}","\"kerran/iso/kala\"}","\"kikka\"}]","\"kosh\"}","\"kosh\"})","\"kosh\"})})))","\"kukka\"})}}]]","\"leav","\"look","\"mation\"}]","\"metosin\",","\"mi","\"middlewar","\"much\"","\"möly\"}))","\"möly\"}))})})}]","\"negoti","\"ok\",","\"ok\"}","\"ok\"})","\"ok\"}))","\"ok\"})])","\"patch\"","\"ping\"})}]","\"ping\"})}])","\"plu","\"pong\"}","\"pong\"}))","\"pong\"})]","\"pong\"})])","\"pong\"})}]","\"pong\"})}]]","\"post\"","\"post\"}","\"post\"})","\"reitit\"?","\"reitit.png\"))})}}]]","\"reitithandleclick\"))))})","\"root","\"sahti\"","\"server","\"some","\"sql","\"swagger","\"tenant1\"","\"text/xml\"}","\"too\"}]}","\"total\":","\"upload","\"user...\"})}]])))","\"y\"","\"yyyi","\"{\\\"value\\\":\\\"2019","#","#'app","#'reitit.core/rout","#'user/rout","#(interleav","#(r/router","#(respond","#(slurp","#.","#:clojure.spec.alpha{:problem","#?(:clj","#?@(:clj","#coercionerror{:schema","#endpoint{...}","#endpoint{...}}","#endpoint{:data","#interceptor","#match{:templ","#methods{...}","#methods{:get","#object[...]","#object[...]}","#object[...]}}","#object[reitit.coercion$request_coercer$]},","#object[reitit.core$...]","#object[reitit.core$lookup_router]}","#object[reitit.core$mixed_router]}","#object[reitit.core$quarantine_router$reifi","#object[reitit.core$quarantine_router$reify]","#object[user$handler]}","#object[user$reify__24359]}]]","#partialmatch{:templ","#reitit","#reitit.core.match{:templ","#{::one","#{:admin","#{:adminz}}]","#{:admin}","#{:admin}}","#{:admin}})","#{:admin}}}]]","#{:admin}}}]]]","#{:bracket","#{:colon","#{:db","#{:id}","#{:id}}","#{:manager}","#{:manager}}","#{:public","#{:reitit.swagger/default}","#{:session}","#{:user}","#{route}}","#{}))","%","%)","%))","%))))","&","'())","'[buddy.auth.accessrul","'[clojure.set","'[clojure.spec.alpha","'[clojure.spec.test.alpha","'[clojure.str","'[compojure.cor","'[criterium.cor","'[expound.alpha","'[io.pedestal.http","'[muuntaja.cor","'[ns1])","'[ns2])","'[reitit.coercion","'[reitit.coercion.schema])","'[reitit.coercion.spec","'[reitit.coercion.spec])","'[reitit.cor","'[reitit.dev.pretti","'[reitit.except","'[reitit.http","'[reitit.interceptor.sieppari","'[reitit.middlewar","'[reitit.pedest","'[reitit.r","'[reitit.ring.coercion","'[reitit.ring.middleware.except","'[reitit.ring.middleware.multipart","'[reitit.ring.middleware.muuntaja","'[reitit.ring.spec","'[reitit.spec","'[reitit.spec])","'[reitit.swagg","'[ring.adapter.jetti","'[schema.cor","'[spec","'add","'em","'get","'positiveint))","(","(\"/common/ping\"","(#reitit.spec.problem{:path","()","(*","(*path).","(+","(.","(.back","(.getclass","(.go","(30x","(404","(:api","(:author","(:control","(:get,","(:id)","(:reitit.coercion/request","(:request","(:requir","(:tags,","(:templat","(:uri","(=","(?","([\"/api\"","([\"/get","([...","([request","([request]","(a","(accessrules/wrap","(actually,","(add","(affect","(all","(also","(and","(app","(appli","(assoc","(ataraxy,","(atom","(blank?","(case","(cat","(cc/quick","(click","(clojur","(clojure)","(clojure.core/fn","(clojure.core/or","(clojure.spec),","(clojure.spec.alpha/*","(clojure.spec.alpha/?","(clojure.spec.alpha/and","(clojure.spec.alpha/cat","(clojure.spec.alpha/col","(clojure.spec.alpha/nil","(clojure.spec.alpha/or","(clojure.string/blank?","(clojure.string/start","(coerc","(coercion","(coercion,","(coercion/coerc","(coercion/coerce!","(coercion/respons","(comp","(compiled)","(con","(conj","(constantli","(context","(context)","(core","(core.clj:4739)","(cqr","(creat","(current","(data)","(declar","(def","(default","(default:","(defn","(defonc","(defprotocol","(defrout","(deref","(deriv","(done","(dotim","(e.g.","(ex","(exception.","(exception/cr","(exception/format","(expand","(expound/custom","(extend","(fn","(fnil","(for","(futur","(get","(gobj/get","(handler","(hidden","(http","(http/ring","(http/router","(human","(i.e.","(if","(in","(index.html).","(integer?","(interceptor","(interceptor/transform","(into","(io/input","(io/resourc","(java.io.file.","(java.util.date.)}","(jetty/run","(js/console.log","(json,","(keyword","(keyword?","(legaci","(let","(like","(list","(m/creat","(m/encod","(map","(mapv","(match","(matches,","(mayb","(merg","(mi","(micro","(middleware/map","(n","(name","(nested)","(nilabl","(no","(non","(not","(not=","(note:","(ns1/routes)]])","(ns2/routes)]","(of","(ok","(onli","(option","(optional)","(or","(partial","(pedestal/replac","(pedestal/rout","(per","(pioneer","(positiveint","(pr","(printer","(println","(promise)]","(r/compil","(r/expand","(r/match","(r/option","(r/partial","(r/rout","(r/router","(rand","(rang","(real","(records,","(recurs","(reifi","(reitit","(reitit.ring/cr","(reitit.ring/r","(reitit.ring/rout","(repeat","(request","(requir","(reset","(reset!","(respons","(reverse)","(rfc/appli","(rfe/href","(rfe/start!","(rfh/ignor","(ring/creat","(ring/get","(ring/r","(ring/redirect","(ring/rout","(rout","(router","(router)","(routes)))","(routes))))","(s/coll","(s/constrain","(s/def","(s/explain","(s/key","(s/merg","(s/or","(s/valid?","(schema","(see","(select","(seq","(server/cr","(server/default","(server/dev","(server/start))","(set!","(set/subset?","(simple)","(some","(st/coerc","(start","(static","(stest/instru","(str","(str/last","(sub","(swagger","(swagger/cr","(swap!","(throw","(uncom","(updat","(via","(when","(whether)","(wildcard","(with","(without","(wrap","({:path","({:uri",")benchmark","+","...","...)","...,","...])","./scripts/lein","./scripts/set","./scripts/test.sh",".cljc","/","/:this/should/:fail","/:user","/:version/statu","/admin/p","/api","/api/command/add","/api/user/:id:","/baz/:id/:subid","/beers/sahti","/beers/saison","/bulk/:bulk","/ciders/weston","/dynamic/duo","/examples/r","/foo","/foo%20bar.","/gin/napu","/item/someth","/item/something,","/ping","/public/*path","/saison","/swagger.json","0)","0..n","03","08","1","1)","1)]}","10","10)]","100","100)))]))))","100)]","1000","1000)","1000):","1000]","100}]","100}]}","10]}})))","10}})","11","110x","111}}","115","12000n","123","123,","123}]}","123}}","130n","15\\\"}\"","16","16:59:54","16:59:58","18","1]","1]}}","1}","1})","2","2\"}})","2)","2)]}","2,5","2.2.10.","2.x","20","200","200,","20000n","2018","20]]}","2116","22","2251","23ns.","256","2]]}","2})","2},","2}})","3","3)","3)]","3.2","3.x,","30","300","3000","3000\"))","3000,","308,","30}}","312m","3]]","3]}}","4","4)","400","400)","400,","403,","404,","405,","406,","40n","440n","5)","50%","50+","500","500)}))","500,","500x","6","6))\"},","600n","6},","6}}","8","8.7m","80n",":",":123}]",":123}],",":3000/math",":3000/xml",":8080","::about)","::acc","::admin]","::admin}]","::api","::api],","::author","::bar","::bar])","::bar]]","::bar]])","::bar]]))","::baz]]))","::coerc","::compani","::db]","::db]]","::db]])","::db]}","::db}]","::default","::descript","::error","::except","::exception)","::exception/default","::exception/wrap","::fail]])","::failue})))]","::failur","::foo]","::horror","::ipa)","::kikka","::kikka)","::kikka]","::mi","::mw/coerc","::one","::one}}","::order","::path","::photo","::photos]","::photos]))","::ping","::ping)","::ping))","::ping]","::ping]]","::ping]])","::ping}","::ping}]","::ping}]]","::plu","::plus)","::pong]]","::pong]]))","::pong}]]","::r/match)","::r/router","::remark","::role","::roles)]","::route1])","::route2])","::route3])))","::rs/default","::rs/explain","::rs/respons","::rs/wrap","::server/join?","::server/port","::server/rout","::sku","::spec/raw","::swagger]","::swagger}]","::tenant1])","::timeout))","::two","::two}}","::two}}}","::user","::user)","::user))","::user]])","::user]]))","::users]","::users]]","::users]]))","::users}","::wrap","::wrap2","::wrap3","::zone",":a",":accessrules/handl",":accessrules/rule))",":add})",":add})))",":admin",":admin]]}",":admin}",":api",":api)]}",":api]]",":api]]}",":append,",":arg",":auth/login]",":auth/recovery]",":author",":avaruus]",":avaruus}",":basepath",":basepath)",":beer",":beer/bock}]",":beer/lager}]",":beer/sahti}]",":bigdecimals]",":bodi",":body,",":body.",":body]}}",":body}",":bonu",":bonus10",":bracket",":bracket.",":bracket})",":bracket}.",":cache,",":child",":ciders]",":ciders}]",":class",":clojure.spec.alpha/spec",":clojure.spec.alpha/valu",":coerc",":coercion",":coercion)",":colon",":colon})",":command",":compil",":compile.",":config",":conflict",":consum",":control",":data",":data))))",":data:",":db",":db]]",":debug",":debug)))})",":debug]))})))",":debug]}}",":decod",":delet",":delete,",":delete]]",":descript",":dev",":displac",":duo",":duo)))",":duo55]",":duo71]",":dynam",":dynamic,",":encod",":error",":etag,",":except",":executor",":expand",":figwheel",":form",":form,",":get",":get)]",":get,",":get})",":gzip",":handler",":handler)})",":handler]}",":head,",":header",":height",":here",":id",":id)))",":id))))}",":id)))}]}]",":id]))",":id].",":ignor",":ihminen]])}]])}]]))",":in",":index",":infor",":inject",":interceptor",":intern",":internal}",":internal})",":into",":jetti",":join?",":kerran",":lager]",":lager]])))",":last",":leav",":let",":linear",":loader",":lookup",":makkara]",":manager})",":message]",":method",":mi",":middlewar",":mix",":multipart",":multipart]",":multipart}",":muuntaja",":muuntaja/decod",":muuntaja/request",":muuntaja/respons",":name",":name)))",":napue]",":napue}]",":no",":not",":ns1/bar",":ns1/bar},",":number\"]",":number]",":ok]}",":olipa",":olut]",":opt",":option",":options,",":opts)]",":page",":paramet",":parameters.",":parameters}]",":patch,",":path",":path.",":path]",":photo",":photo/height",":photo/id",":photo/width",":photo/width]))",":ping",":ping)]",":ping]",":post",":post)]]",":post,",":pred",":prepend,",":print",":problem",":problems))",":produc",":produces,",":provides.",":public",":public}",":put",":put,",":quarantin",":queri",":query,",":query}",":refer",":reitit.coercion/request",":reitit.coercion/respons",":reitit.core/match",":reitit.core/rout",":reitit.interceptor/transform",":reitit.middleware/registri",":reitit.middleware/transform",":reitit.ring/default",":reitit.ring/respons",":reitit.ring/response,",":reitit.spec/arg)",":reitit.spec/default",":reitit.spec/handl",":reitit.spec/handler],",":reitit.spec/path",":reitit.spec/path:",":reitit.spec/raw",":reitit.spec/wrap",":remark",":replac",":req",":request",":requir",":respons",":responses)",":result",":role",":root",":rout",":router",":router)]",":rule",":saison]",":saison]])",":schema,",":scope",":secure]]}",":segment",":singl",":sku",":sku/id",":spec",":start",":stop",":strip})))",":summari",":summary,",":swagger",":syntax",":tag",":token]",":top]]}))",":trace).",":trie",":type",":uri",":url",":user",":user/bar}]",":user/bar}]]",":user/baz}]]",":user/db}]",":user/failue}",":user/foo}]",":user/kikka}",":user/ord",":user/ping}",":user/ping}]",":user/route1}]",":user/route2}]",":user/route3}]]",":user/tenant1",":user/tenant1]",":user/us",":user/user]",":user/users}]",":user/user}",":user/user},",":user/user}]]",":val",":valid",":valu",":via",":width",":workspace/page]])",":workspace/page]]))",":workspace/page]]]]])",":wrap",":wrap.",":x",":x)",":y",":y)",":z))]",":zone",":zone)]",";",";#match{:templ",";#reitit.core.match{:templ",";:reitit.core/p",";;",";;{:sku",";=>",";[\"/bar\"",";[#reitit.core.match{:templ",";[:beer/sahti]",";[[\"/foo\"",";[[\"/gin/napue\"",";[[\"/ping\"",";[[\"/route1\"",";avail",";compilerexcept",";enter",";leav",";the",";{:lookup",";{:statu",";|","=>",">",">>",">edn",">middlewar",">path",">path))",">path,",">path:","?","?intomiddleware.","@router","@router)","[\"\"","[\"/\"","[\"/*\"","[\"/:company/users/:us","[\"/:user","[\"/:version/status\"","[\"/:version/status\"]]","[\"/:version/status\"]])","[\"/add","[\"/admin\"","[\"/admin/db\"","[\"/admin/ping\"","[\"/api","[\"/api\"","[\"/api/:users\"","[\"/api/:version/ping\"]]","[\"/api/admin/db\"","[\"/api/admin/users\"","[\"/api/internal/users\"","[\"/api/orders/:id\"","[\"/api/ping\"","[\"/api/pong\"","[\"/api/user/:id\"","[\"/assets/*\"","[\"/auth/recovery/token/:token\"","[\"/bar\"","[\"/bar/:id\"","[\"/baz/:id/:subid\"","[\"/beers\"","[\"/beers/*\"","[\"/beers/bock\"","[\"/beers/lager\"","[\"/beers/sahti\"","[\"/bonus\"","[\"/bulk/:bulk","[\"/ciders/*\"","[\"/db\"","[\"/deep\"","[\"/download\"","[\"/duo\"","[\"/dynamic/*\"","[\"/fail\"","[\"/files\"","[\"/files/fil","[\"/files/{name}.{extension}\"]","[\"/get\"","[\"/ihminen\"","[\"/internal\"","[\"/item/:id\"","[\"/kerran/*\"","[\"/kikka\"","[\"/makkara\"","[\"/math\"","[\"/more\"","[\"/ns2\"","[\"/number\"","[\"/olipa/*\"","[\"/one","[\"/one\"","[\"/ping\"","[\"/ping\"]","[\"/pizza\"","[\"/plus\"","[\"/plus/:z\"","[\"/pong\"","[\"/pong\"]]","[\"/pong/\"","[\"/public\"","[\"/public/*path\"","[\"/public/*path\"]","[\"/public/{*path}\"]","[\"/route1\"","[\"/route2\"","[\"/route3\"","[\"/swagger.json\"","[\"/two\"","[\"/upload\"","[\"/user/:id\"","[\"/user/:us","[\"/user/{us","[\"/users\"","[\"/users/:id\"","[\"/workspace/:project","[\"/workspace/:project/:page\"","[\"/xml\"","[\"events.{target}.{type}\"]]","[\"files\"]}}","[\"http://localhost:8080/api/user/{id}\"","[\"image/png\"]}","[\"lager\"","[\"math\"]}}","[\"pong\"]]])","[\"tenant1\"","[\"workspace/\"","[#(wrap","[%]","[&","[(exception/cr","[(i","[(interceptor","[(str","[...","[0]","[1","[1]","[3","[::admin],","[::admin]}","[::api","[::api]","[::api]}","[::authorize])","[::compani","[::db]","[::description]))","[::mw/coerc","[::remarks]))","[::session","[::session]}}))","[::sku","[::zone])","[:a","[:api","[:beer","[:bonu","[:bonus10]","[:command","[:dynam","[:form","[:format","[:get","[:handler]","[:handler],","[:handler]}),","[:id]}","[:message])})","[:multipart","[:napue]","[:number])})}}]])","[:olipa","[:paramet","[:path","[:photo/height","[:photo/id]","[:photo/id]))","[:post","[:reitit.spec/default","[:request","[:respons","[:rout","[:routes]","[:sku/id]))","[:swagger","[:top","[:user/p","[;;","[[\"\"","[[\"/:this/should/:fail\"","[[\"/admin/ping\"","[[\"/all\"","[[\"/api\"","[[\"/api/:version\"]","[[\"/api/admin\"","[[\"/api/ping\"","[[\"/api/public/ping\"","[[\"/api/{version}\"]","[[\"/auth/login\"","[[\"/avaruus\"","[[\"/baz/:id/:subid\"","[[\"/common\"","[[\"/files/fil","[[\"/foo\"","[[\"/gin/napue\"","[[\"/kikka\"","[[\"/lager\"","[[\"/math\"","[[\"/olut\"","[[\"/ping\"","[[\"/ping\"]","[[\"/saison\"","[[\"/swagger.json\"","[[\"/users\"","[[\"/users/:us","[[\"/users/{us","[[\"auth/login\"","[[\"auth/recovery/token/\"","[[\"broker.{customer}.{device}.{*data}\"]","[[#object[user$wrap]","[[:bonu","[[:queri","[[[:project","[[mw","[[type","[[wrap","[[wrap3","[\\\"index.html\\\"]","[]","[])","[]))","[]}","[]}}]]","[_","[_]","[acc]}]","[actions]","[add","[admin","[app","[beer","[beers]","[bonus]}]","[clojure.java.io","[coercer","[coercion","[conflicts]","[context])","[ctx]","[data","[edn].","[except","[exception/except","[expound","[file","[file]}","[fm","[get","[handler","[handler]","[i","[id","[interceptor]}}])])","[io.pedestal/pedestal.jetti","[io.pedestal/pedestal.servic","[item","[match","[match]","[messag","[message]","[method","[metosin/reitit","[mi","[middleware]","[muuntaja.cor","[muuntaja/format","[new","[number]","[old","[options]","[parameters]","[parameters]}]","[path","[path]","[printer","[registry]","[reitit.coercion.spec]","[reitit.cor","[reitit.frontend.control","[reitit.frontend.easi","[reitit.r","[reitit.ring.coercion","[reitit.ring.middleware.except","[reitit.ring.middleware.multipart","[reitit.ring.middleware.muuntaja","[reitit.ring.middleware.paramet","[reitit.ring.middleware.parameters/paramet","[reitit.swagg","[req]","[request]","[requir","[respond","[respons","[ring.adapter.jetti","[ring.middleware.param","[roles]","[rout","[router","[router]}]","[rrc/coerc","[rule","[rule]}))","[rule]}))))})","[status]","[submatch","[subpath","[subrout","[thi","[this])","[total","[wrap","[wrap2","[x","[x]","[zone","[{::key","[{::r/key","[{:id","[{:key","[{:param","[{:paramet","[{:start","[{{{:key","\\","\\\"abba\\\"))\"},","\\\"public\\\"","\\.","^:replac","^^","^^^^^^","_opts]","`lein","`reitit.coercion/coercion`","`reitit/router)","a:descript","abil","about.","abov","above).","above,","abstract","acc","accept","accept,","access","accessrules])","accident","accumul","accur","achiev","act","action","action:","actual","ad","add","addit","admin","admin}}]]","admin}}]]]))","affect","again","again.","again:","against","against.","ahead","algorithm.","algorithms,","all,","allow","allowed.","alpha","alreadi","also,","altern","alternative,","alternatively,","alway","ancestor","anchor","and/or","annot","anonym","anoth","another.","anyth","anything,","anyway","anywher","any},","api","api\"}","api)","api,","api:","apidoc","apis.","app","app)","app:","appli","applic","application,","application.","application/json;","application/x","applications,","applied,","applied.","apply.","approach","approaches,","approximation.","apps,","arbitrari","arg","args*]","argument","argument,","argument:","arguments:","ariti","around","ask","associ","astut","async","asynchron","at:","ataraxi","atom:","attach","aug","authent","author","authorizationmiddlewar","automat","automatic.","automatically.","avail","available:","average,","avoided.","awesome.","back","back.","backend","backend,","background,","backslashes.","bad","bar","bar})})))","base","baselin","basic","batteri","be","beer","beer)","beer)])]","beers)))","beers:","beers]","befor","behav","behavior","behind","below","bench","benchmark","benchmark.","besid","best","better","better,","better.","between","bi","bide","bidi","bidi,","bidi.","bidi:","bidi?","bigdecim","bit","blown","bodi","bonu","bonus,","bonus}})))","bonus}})}]]","boolean","booleans,","bootstrapping:","both","both,","both.","box","box.","bracket","brackets,","break","browser","build","built","bump","bundl","bundled:","busi","but,","butlast","cach","cache:","calfpath","call","callback","calls.","can't","captur","card","case","case,","case.","cases,","cases.","catch","catches:","caught","caught,","caus","cc])","chain","chain,","chains.","chang","change.","changed.","changed:","changes!","changes.","channel","charact","charset","charset=utf","check","child","choice.","chosen","ci","class","class.","classpath.","clean,","cleanli","cli","click","click?","client","clients.","clj","clojar","clojur","clojure(script)","clojure(script).","clojure,","clojure.","clojure.core/ex","clojure.core/fn?,","clojure.core/revers","clojure.core/string?","clojure.lang.exceptioninfo","clojure.lang.exceptioninfo:","clojure.lang.ideref","clojure.spec","clojure.spec)","clojure.spec,","clojure.spec.alpha/conform,","clojure.specs.","clojurescript","clojurescript,","clojurescript.","clojurescript:","clojurian","close","closur","code","code,","code:","coerc","coerce!","coerced.","coercer","coercers.","coercers}))","coercion","coercion)","coercion,","coercion.","coercion/coerc","coercion/compil","coercion:","coercion]","coercion])","collect","color,","come","common","compar","compat","compil","compilation,","compilation.","compiled.","compilerexcept","compiling:","complet","complex","compojur","compojure,","compojure.","compojure:","compojure?","compon","compos","composit","comput","concaten","concepts.","condit","configur","configuration.","conflict","conflict,","conflicts)))})","conflicts.","conflicts:","conform","conj","consid","considered,","console.","console.warn","constant","construct","contain","content","context","context.","contrari","contribut","contribute?","control","controller,","convert","core","core):","core.async,","cores:","correct","correct,","correctli","correctly:","correctly?","cors.","cost.","cqr","creat","created,","creation","creation:","crude","ctx","ctx)","ctx)})","current","currently,","custom","data","data)","data))","data)]","data,","data.","data:","database.","databases.","dataset","date:","db","db)","dd\"))))","dd\"})))","debug","debug.","decent","decid","declar","declaration,","decod","deepli","default","default).","default,","default.","default:","defaults:","defin","defined).","defined,","defined.","defined:","definit","definition\"","definitions,","definitions.","degrade.","demonstr","depend","depends.","deploy","describ","descript","design","design,","desir","destructur","detail","details.","detect","dev","dev,","develop","development,","development.","didn't","diff","differ","differences:","differenti","differently,","diffs):","direct","directli","directory,","disabl","disabled,","discuss","dispatch","display","do","doc","docs\"","docs\"})))","docs/*\"","docs/index.html\"})","docs:","docs]","docs]]","docs}]","document","documentation,","documentation:","doesn't","don't","done","done).","done,","done.","done:","doubl","downgrad","downsid","driven","driven,","duct","due","dure","dynam","e","e.g.","e.g.,","e/expound","e])","each","easi","easier","easili","easy,","edn","edn,","effect","el","el)","elegantly.","elm","else,","else.","elsewher","embed","emit","emit'","empti","enabl","enabled,","enabled.","enabled:","encod","encoding.","end","endpoint","endpoint)","endpoint,","endpoint.","endpoints.","enforc","engin","english","enough","enqueu","ensur","enter","entri","environment.","error","error.","error:","errors,","errors.","errors:","eta","etc.","etc.)","evalu","even","event","events.","everyth","ex","exact","exampl","example,","example.","example.serv","example:","except","exception\")","exception)","exception).","exception/cr","exception/default","exception/except","exception]","exception])","exceptioninfo","exceptions,","exclud","execut","executor","exist","exist.","exit","expand","expans","expect","expected:","explain","explicit","explicitli","expos","expound","expound/printer)","expound])","express","extend","extend.","extens","extensions.","extern","extra","extract","factor","fail","failed...","failed:","fails,","fallback","fals","false,","false.","false}","false})","false})]","faq","fast","fast,","fast.","faster","faster!","faster.","faster?","fastest","featur","feature,","features.","felt","few","field","field.","file","file\"","file)","file):","files.","file}})}}]","find","fipp,","first","first,","fix","flatten","flattened:","fm))","fn?","follow","following:","forc","form","format","format.","format]","formatt","formatter.","forms.","forwards,","found","found)","found.","fragment","fragment,","frame","framework","frameworks.","frankli","free","frequent","friendli","frontend","frontend,","frontend.","frontend.cor","full","fulli","fun","function","function,","function.","functions,","functions.","functions:","futur","g","gave","gb","gener","generation,","get","ghz","gitbook","gitbook.","give","given","gmt","go","go.","go:","goal","goe","good","good:","googl","graphql","great","guard","guide.","hacki","hand,","hander","handl","handler","handler\"","handler)","handler))","handler)))","handler))))","handler).","handler)]]","handler)]])","handler)}]","handler)}]]])))","handler)}}]","handler)}}])","handler)}}]])","handler,","handler.","handler/middlewar","handler:","handler]","handler])","handler])))","handler]]]]","handlers)","handlers.","handler}","handler}]","handler}]))","handler}]]","handler}]])","handler}]])))","handler}]]])","handler}]]])))","handler}}]]","handler}}]])","handler}}]])))","handler}}]]]","handler}}]]])))","handling.","handling:","hard","hard.","hardcoded)","harder","hash","have","header","headers.","heavi","height","help","help.","helper","here","here'","here.","hidden","hierarchi","higher","hinder","histori","history.","hit","hoc","hold","hook","host","however,","href","html","html5","http","http,","http/1.1","http://localhost:3000","http://spec.commonmark.org/","http])","httpie:","https://github.com/metosin/reitit/blob/master/examples/http","https://github.com/metosin/reitit/blob/master/examples/pedest","https://github.com/metosin/reitit/blob/master/examples/r","https://github.com/metosin/reitit/tree/master/examples/frontend","https://github.com/metosin/reitit/tree/master/examples/http","https://github.com/metosin/reitit/tree/master/examples/pedest","https://quanttype.net/posts/2018","https://www.reddit.com/r/clojure/comments/9csmty/why_interceptors/","human","hw","i.e.","i7","icon","id","id\"","id\",","id\"]","id)","id))","id)))","id))))","id))}]}]]","id/ord","id/orders\"","id/orders\"]","id/orders\"]]","id]","id])","id]))","id]]))","idea","ident","identifi","identifier.","identifier:","identity).","identity,","identity]","identity]}","identity}]","identity}}]]","identity}}]]))","id}","id}\"]","id},","id}/orders\"]]","ignor","ignored.","immut","implement","implementation.","implementation:","implicit","implicitli","in:","includ","include:","inde","index","indic","indirection,","individu","infer","infinit","influenc","info","inform","information:","init!","initi","inject","injectuserintorequestmiddlewar","inlin","input","insert","insid","inspect","inspir","instal","instanc","instance,","instance.","instead","instruct","instrument","int","int,","int?","int?)","int?,","int?}}","int?}}}","int?}}},","int?}}}]","integer.","integr","integrations.","intel","intended.","interact","interceptor","interceptor)","interceptor))","interceptor.","interceptor]","interceptors)","interceptors,","interceptors.","interceptors.html","interceptors:","interceptors?","interest","interfac","interleav","intern","internal)","internal,","interpret","intomiddlewar","intomiddleware.","introduc","introduct","int}}},","invalid","invalid:","inventoried.","inventories,","invocation.","invok","io]))","is.","isn't","issu","issues.","it'","it,","it.","it:","it?","item","iterations.","itself","itself),","i})","java","java.io.fil","java.lang.string,","java.sql.sqlexcept","java.util.d","javascript,","jetti","jetty(9.2.21.v20170120)","jetty]","jetty])","job","join","js/window.histori","js/window.history)","json","jsonista","jvm","kb","keechma","keep","key","key,","key.","keys)","keys,","keys.","keyset.","keyword","keyword?)","keywords)","keywords.","kikka","kikka))","kikka}","kikka}])","kikka}])}])","kinda","know","know.","known","kukka","l2","l3","larg","large!","last","later.","latest","layers:","leaf","lean","leav","left).","left.","lein","length:","less","let'","level","level,","lib","librari","library?","libs.","life","life)","life,","lift","lifting.","linearrouter,","link","list","liter","load","load)","loader","local","locally:","locat","log","log]","logic","logic,","long","look","lookup","lookups:","lot","lot.","love","lupapiste.","m","m/default","m/instanc","m]","m])","macbook","macbookpro11,3","macchiato","machin","macro","magical.","magnitud","magnitude.","main","make","malli","manag","mani","manifold","manipul","manual","map","map,","map.","maps.","margin","match","match)","match))))","match))))))))","match,","match.","match:","match?","match]","matched)","matched),","matched,","matched.","matches.","matches:","matter","matter?","mayb","mb","mean","measur","measure?","memory:","merg","merge.","merged.","messag","message))})","message.","messages,","messages.","messages:","meta","method","method.","method.)","method:","method]})","methods)","methods:","metosin/r","micro","mid","middlewar","middleware)","middleware,","middleware.","middleware/interceptor","middleware:","middleware])","middleware]}","middleware]}})","middleware]}})))","minimalist","miss","missing,","missing/extra","missing:","misspel","mix","mm","model","model,","model.","models.","modif","modifi","modified?,","modul","modular","module).","module.","module:","modules:","more","more.","mostli","mount","mount.\"","mounted,","move","much","multimethod","multimethod,","multimethod.","multipart","multipart/cr","multipart/multipart","multipart/temp","multipart]","multipart])","multipl","mutabl","muuntaja","muuntaja.core/muuntaja","muuntaja/format","muuntaja]","muuntaja])","naiv","name","name!","name,","name.","name:","name]","name])","names.","names:","namespac","namespace,","namespace.","namespaces.","name},","nano","navig","need","negoti","negotiation,","negotiation.","nest","nester","nesting/composition.","never","new","next","next,","nice","nice,","nicer","nil","nil)","nil))","nil)))","nil).","nil)]","nil)]])","nil)})","nil,","nil.","nil:","nil]","nil]]","nil})","non","none","normal","normal,","not.","not...","notabl","note","note:","noth","nothing.","nothing.\"","notic","now","npm","ns","ns1","ns1)","ns1,","ns1/rout","ns1/routes]])","ns2)","ns2/routes]","ns3)","ns3.","number","number))})","numbers,","objects:","of,","ok","old","omit","on","on.","on:","onc","once,","one:","ones,","only)","opaqu","opensensor","ops/sec","opt","optim","option","option)","option,","option.","option:","optionally,","options)","options))","options)))","options,","options.","options:","options]","opts)","opts))))","opts)]","opts]","order","order\"","order.","order:","order]])","order]}}])]","orient","origin","otherwis","out","out*","output:","outsid","over","overal","overrid","overridden","package.","page","page,","page.","param","paramet","parameter,","parameter.","parameter:","parameters\"","parameters.","parameters/paramet","parameters:","parameters]","params.","params]","params]))","params]}}","params}},","params}}]","pars","part","part.","partial","partialmatch","partialmatch,","particip","partli","parts:","part}}","part}}}","pass","patch","path","path)","path)]","path,","path.","path:","path]","path])","paths,","paths.","paths:","pattern","pedest","pedestal'","pedestal).","pedestal,","pedestal.","pedestal:","pedestal?","pedestal])","penalty.","per","perf","perfect.","perform","performance,","performance.","performance:","persist","photo","ping","pizza","place","place.","plain","pleas","plu","pluggabl","plumat","po","pohjavirta","poke","port","pos?","positiveint","positiveint)\"},","positiveint}}}","possibl","possible,","post","power","powerful.","pr!","practic","practis","pre","precis","precompute/compil","preconfigur","predicate:","predicates,","prefer","prefil","prefix","present","present.","present:","pretti","pretty/exception})","pretty])","prevent","preview","previou","print","printer","pro","problem","problem.","problem:","problems.","process","processing,","processing.","processor","processors:","prod","produc","product","production.","programmatically:","project","projects.","promesa.","promise:","pronounc","proof","properties:","property,","property.","protocol","protocol,","protocol.","protocol:","proven","provid","public","publish","pull","purpose:","push","put","python'","qualifi","queri","query)","question","quick","quit","r/expand","r/linear","r/match","r/option","r/options.","r/rout","r])","r]))","rack.","radix","rails)","raise))))))","raise)))))))})","raise]","rate","rational","raw","rcs/coercion","rcs/json","rcs])","re","react","react.js,","read","readabl","readable)","readable,","reader","readi","readme:","real","realistic.","realli","really,","reason","reasoning:","recogn","recompil","record","records.","recreat","recurs","recursive,","recursive.","redirect","refer","referenc","references:","regardless","regex","registri","registry,","registry.","registry:","registry?","regress","reinitialized:","reitit","reitit,","reitit.","reitit.coercion.malli/coercion","reitit.coercion.schema/coercion","reitit.coercion.spec/coercion","reitit.coercion/coerce!","reitit.coercion/coercion","reitit.coercion/compil","reitit.cor","reitit.core.rout","reitit.core/expand","reitit.core/expand)","reitit.core/match","reitit.core/merg","reitit.core/rout","reitit.core/router,","reitit.core/router:","reitit.dev.pretty/except","reitit.exception/exception)","reitit.exception/exception.","reitit.frontend","reitit.frontend.controllers/appli","reitit.frontend.easi","reitit.frontend.easy:","reitit.http.interceptor.dev/print","reitit.http.interceptors.dev/print","reitit.http.interceptors.exception/except","reitit.http.interceptors.multipart/multipart","reitit.http.interceptors.muuntaja/format","reitit.http.interceptors.parameters/paramet","reitit.http/http","reitit.http/r","reitit.http/rout","reitit.impl/intostring.","reitit.interceptor","reitit.interceptor.sieppari/executor","reitit.interceptor/executor","reitit.interceptor/transform","reitit.middleware/intomiddlewar","reitit.middleware/middlewar","reitit.ring.coercion:","reitit.ring.middleware.dev/print","reitit.ring.middleware.multipart/multipart","reitit.ring.middleware.parameters/paramet","reitit.ring.spec/valid","reitit.ring/cr","reitit.ring/get","reitit.ring/handler.","reitit.ring/r","reitit.ring_test$wrap_bonus@59fddabb","reitit.spec","reitit.spec/valid","reitit.swagg","reitit.swagger.swagg","reitit.swagger/cr","reitit:","rel","relat","relev","reload","remark","remarks\"}","rememb","remov","render","repl","repl.","repl`","replac","repo","represent","representation.","req","request","request)","request))","request)))","request))))","request)))))","request))))})","request))]","request))})))","request)}})","request,","request.","request:","request]","request}]","requir","required)","reset","resolut","resolution.","resolution:","resolv","resourc","resources,","resources.","respond","respons","response\"","response)","response))","response)))","response.","response:","response]","responses)","responses,","responses:","responses]}","rest","rest(ish)","result","results,","rethrown","retriev","return","returned,","returned:","reus","reuse)","revers","reverse)})","reverse})))","rfc]))","rfe]","ring","ring,","ring.","ring.middleware.params/wrap","ring/creat","ring/rout","ring:","ring]","ring])","roadmap","role","roles)))","roles:","roles]","roles]}","roles]}]","roles]}]]","roles]}})))","root","root,","rout","route))))","route,","route.","route:","route]","route]]","route]])))","router","router!","router)","router))","router)))","router):","router,","router.","router2","router2)","router:","router?","routers))","routers))))","routers,","routers.","routers:","routers?","routers]","router}))","router}]","router}]]))","routes)","routes))","routes)))","routes):","routes,","routes.","routes:","routes]","routes])","routing)","routing,","routing.","routing:","routing?","rrc/coerc","rrc])","rrs/valid","rrs])","rs/valid","rs/validate})","rs])","ruby'","rule","rules).","run","runtim","s/*explain","s/and,","s/any}}","s/coll","s/every),","s/int","s/int}","s/int}}","s/int}}}]","s/int}}}]))","s/key","s/keys,","s/map","s/nillabl","s/or,","s/str","s])","safe","saison!?","same","same.","sampl","sane","satisfi","save","scenario","scene","scenes,","schema","schema.","schema:","scientif","scope","seamlessli","search","second","second,","seconds,","see","select","separ","separately.","sequenc","sequenti","sequential)","serv","served.","server","server)","server.","server:","server])","servers,","set","set,","set.","set])","sets)","setup:","sever","shape","share","shine","ship","shipped,","short","show","side","sieppari","sieppari.","sieppari/executor}))","sieppari:","sieppari])","sight","silent","similar","simpl","simple,","singl","site","size","slack","slack.","slash","slash)","slash,","slash.","slashes.","slow,","slower","slower,","slowest","slurp)","small","snappi","so,","solut","solv","someth","sometim","somewher","sourc","source\".","source:","span","speaker","spec","spec)","spec,","spec.","spec:","spec])","special","specif","specifi","specification,","specification.","specification:","specs),","specs,","specs.","specs:","specs?","speed","speed:","spell","spell/clos","spell])","sqlexcept","st/json","st/string","st])","stabl","stack","stack,","start","start\"","start\"))}]}","started.","state","static","static,","static.","statu","status)]","stay","step","steps.","stest])","still","stop","stop\"","store","str","str])","stream","string","string,","string:","string?","string?)","string?,","strings,","strings:","strip","structur","str})))","style","sub","submap.","submatch)))","submit","subpath)]","subrout","subrouters.","success","successfulli","such","suitabl","summari","sun.","super","support","support:","supported,","supported:","suppos","sure.","swagger","swagger.","swagger/src/example/server.clj","swagger/src/example/server.clj.","swagger2","swagger]","swagger])","swap","sync","synchron","syntax","syntax,","syntax.","syntax:","system","system.","tabl","table.","tag","take","taken","target","techempow","ten","termin","terminator.","terse,","test","test).","test,","tests,","tests.","text/xml","thank","that'","that,","that?","them,","them.","theme,","then,","therefor","thing","things.","things.\"","this):","this,","this.","this:","those","three","through","throw","thrown","thrown,","thrown/rais","thu","thus,","time","time)","time),","time,","time.","tip","to,","to.","to:","todo","togeth","together.","too).","too.","too:","took","tool","tools.","tools.cor","tools.core/spec,","tools.spec","tools.spel","tools.spell/clos","top","total","total}}))})","total}}))}}]]","toward","trace","trail","transform","transformation,","transformer)","transit)\"","translat","tree","tree),","tree,","tree.","tree:","trees,","trees.","tri","trickeri","trie","trivial","true","true)","true)))","true,","true}","true}]","true}]])","trust","turn","two","two\"","two/swagger.json\"}","type","type\"","type:","ui","ui\"","ui,","ui.","ui/creat","ui:","ui]","ui])","un","unauthent","under","underli","understand","unifi","unmount","unnam","unreachable.","until","unwrap","up","up.","updat","uri","uri)","uri]","url","urlencod","us","usag","use,","used.","used:","user","user\"","user]","user]}}]","usual","util","uuid","uuid\"","uuid/:pag","uuid]","val:","valid","validation,","validation.","valu","value))))","value,","value.","value:","value]","values.","var","varieti","vector","vector.","verbose.","verifi","version","version:","versioning.","via","view","view,","view]))","view},","visual","vote","walk","walker","want","want,","wanted,","warn","way","way,","way.","we'll","we'r","web","webjar","wed,","welcom","welcome!","well,","whatev","whenev","whole","why?","width","wild","wildcard","wildcard,","with:","with?","within","without","won't","work","work:","workflow","works,","works:","world","wrap","wrap2","wrap3","wrapper","wrap})","wrap}))","write","written","wrong","wrong.","wsgi","www","x","x)","x:=1","xml","y)}})}","y)}})}}]","y)}})}}]]]","y:=2","y]}","yet.","yield","you'd","yourself.","zero","zone","zone)","{","{\"/api/ping\"","{\"content","{\"location\"","{\"x\"","{*user/path}.","{200","{:","{::interceptor/transform","{::kikka","{::middleware/registri","{::middleware/transform","{::role","{::server/typ","{:bodi","{:bonu","{:coercion","{:compani","{:compil","{:conflict","{:control","{:data","{:date","{:descriptionz","{:enter","{:except","{:executor","{:expand","{:file","{:get","{:handler","{:href","{:i","{:id","{:info","{:inject","{:interceptor","{:iso","{:lookup","{:messag","{:method","{:middlewar","{:multipart","{:muuntaja","{:name","{:no","{:not","{:number","{:paramet","{:path","{:port","{:post","{:problem","{:produc","{:queri","{:reitit.coercion/request","{:request","{:role","{:router","{:rule","{:schema","{:sku","{:statu","{:summari","{:swagger","{:syntax","{:tag","{:theme","{:titl","{:too","{:total","{:type","{:uri","{:use","{:user","{:valid","{:valu","{:x","{:z","{:zone","{;;","{method","{name}","{name}.pdf\"]","{number}.pdf\"]]","{rout","{user/id},","{version}.pdf\"]]","{}","{})","{}))})","{},","{}.","{}}","{}}}}}","|","}","µs","µs."],"pipeline":["stopWordFilter","stemmer"]},"store":{"./":{"url":"./","title":"Introduction","keywords":"","body":"Introduction\nReitit is a fast data-driven router for Clojure(Script).\n\nSimple data-driven route syntax\nRoute conflict resolution\nFirst-class route data\nBi-directional routing\nPluggable coercion (schema & clojure.spec)\nHelpers for ring, http, pedestal & frontend\nFriendly Error Messages\nExtendable\nModular\nFast\n\nThere is #reitit in Clojurians Slack for discussion & help.\nMain Modules\n\nreitit - all bundled\nreitit-core - the routing core\nreitit-ring - a ring router\nreitit-middleware - common middleware for reitit-ring\nreitit-spec clojure.spec coercion\nreitit-schema Schema coercion\nreitit-swagger Swagger2 apidocs\nreitit-swagger-ui Integrated Swagger UI.\nreitit-frontend Tools for frontend routing\nreitit-http http-routing with Pedestal-style Interceptors\nreitit-interceptors - common interceptors for reitit-http\nreitit-sieppari support for Sieppari Interceptors\nreitit-dev - development utilities\n\nExtra modules\n\nreitit-pedestal support for Pedestal\n\nLatest version\nAll bundled:\n[metosin/reitit \"0.5.5\"]\n\nOptionally, the parts can be required separately.\nExamples\nSimple router\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [[\"/api/ping\" ::ping]\n [\"/api/orders/:id\" ::order-by-id]]))\n\nRouting:\n(r/match-by-path router \"/api/ipa\")\n; nil\n\n(r/match-by-path router \"/api/ping\")\n; #Match{:template \"/api/ping\"\n; :data {:name ::ping}\n; :result nil\n; :path-params {}\n; :path \"/api/ping\"}\n\n(r/match-by-path router \"/api/orders/1\")\n; #Match{:template \"/api/orders/:id\"\n; :data {:name ::order-by-id}\n; :result nil\n; :path-params {:id \"1\"}\n; :path \"/api/orders/1\"}\n\nReverse-routing:\n(r/match-by-name router ::ipa)\n; nil\n\n(r/match-by-name router ::ping)\n; #Match{:template \"/api/ping\"\n; :data {:name ::ping}\n; :result nil\n; :path-params {}\n; :path \"/api/ping\"}\n\n(r/match-by-name router ::order-by-id)\n; #PartialMatch{:template \"/api/orders/:id\"\n; :data {:name :user/order-by-id}\n; :result nil\n; :path-params nil\n; :required #{:id}}\n\n(r/partial-match? (r/match-by-name router ::order-by-id))\n; true\n\n(r/match-by-name router ::order-by-id {:id 2})\n; #Match{:template \"/api/orders/:id\",\n; :data {:name ::order-by-id},\n; :result nil,\n; :path-params {:id 2},\n; :path \"/api/orders/2\"}\n\nRing-router\nRing-router adds support for :handler functions, :middleware and routing based on :request-method. It also supports pluggable parameter coercion (clojure.spec), data-driven middleware, route and middleware compilation, dynamic extensions and more.\n(require '[reitit.ring :as ring])\n\n(defn handler [_]\n {:status 200, :body \"ok\"})\n\n(defn wrap [handler id]\n (fn [request]\n (update (handler request) :wrap (fnil conj '()) id)))\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [[wrap :api]]}\n [\"/ping\" {:get handler\n :name ::ping}]\n [\"/admin\" {:middleware [[wrap :admin]]}\n [\"/users\" {:get handler\n :post handler}]]])))\n\nRouting:\n(app {:request-method :get, :uri \"/api/admin/users\"})\n; {:status 200, :body \"ok\", :wrap (:api :admin}\n\n(app {:request-method :put, :uri \"/api/admin/users\"})\n; nil\n\nReverse-routing:\n(require '[reitit.core :as r])\n\n(-> app (ring/get-router) (r/match-by-name ::ping))\n; #Match{:template \"/api/ping\"\n; :data {:middleware [[#object[user$wrap] :api]]\n; :get {:handler #object[user$handler]}\n; :name ::ping}\n; :result #Methods{...}\n; :path-params nil\n; :path \"/api/ping\"}\n\n"},"basics/route_syntax.html":{"url":"basics/route_syntax.html","title":"Route Syntax","keywords":"","body":"Route Syntax\nRoutes are defined as vectors of String path and optional (non-sequential) route argument child routes.\nRoutes can be wrapped in vectors and lists and nil routes are ignored.\nPaths can have path-parameters (:id) or catch-all-parameters (*path). Parameters can also be wrapped in brackets, enabling use of qualified keywords {user/id}, {*user/path}. By default, both syntaxes are supported, see configuring routers on how to change this.\nExamples\nSimple route:\n[\"/ping\"]\n\nTwo routes:\n[[\"/ping\"]\n [\"/pong\"]]\n\nRoutes with route arguments:\n[[\"/ping\" ::ping]\n [\"/pong\" {:name ::pong}]]\n\nRoutes with path parameters:\n[[\"/users/:user-id\"]\n [\"/api/:version/ping\"]]\n\n[[\"/users/{user-id}\"]\n [\"/files/file-{number}.pdf\"]]\n\nRoute with catch-all parameter:\n[\"/public/*path\"]\n\n[\"/public/{*path}\"]\n\nNested routes:\n[\"/api\"\n [\"/admin\" {:middleware [::admin]}\n [\"\" ::admin]\n [\"/db\" ::db]]\n [\"/ping\" ::ping]]\n\nSame routes flattened:\n[[\"/api/admin\" {:middleware [::admin], :name ::admin}]\n [\"/api/admin/db\" {:middleware [::admin], :name ::db}]\n [\"/api/ping\" {:name ::ping}]]\n\nEncoding\nReitit does not apply any encoding to your paths. If you need that, you must encode them yourself. E.g., /foo bar should be /foo%20bar.\nWildcards\nNormal path-parameters (:id) can start anywhere in the path string, but have to end either to slash / (currently hardcoded) or to an end of path string:\n[[\"/api/:version\"]\n [\"/files/file-:number\"]\n [\"/user/:user-id/orders\"]]\n\nBracket path-parameters can start and stop anywhere in the path-string, the following character is used as a terminator.\n[[\"/api/{version}\"]\n [\"/files/{name}.{extension}\"]\n [\"/user/{user-id}/orders\"]]\n\nHaving multiple terminators after a bracket path-path parameter with identical path prefix will cause a compile-time error at router creation:\n[[\"/files/file-{name}.pdf\"] ;; terminator \\.\n [\"/files/file-{name}-{version}.pdf\"]] ;; terminator \\-\n\nSlash Free Routing\n[[\"broker.{customer}.{device}.{*data}\"]\n [\"events.{target}.{type}\"]]\n\nGenerating routes\nRoutes are just data, so it's easy to create them programmatically:\n(defn cqrs-routes [actions]\n [\"/api\" {:interceptors [::api ::db]}\n (for [[type interceptor] actions\n :let [path (str \"/\" (name interceptor))\n method (case type\n :query :get\n :command :post)]]\n [path {method {:interceptors [interceptor]}}])])\n\n(cqrs-routes\n [[:query 'get-user]\n [:command 'add-user]\n [:command 'add-order]])\n; [\"/api\" {:interceptors [::api ::db]}\n; ([\"/get-user\" {:get {:interceptors [get-user]}}]\n; [\"/add-user\" {:post {:interceptors [add-user]}}]\n; [\"/add-order\" {:post {:interceptors [add-order]}}])]\n\nExplicit path-parameter syntax\nRouter options :syntax allows the path-parameter syntax to be explicitely defined. It takes a keyword or set of keywords as a value. Valid values are :colon and :bracket. Default value is #{:colon :bracket}.\nWith defaults:\n(-> (r/router\n [\"http://localhost:8080/api/user/{id}\" ::user-by-id])\n (r/match-by-path \"http://localhost:8080/api/user/123\"))\n;#Match{:template \"http://localhost:8080/api/user/{id}\",\n; :data {:name :user/user-by-id},\n; :result nil,\n; :path-params {:id \"123\", :8080 \":8080\"},\n; :path \"http://localhost:8080/api/user/123\"}\n\nSupporting only :bracket syntax:\n(require '[reitit.core :as r])\n\n(-> (r/router\n [\"http://localhost:8080/api/user/{id}\" ::user-by-id]\n {:syntax :bracket})\n (r/match-by-path \"http://localhost:8080/api/user/123\"))\n;#Match{:template \"http://localhost:8080/api/user/{id}\",\n; :data {:name :user/user-by-id},\n; :result nil,\n; :path-params {:id \"123\"},\n; :path \"http://localhost:8080/api/user/123\"}\n\n"},"basics/router.html":{"url":"basics/router.html","title":"Router","keywords":"","body":"Router\nRoutes are just data and to do routing, we need a router instance satisfying the reitit.core/Router protocol. Routers are created with reitit.core/router function, taking the raw routes and optionally an options map.\nThe Router protocol:\n(defprotocol Router\n (router-name [this])\n (routes [this])\n (options [this])\n (route-names [this])\n (match-by-path [this path])\n (match-by-name [this name] [this name params]))\n\nCreating a router:\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [\"/api\"\n [\"/ping\" ::ping]\n [\"/user/:id\" ::user]]))\n\nName of the created router:\n(r/router-name router)\n; :mixed-router\n\nThe flattened route tree:\n(r/routes router)\n; [[\"/api/ping\" {:name :user/ping}]\n; [\"/api/user/:id\" {:name :user/user}]]\n\nWith a router instance, we can do Path-based routing or Name-based (Reverse) routing.\nMore details\nRouter options:\n(r/options router)\n{:lookup #object[...]\n :expand #object[...]\n :coerce #object[...]\n :compile #object[...]\n :conflicts #object[...]}\n\nRoute names:\n(r/route-names router)\n; [:user/ping :user/user]\n\nThe compiled route tree:\n(r/routes router)\n; [[\"/api/ping\" {:name :user/ping} nil]\n; [\"/api/user/:id\" {:name :user/user} nil]]\n\nComposing\nAs routes are defined as plain data, it's easy to merge multiple route trees into a single router\n(def user-routes\n [[\"/users\" ::users]\n [\"/users/:id\" ::user]]) \n\n(def admin-routes\n [\"/admin\"\n [\"/ping\" ::ping]\n [\"/db\" ::db]])\n\n(r/router\n [admin-routes\n user-routes])\n\nMerged route tree:\n(r/routes router)\n; [[\"/admin/ping\" {:name :user/ping}]\n; [\"/admin/db\" {:name :user/db}]\n; [\"/users\" {:name :user/users}]\n; [\"/users/:id\" {:name :user/user}]]\n\nMore details on composing routers.\nBehind the scenes\nWhen router is created, the following steps are done:\n\nroute tree is flattened\nroute arguments are expanded (via :expand option)\nroutes are coerced (via :coerce options)\nroute tree is compiled (via :compile options)\nroute conflicts are resolved (via :conflicts options)\noptionally, route data is validated (via :validate options)\nrouter implementation is automatically selected (or forced via :router options) and created\n\n"},"basics/path_based_routing.html":{"url":"basics/path_based_routing.html","title":"Path-based Routing","keywords":"","body":"Path-based Routing\nPath-based routing is done using the reitit.core/match-by-path function. It takes the router and path as arguments and returns one of the following:\n\nnil, no match\nPartialMatch, path matched, missing path-parameters (only in reverse-routing)\nMatch, an exact match\n\nGiven a router:\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [\"/api\"\n [\"/ping\" ::ping]\n [\"/user/:id\" ::user]]))\n\nNo match returns nil:\n(r/match-by-path router \"/hello\")\n; nil\n\nMatch provides the route information:\n(r/match-by-path router \"/api/user/1\")\n; #Match{:template \"/api/user/:id\"\n; :data {:name :user/user}\n; :path \"/api/user/1\"\n; :result nil\n; :path-params {:id \"1\"}}\n\n"},"basics/name_based_routing.html":{"url":"basics/name_based_routing.html","title":"Name-based Routing","keywords":"","body":"Name-based (reverse) Routing\nAll routes which have :name route data defined can also be matched by name.\nGiven a router:\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [\"/api\"\n [\"/ping\" ::ping]\n [\"/user/:id\" ::user]]))\n\nListing all route names:\n(r/route-names router)\n; [:user/ping :user/user]\n\nNo match returns nil:\n(r/match-by-name router ::kikka)\nnil\n\nMatching a route:\n(r/match-by-name router ::ping)\n; #Match{:template \"/api/ping\"\n; :data {:name :user/ping}\n; :result nil\n; :path-params {}\n; :path \"/api/ping\"}\n\nIf not all path-parameters are set, a PartialMatch is returned:\n(r/match-by-name router ::user)\n; #PartialMatch{:template \"/api/user/:id\",\n; :data {:name :user/user},\n; :result nil,\n; :path-params nil,\n; :required #{:id}}\n\n(r/partial-match? (r/match-by-name router ::user))\n; true\n\nWith provided path-parameters:\n(r/match-by-name router ::user {:id \"1\"})\n; #Match{:template \"/api/user/:id\"\n; :data {:name :user/user}\n; :path \"/api/user/1\"\n; :result nil\n; :path-params {:id \"1\"}}\n\nPath-parameters are automatically coerced into strings, with the help of (currently internal) Protocol reitit.impl/IntoString. It supports strings, numbers, booleans, keywords and objects:\n(r/match-by-name router ::user {:id 1})\n; #Match{:template \"/api/user/:id\"\n; :data {:name :user/user}\n; :path \"/api/user/1\"\n; :result nil\n; :path-params {:id \"1\"}}\n\nThere is also an exception throwing version:\n(r/match-by-name! router ::user)\n; ExceptionInfo missing path-params for route /api/user/:id: #{:id}\n\nTo turn a Match into a path, there is reitit.core/match->path:\n(-> router\n (r/match-by-name ::user {:id 1})\n (r/match->path))\n; \"/api/user/1\"\n\nIt can take an optional map of query-parameters too:\n(-> router\n (r/match-by-name ::user {:id 1})\n (r/match->path {:iso \"möly\"}))\n; \"/api/user/1?iso=m%C3%B6ly\"\n\n"},"basics/route_data.html":{"url":"basics/route_data.html","title":"Route Data","keywords":"","body":"Route Data\nRoute data is the key feature of reitit. Routes can have any map-like data attached to them, to be interpreted by the client application, Router or routing components like Middleware or Interceptors.\n[[\"/ping\" {:name ::ping}]\n [\"/pong\" {:handler identity}]\n [\"/users\" {:get {:roles #{:admin}\n :handler identity}}]]\n\nBesides map-like data, raw routes can have any non-sequential route argument after the path. This argument is expanded by Router (via :expand option) into route data at router creation time. \nBy default, Keywords are expanded into :name and functions into :handler keys.\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [[\"/ping\" ::ping]\n [\"/pong\" identity]\n [\"/users\" {:get {:roles #{:admin}\n :handler identity}}]]))\n\nUsing Route Data\nExpanded route data can be retrieved from a router with routes and is returned with match-by-path and match-by-name in case of a route match.\n(r/routes router)\n; [[\"/ping\" {:name ::ping}]\n; [\"/pong\" {:handler identity]}\n; [\"/users\" {:get {:roles #{:admin}\n; :handler identity}}]]\n\n(r/match-by-path router \"/ping\")\n; #Match{:template \"/ping\"\n; :data {:name :user/ping}\n; :result nil\n; :path-params {}\n; :path \"/ping\"}\n\n(r/match-by-name router ::ping)\n; #Match{:template \"/ping\"\n; :data {:name :user/ping}\n; :result nil\n; :path-params {}\n; :path \"/ping\"}\n\nNested Route Data\nFor nested route trees, route data is accumulated recursively from root towards leafs using meta-merge. Default behavior for collections is :append, but this can be overridden to :prepend, :replace or :displace using the target meta-data.\nAn example router with nested data:\n(def router\n (r/router\n [\"/api\" {:interceptors [::api]}\n [\"/ping\" ::ping]\n [\"/admin\" {:roles #{:admin}}\n [\"/users\" ::users]\n [\"/db\" {:interceptors [::db]\n :roles ^:replace #{:db-admin}}]]]))\n\nResolved route tree:\n(r/routes router)\n; [[\"/api/ping\" {:interceptors [::api]\n; :name :user/ping}]\n; [\"/api/admin/users\" {:interceptors [::api]\n; :roles #{:admin}\n; :name ::users} nil]\n; [\"/api/admin/db\" {:interceptors [::api ::db]\n; :roles #{:db-admin}}]]\n\nRoute Data Fragments\nJust like fragments in React.js, we can create routing tree fragments by using empty path \"\". This allows us to add route data without accumulating to path.\nGiven a route tree:\n[[\"/swagger.json\" ::swagger]\n [\"/api-docs\" ::api-docs]\n [\"/api/ping\" ::ping]\n [\"/api/pong\" ::pong]]\n\nAdding :no-doc route data to exclude the first routes from generated Swagger documentation:\n[[\"\" {:no-doc true}\n [\"/swagger.json\" ::swagger]\n [\"/api-docs\" ::api-docs]]\n [\"/api/ping\" ::ping]\n [\"/api/pong\" ::pong]]\n\nAccumulated route data:\n(def router\n (r/router\n [[\"\" {:no-doc true}\n [\"/swagger.json\" ::swagger]\n [\"/api-docs\" ::api-docs]]\n [\"/api/ping\" ::ping]\n [\"/api/pong\" ::pong]]))\n\n(r/routes router)\n; [[\"/swagger.json\" {:no-doc true, :name ::swagger}]\n; [\"/api-docs\" {:no-doc true, :name ::api-docs}]\n; [\"/api/ping\" {:name ::ping}]\n; [\"/api/pong\" {:name ::pong}]]\n\nTop-level Route Data\nRoute data can be introduced also via Router option :data:\n(def router\n (r/router\n [\"/api\"\n {:middleware [::api]}\n [\"/ping\" ::ping]\n [\"/pong\" ::pong]]\n {:data {:middleware [::session]}}))\n\nExpanded routes:\n[[\"/api/ping\" {:middleware [::session ::api], :name ::ping}]\n [\"/api/pong\" {:middleware [::session ::api], :name ::pong}]]\n\nCustomizing Expansion\nBy default, router :expand option has value r/expand function, backed by a r/Expand protocol. Expansion can be customized either by swapping the :expand implementation or by extending the Protocol. r/Expand implementations can be recursive.\nNaive example to add direct support for java.io.File route argument:\n(extend-type java.io.File\n r/Expand\n (expand [file options]\n (r/expand\n #(slurp file)\n options)))\n\n(r/router\n [\"/\" (java.io.File. \"index.html\")])\n\nPage shared routes has an example of an custom :expand implementation.\nRoute data validation\nSee Route data validation.\n"},"basics/route_data_validation.html":{"url":"basics/route_data_validation.html","title":"Route Data Validation","keywords":"","body":"Route Data Validation\nRoute data can be anything, so it's easy to go wrong. Accidentally adding a :role key instead of :roles might hinder the whole routing app without any authorization in place.\nTo fail fast, we could use the custom :coerce and :compile hooks to apply data validation and throw exceptions on first sighted problem.\nBut there is a better way. Router has a :validation hook to validate the whole route tree after it's successfully compiled. It expects a 2-arity function routes opts => () that can side-effect in case of validation errors.\nclojure.spec\nNamespace reitit.spec contains specs for main parts of reitit.core and a helper function validate that runs spec validation for all route data and throws an exception if any errors are found.\nA Router with invalid route data:\n(require '[reitit.core :as r])\n\n(r/router\n [\"/api\" {:handler \"identity\"}])\n; #object[reitit.core$...]\n\nFailing fast with clojure.spec validation turned on:\n(require '[reitit.spec :as rs])\n\n(r/router\n [\"/api\" {:handler \"identity\"}]\n {:validate rs/validate})\n; CompilerException clojure.lang.ExceptionInfo: Invalid route data:\n;\n; -- On route -----------------------\n;\n; \"/api\"\n;\n; In: [:handler] val: \"identity\" fails spec: :reitit.spec/handler at: [:handler] predicate: fn?\n;\n; {:problems (#reitit.spec.Problem{:path \"/api\", :scope nil, :data {:handler \"identity\"}, :spec :reitit.spec/default-data, :problems #:clojure.spec.alpha{:problems ({:path [:handler], :pred clojure.core/fn?, :val \"identity\", :via [:reitit.spec/default-data :reitit.spec/handler], :in [:handler]}), :spec :reitit.spec/default-data, :value {:handler \"identity\"}}})}, compiling: ...\n\nPretty errors\nTurning on Pretty Errors will give much nicer error messages:\n(require '[reitit.dev.pretty :as pretty])\n\n(r/router\n [\"/api\" {:handler \"identity\"}]\n {:validate rs/validate\n :exception pretty/exception})\n\n\nCustomizing spec validation\nrs/validate reads the following router options:\n\n\n\nkey\ndescription\n\n\n\n\n:spec\nthe spec to verify the route data (default ::rs/default-data)\n\n\n:reitit.spec/wrap\nfunction of spec => spec to wrap all route specs\n\n\n\nNOTE: clojure.spec implicitly validates all values with fully-qualified keys if specs exist with the same name.\nInvalid spec value:\n(require '[clojure.spec.alpha :as s])\n\n(s/def ::role #{:admin :manager})\n(s/def ::roles (s/coll-of ::role :into #{}))\n\n(r/router\n [\"/api\" {:handler identity\n ::roles #{:adminz}}]\n {:validate rs/validate\n :exception pretty/exception})\n\n\nClosed Specs\nTo fail-fast on non-defined and misspelled keys on route data, we can close the specs using :reitit.spec/wrap options with value of spec-tools.spell/closed that closed the top-level specs.\nRequiring a:description and validating using closed specs:\n(require '[spec-tools.spell :as spell])\n\n(s/def ::description string?)\n\n(r/router\n [\"/api\" {:summary \"kikka\"}]\n {:validate rs/validate\n :spec (s/merge ::rs/default-data\n (s/keys :req-un [::description]))\n ::rs/wrap spell/closed\n :exception pretty/exception})\n\n\nIt catches also typing errors:\n(r/router\n [\"/api\" {:descriptionz \"kikka\"}]\n {:validate rs/validate\n :spec (s/merge ::rs/default-data\n (s/keys :req-un [::description]))\n ::rs/wrap spell/closed\n :exception pretty/exception})\n\n\n"},"basics/route_conflicts.html":{"url":"basics/route_conflicts.html","title":"Route Conflicts","keywords":"","body":"Route Conflicts\nWe should fail fast if a router contains conflicting paths or route names. \nWhen a Router is created via reitit.core/router, both path and route name conflicts are checked automatically. By default, in case of conflict, an ex-info is thrown with a descriptive message. In some (legacy api) cases, path conflicts should be allowed and one can override the path conflict resolution via :conflicts router option or via :conflicting route data.\nPath Conflicts\nRoutes with path conflicts:\n(require '[reitit.core :as r])\n\n(def routes\n [[\"/ping\"]\n [\"/:user-id/orders\"]\n [\"/bulk/:bulk-id\"]\n [\"/public/*path\"]\n [\"/:version/status\"]])\n\nCreating router with defaults:\n(r/router routes)\n; CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route paths:\n;\n; -> /:user-id/orders\n; -> /public/*path\n; -> /bulk/:bulk-id\n;\n; -> /bulk/:bulk-id\n; -> /:version/status\n;\n; -> /public/*path\n; -> /:version/status\n;\n\nTo ignore the conflicts:\n(r/router\n routes\n {:conflicts nil})\n; => #object[reitit.core$quarantine_router$reify\n\nTo just log the conflicts:\n(require '[reitit.exception :as exception])\n\n(r/router\n routes\n {:conflicts (fn [conflicts]\n (println (exception/format-exception :path-conflicts nil conflicts)))})\n; Router contains conflicting route paths:\n;\n; -> /:user-id/orders\n; -> /public/*path\n; -> /bulk/:bulk-id\n;\n; -> /bulk/:bulk-id\n; -> /:version/status\n;\n; -> /public/*path\n; -> /:version/status\n;\n; => #object[reitit.core$quarantine_router$reify]\n\nAlternatively, you can ignore conflicting paths individually via :conflicting in route data:\n(def routes\n [[\"/ping\"]\n [\"/:user-id/orders\" {:conflicting true}]\n [\"/bulk/:bulk-id\" {:conflicting true}]\n [\"/public/*path\" {:conflicting true}]\n [\"/:version/status\" {:conflicting true}]])\n; => #'user/routes\n(r/router routes)\n; => #object[reitit.core$quarantine_router$reify]\n\nName conflicts\nRoutes with name conflicts:\n(def routes\n [[\"/ping\" ::ping]\n [\"/admin\" ::admin]\n [\"/admin/ping\" ::ping]])\n\nCreating router with defaults:\n(r/router routes)\n;CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route names:\n;\n;:reitit.core/ping\n;-> /ping\n;-> /admin/ping\n;\n\nThere is no way to disable the name conflict resolution.\n"},"basics/error_messages.html":{"url":"basics/error_messages.html","title":"Error Messages","keywords":"","body":"Error Messages\nAll exceptions thrown in router creation are caught, formatted and rethrown by the reitit.core/router function. Exception formatting is done by the exception formatter defined by the :exception router option.\nDefault Errors\nThe default exception formatting uses reitit.exception/exception. It produces single-color, partly human-readable, error messages.\n(require '[reitit.core :as r])\n\n(r/router\n [[\"/ping\"]\n [\"/:user-id/orders\"]\n [\"/bulk/:bulk-id\"]\n [\"/public/*path\"]\n [\"/:version/status\"]])\n\n\nPretty Errors\n[metosin/reitit-dev \"0.5.5\"]\n\nFor human-readable and developer-friendly exception messages, there is reitit.dev.pretty/exception (in the reitit-dev module). It is inspired by the lovely errors messages of ELM and ETA and uses fipp, expound and spell-spec for most of heavy lifting.\n(require '[reitit.dev.pretty :as pretty])\n\n(r/router\n [[\"/ping\"]\n [\"/:user-id/orders\"]\n [\"/bulk/:bulk-id\"]\n [\"/public/*path\"]\n [\"/:version/status\"]]\n {:exception pretty/exception})\n\n\nExtending\nBehind the scenes, both error formatters are backed by a multimethod, so they are easy to extend.\nMore examples\nSee the validating route data page.\nRuntime Exception\nSee Exception Handling with Ring.\n"},"coercion/coercion.html":{"url":"coercion/coercion.html","title":"Coercion Explained","keywords":"","body":"Coercion Explained\nCoercion is a process of transforming parameters (and responses) from one format into another. Reitit separates routing and coercion into two separate steps.\nBy default, all wildcard and catch-all parameters are parsed into strings:\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [\"/:company/users/:user-id\" ::user-view]))\n\nMatch with the parsed :path-params as strings:\n(r/match-by-path router \"/metosin/users/123\")\n; #Match{:template \"/:company/users/:user-id\",\n; :data {:name :user/user-view},\n; :result nil,\n; :path-params {:company \"metosin\", :user-id \"123\"},\n; :path \"/metosin/users/123\"}\n\nTo enable parameter coercion, the following things need to be done:\n\nDefine a Coercion for the routes\nDefine types for the parameters\nCompile coercers for the types\nApply the coercion\n\nDefine Coercion\nreitit.coercion/Coercion is a protocol defining how types are defined, coerced and inventoried.\nReitit ships with the following coercion modules:\n\nreitit.coercion.malli/coercion for malli\nreitit.coercion.schema/coercion for plumatic schema\nreitit.coercion.spec/coercion for both clojure.spec and data-specs\n\nCoercion can be attached to route data under :coercion key. There can be multiple Coercion implementations within a single router, normal scoping rules apply.\nDefining parameters\nRoute parameters can be defined via route data :parameters. It has keys for different type of parameters: :query, :body, :form, :header and :path. Syntax for the actual parameters depends on the Coercion implementation.\nExample with Schema path-parameters:\n(require '[reitit.coercion.schema])\n(require '[schema.core :as s])\n\n(def router\n (r/router\n [\"/:company/users/:user-id\" {:name ::user-view\n :coercion reitit.coercion.schema/coercion\n :parameters {:path {:company s/Str\n :user-id s/Int}}}]))\n\nA Match:\n(r/match-by-path router \"/metosin/users/123\")\n; #Match{:template \"/:company/users/:user-id\",\n; :data {:name :user/user-view,\n; :coercion >\n; :parameters {:path {:company java.lang.String,\n; :user-id Int}}},\n; :result nil,\n; :path-params {:company \"metosin\", :user-id \"123\"},\n; :path \"/metosin/users/123\"}\n\nCoercion was not applied. Why? In Reitit, routing and coercion are separate processes and we have done just the routing part. We need to apply coercion after the successful routing.\nBut now we should have enough data on the match to apply the coercion.\nCompiling coercers\nBefore the actual coercion, we should need to compile the coercers against the route data. Compiled coercers yield much better performance and the manual step of adding a coercion compiler makes things explicit and non-magical.\nCompiling can be done via a Middleware, Interceptor or a Router. We apply it now at router-level, effecting all routes (with :parameters and :coercion defined).\nThere is a helper function reitit.coercion/compile-request-coercers just for this:\n(require '[reitit.coercion :as coercion])\n(require '[reitit.coercion.schema])\n(require '[schema.core :as s])\n\n(def router\n (r/router\n [\"/:company/users/:user-id\" {:name ::user-view\n :coercion reitit.coercion.schema/coercion\n :parameters {:path {:company s/Str\n :user-id s/Int}}}]\n {:compile coercion/compile-request-coercers}))\n\nRouting again:\n(r/match-by-path router \"/metosin/users/123\")\n; #Match{:template \"/:company/users/:user-id\",\n; :data {:name :user/user-view,\n; :coercion >\n; :parameters {:path {:company java.lang.String,\n; :user-id Int}}},\n; :result {:path #object[reitit.coercion$request_coercer$]},\n; :path-params {:company \"metosin\", :user-id \"123\"},\n; :path \"/metosin/users/123\"}\n\nThe compiler added a :result key into the match (done just once, at router creation time), which holds the compiled coercers. We are almost done.\nApplying coercion\nWe can use a helper function reitit.coercion/coerce! to do the actual coercion, based on a Match:\n(coercion/coerce!\n (r/match-by-path router \"/metosin/users/123\"))\n; {:path {:company \"metosin\", :user-id 123}}\n\nWe get the coerced parameters back. If a coercion fails, a typed (:reitit.coercion/request-coercion) ExceptionInfo is thrown, with data about the actual error:\n(coercion/coerce!\n (r/match-by-path router \"/metosin/users/ikitommi\"))\n; => ExceptionInfo Request coercion failed:\n; #CoercionError{:schema {:company java.lang.String, :user-id Int, Any Any},\n; :errors {:user-id (not (integer? \"ikitommi\"))}}\n; clojure.core/ex-info (core.clj:4739)\n\nFull example\nHere's a full example for doing routing and coercion with Reitit and Schema:\n(require '[reitit.coercion.schema])\n(require '[reitit.coercion :as coercion])\n(require '[reitit.core :as r])\n(require '[schema.core :as s])\n\n(def router\n (r/router\n [\"/:company/users/:user-id\" {:name ::user-view\n :coercion reitit.coercion.schema/coercion\n :parameters {:path {:company s/Str\n :user-id s/Int}}}]\n {:compile coercion/compile-request-coercers}))\n\n(defn match-by-path-and-coerce! [path]\n (if-let [match (r/match-by-path router path)]\n (assoc match :parameters (coercion/coerce! match))))\n\n(match-by-path-and-coerce! \"/metosin/users/123\")\n; #Match{:template \"/:company/users/:user-id\",\n; :data {:name :user/user-view,\n; :coercion >\n; :parameters {:path {:company java.lang.String,\n; :user-id Int}}},\n; :result {:path #object[reitit.coercion$request_coercer$]},\n; :path-params {:company \"metosin\", :user-id \"123\"},\n; :parameters {:path {:company \"metosin\", :user-id 123}}\n; :path \"/metosin/users/123\"}\n\n(match-by-path-and-coerce! \"/metosin/users/ikitommi\")\n; => ExceptionInfo Request coercion failed...\n\nRing Coercion\nFor a full-blown http-coercion, see the ring coercion.\n"},"coercion/schema_coercion.html":{"url":"coercion/schema_coercion.html","title":"Plumatic Schema","keywords":"","body":"Plumatic Schema Coercion\nPlumatic Schema is a Clojure(Script) library for declarative data description and validation.\n(require '[reitit.coercion.schema])\n(require '[reitit.coercion :as coercion])\n(require '[schema.core :as s])\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [\"/:company/users/:user-id\" {:name ::user-view\n :coercion reitit.coercion.schema/coercion\n :parameters {:path {:company s/Str\n :user-id s/Int}}}]\n {:compile coercion/compile-request-coercers}))\n\n(defn match-by-path-and-coerce! [path]\n (if-let [match (r/match-by-path router path)]\n (assoc match :parameters (coercion/coerce! match))))\n\nSuccessful coercion:\n(match-by-path-and-coerce! \"/metosin/users/123\")\n; #Match{:template \"/:company/users/:user-id\",\n; :data {:name :user/user-view,\n; :coercion >\n; :parameters {:path {:company java.lang.String,\n; :user-id Int}}},\n; :result {:path #object[reitit.coercion$request_coercer$]},\n; :path-params {:company \"metosin\", :user-id \"123\"},\n; :parameters {:path {:company \"metosin\", :user-id 123}}\n; :path \"/metosin/users/123\"}\n\nFailing coercion:\n(match-by-path-and-coerce! \"/metosin/users/ikitommi\")\n; => ExceptionInfo Request coercion failed...\n\n"},"coercion/clojure_spec_coercion.html":{"url":"coercion/clojure_spec_coercion.html","title":"Clojure.spec","keywords":"","body":"Clojure.spec Coercion\nThe clojure.spec library specifies the structure of data, validates or destructures it, and can generate data based on the spec.\nWarning\nclojure.spec by itself doesn't support coercion. reitit uses spec-tools that adds coercion to spec. Like clojure.spec, it's alpha as it leans both on spec walking and clojure.spec.alpha/conform, which is considered a spec internal, that might be changed or removed later.\nUsage\nFor simple specs (core predicates, spec-tools.core/spec, s/and, s/or, s/coll-of, s/keys, s/map-of, s/nillable and s/every), the transformation is inferred using spec-walker and is automatic. To support all specs (like regex-specs), specs need to be wrapped into Spec Records.\nThere are CLJ-2116 and CLJ-2251 that would help solve this elegantly. Go vote 'em up.\nExample\n(require '[reitit.coercion.spec])\n(require '[reitit.coercion :as coercion])\n(require '[spec-tools.spec :as spec])\n(require '[clojure.spec.alpha :as s])\n(require '[reitit.core :as r])\n\n;; simple specs, inferred\n(s/def ::company string?)\n(s/def ::user-id int?)\n(s/def ::path-params (s/keys :req-un [::company ::user-id]))\n\n(def router\n (r/router\n [\"/:company/users/:user-id\" {:name ::user-view\n :coercion reitit.coercion.spec/coercion\n :parameters {:path ::path-params}}]\n {:compile coercion/compile-request-coercers}))\n\n(defn match-by-path-and-coerce! [path]\n (if-let [match (r/match-by-path router path)]\n (assoc match :parameters (coercion/coerce! match))))\n\nSuccessful coercion:\n(match-by-path-and-coerce! \"/metosin/users/123\")\n; #Match{:template \"/:company/users/:user-id\",\n; :data {:name :user/user-view,\n; :coercion >\n; :parameters {:path ::path-params}},\n; :result {:path #object[reitit.coercion$request_coercer$]},\n; :path-params {:company \"metosin\", :user-id \"123\"},\n; :parameters {:path {:company \"metosin\", :user-id 123}}\n; :path \"/metosin/users/123\"}\n\nFailing coercion:\n(match-by-path-and-coerce! \"/metosin/users/ikitommi\")\n; => ExceptionInfo Request coercion failed...\n\nDeeply nested\nSpec-tools allow deeply nested specs to be coerced. One can test the coercion easily in the REPL.\nDefine some specs:\n(require '[clojure.spec.alpha :as s])\n(require '[spec-tools.core :as st])\n\n(s/def :sku/id keyword?)\n(s/def ::sku (s/keys :req-un [:sku/id]))\n(s/def ::skus (s/coll-of ::sku :into []))\n\n(s/def :photo/id int?)\n(s/def ::photo (s/keys :req-un [:photo/id]))\n(s/def ::photos (s/coll-of ::photo :into []))\n\n(s/def ::my-json-api (s/keys :req-un [::skus ::photos]))\n\nApply a string->edn coercion to the data:\n(st/coerce\n ::my-json-api\n {:skus [{:id \"123\"}]\n :photos [{:id \"123\"}]}\n st/string-transformer)\n; {:skus [{:id :123}]\n; :photos [{:id 123}]}\n\nApply a json->edn coercion to the data:\n(st/coerce\n ::my-json-api\n {:skus [{:id \"123\"}]\n :photos [{:id \"123\"}]}\n st/json-transformer)\n; {:skus [{:id :123}]\n; :photos [{:id \"123\"}]}\n\nBy default, reitit uses custom transformers that also strip out extra keys from s/keys specs:\n(require '[reitit.coercion.spec :as rcs])\n\n(st/coerce\n ::my-json-api\n {:TOO \"MUCH\"\n :skus [{:id \"123\"\n :INFOR \"MATION\"}]\n :photos [{:id \"123\"\n :HERE \"TOO\"}]}\n rcs/json-transformer)\n; {:skus [{:id :123}]\n; :photos [{:id \"123\"}]}\n\nDefining Optional Keys\nGoing back to the previous example.\nSuppose you want the ::my-json-api to have optional remarks as string and each photo to have an optional height and width as integer.\nThe s/keys accepts :opt-un to support optional keys.\n(require '[clojure.spec.alpha :as s])\n(require '[spec-tools.core :as st])\n\n(s/def :sku/id keyword?)\n(s/def ::sku (s/keys :req-un [:sku/id]))\n(s/def ::skus (s/coll-of ::sku :into []))\n(s/def ::remarks string?) ;; define remarks as string\n\n(s/def :photo/id int?)\n(s/def :photo/height int?) ;; define height as int\n(s/def :photo/width int?) ;; define width as int\n(s/def ::photo (s/keys :req-un [:photo/id]\n :opt-un [:photo/height :photo/width])) ;; height and width are in :opt-un\n(s/def ::photos (s/coll-of ::photo :into []))\n\n(s/def ::my-json-api (s/keys :req-un [::skus ::photos]\n :opt-un [::remarks])) ;; remarks is in the :opt-un\n\nApply a string->edn coercion to the data:\n;; Omit optional keys\n(st/coerce\n ::my-json-api\n {:skus [{:id \"123\"}]\n :photos [{:id \"123\"}]}\n st/string-transformer)\n;;{:skus [{:id :123}],\n;; :photos [{:id 123}]}\n\n\n;; coerce the optional keys if present\n\n(st/coerce\n ::my-json-api\n {:skus [{:id \"123\"}]\n :photos [{:id \"123\" :height \"100\" :width \"100\"}]\n :remarks \"some remarks\"}\n st/string-transformer)\n\n;; {:skus [{:id :123}]\n;; :photos [{:id 123 :height 100 :width 100}]\n;; :remarks \"some remarks\"}\n\n(st/coerce\n ::my-json-api\n {:skus [{:id \"123\"}]\n :photos [{:id \"123\" :height \"100\"}]}\n st/string-transformer)\n;; {:skus [{:id :123}],\n;; :photos [{:id 123, :height 100}]}\n\n"},"coercion/data_spec_coercion.html":{"url":"coercion/data_spec_coercion.html","title":"Data-specs","keywords":"","body":"Data-spec Coercion\nData-specs is alternative, macro-free syntax to define clojure.specs. As a bonus, supports the runtime transformations via conforming out-of-the-box.\n(require '[reitit.coercion.spec])\n(require '[reitit.coercion :as coercion])\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [\"/:company/users/:user-id\" {:name ::user-view\n :coercion reitit.coercion.spec/coercion\n :parameters {:path {:company string?\n :user-id int?}}}]\n {:compile coercion/compile-request-coercers}))\n\n(defn match-by-path-and-coerce! [path]\n (if-let [match (r/match-by-path router path)]\n (assoc match :parameters (coercion/coerce! match))))\n\nSuccessful coercion:\n(match-by-path-and-coerce! \"/metosin/users/123\")\n; #Match{:template \"/:company/users/:user-id\",\n; :data {:name :user/user-view,\n; :coercion >\n; :parameters {:path {:company string?,\n; :user-id int?}}},\n; :result {:path #object[reitit.coercion$request_coercer$]},\n; :path-params {:company \"metosin\", :user-id \"123\"},\n; :parameters {:path {:company \"metosin\", :user-id 123}}\n; :path \"/metosin/users/123\"}\n\nFailing coercion:\n(match-by-path-and-coerce! \"/metosin/users/ikitommi\")\n; => ExceptionInfo Request coercion failed...\n\n"},"ring/ring.html":{"url":"ring/ring.html","title":"Ring-router","keywords":"","body":"Ring Router\nRing is a Clojure web applications library inspired by Python's WSGI and Ruby's Rack. By abstracting the details of HTTP into a simple, unified API, Ring allows web applications to be constructed of modular components that can be shared among a variety of applications, web servers, and web frameworks.\nRead more about the Ring Concepts.\n[metosin/reitit-ring \"0.5.5\"]\n\nreitit.ring/ring-router\nring-router is a higher order router, which adds support for :request-method based routing, handlers and middleware.\n It accepts the following options:\n\n\n\nkey\ndescription\n\n\n\n\n:reitit.middleware/transform\nFunction of [Middleware] => [Middleware] to transform the expanded Middleware (default: identity).\n\n\n:reitit.middleware/registry\nMap of keyword => IntoMiddleware to replace keyword references into Middleware\n\n\n:reitit.ring/default-options-endpoint\nDefault endpoint for :options method (default: default-options-endpoint)\n\n\n\nExample router:\n(require '[reitit.ring :as ring])\n\n(defn handler [_]\n {:status 200, :body \"ok\"})\n\n(def router\n (ring/router\n [\"/ping\" {:get handler}]))\n\nMatch contains :result compiled by the ring-router:\n(require '[reitit.core :as r])\n\n(r/match-by-path router \"/ping\")\n;#Match{:template \"/ping\"\n; :data {:get {:handler #object[...]}}\n; :result #Methods{:get #Endpoint{...}\n; :options #Endpoint{...}}\n; :path-params {}\n; :path \"/ping\"}\n\nreitit.ring/ring-handler\nGiven a ring-router, optional default-handler & options, ring-handler function will return a valid ring handler supporting both synchronous and asynchronous request handling. The following options are available:\n\n\n\nkey\ndescription\n\n\n\n\n:middleware\nOptional sequence of middleware that wrap the ring-handler\"\n\n\n:inject-match?\nBoolean to inject match into request under :reitit.core/match key (default true)\n\n\n:inject-router?\nBoolean to inject router into request under :reitit.core/router key (default true)\n\n\n\nSimple Ring app:\n(def app (ring/ring-handler router))\n\nApplying the handler:\n(app {:request-method :get, :uri \"/favicon.ico\"})\n; nil\n\n(app {:request-method :get, :uri \"/ping\"})\n; {:status 200, :body \"ok\"}\n\nThe router can be accessed via get-router:\n(-> app (ring/get-router) (r/compiled-routes))\n;[[\"/ping\"\n; {:handler #object[...]}\n; #Methods{:get #Endpoint{:data {:handler #object[...]}\n; :handler #object[...]\n; :middleware []}\n; :options #Endpoint{:data {:handler #object[...]}\n; :handler #object[...]\n; :middleware []}}]]\n\nRequest-method based routing\nHandlers can be placed either to the top-level (all methods) or under a specific method (:get, :head, :patch, :delete, :options, :post, :put or :trace). Top-level handler is used if request-method based handler is not found. \nBy default, the :options route is generated for all paths - to enable thing like CORS.\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/all\" handler]\n [\"/ping\" {:name ::ping\n :get handler\n :post handler}]])))\n\nTop-level handler catches all methods:\n(app {:request-method :delete, :uri \"/all\"})\n; {:status 200, :body \"ok\"}\n\nMethod-level handler catches only the method:\n(app {:request-method :get, :uri \"/ping\"})\n; {:status 200, :body \"ok\"}\n\n(app {:request-method :put, :uri \"/ping\"})\n; nil\n\nBy default, :options is also supported (see router options to change this):\n(app {:request-method :options, :uri \"/ping\"})\n; {:status 200, :body \"\"}\n\nName-based reverse routing:\n(-> app\n (ring/get-router)\n (r/match-by-name ::ping)\n (r/match->path))\n; \"/ping\"\n\nMiddleware\nMiddleware can be mounted using a :middleware key - either to top-level or under request method submap. Its value should be a vector of reitit.middleware/IntoMiddleware values. These include:\n\nnormal ring middleware function handler -> request -> response\nvector of middleware function [handler args*] -> request -> response and it's arguments\na data-driven middleware record or a map\na Keyword name, to lookup the middleware from a Middleware Registry\n\nA middleware and a handler:\n(defn wrap [handler id]\n (fn [request]\n (handler (update request ::acc (fnil conj []) id))))\n\n(defn handler [{::keys [acc]}]\n {:status 200, :body (conj acc :handler)})\n\nApp with nested middleware:\n(def app\n (ring/ring-handler\n (ring/router\n ;; a middleware function\n [\"/api\" {:middleware [#(wrap % :api)]}\n [\"/ping\" handler]\n ;; a middleware vector at top level\n [\"/admin\" {:middleware [[wrap :admin]]}\n [\"/db\" {:middleware [[wrap :db]]\n ;; a middleware vector at under a method\n :delete {:middleware [[wrap :delete]]\n :handler handler}}]]])))\n\nMiddleware is applied correctly:\n(app {:request-method :delete, :uri \"/api/ping\"})\n; {:status 200, :body [:api :handler]}\n\n(app {:request-method :delete, :uri \"/api/admin/db\"})\n; {:status 200, :body [:api :admin :db :delete :handler]}\n\nTop-level middleware, applied before any routing is done:\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [[mw :api]]}\n [\"/get\" {:get handler}]])\n nil \n {:middleware [[mw :top]]}))\n\n(app {:request-method :get, :uri \"/api/get\"})\n; {:status 200, :body [:top :api :ok]}\n\n"},"ring/reverse_routing.html":{"url":"ring/reverse_routing.html","title":"Reverse-routing","keywords":"","body":"Reverse routing with Ring\nBoth the router and the match are injected into Ring Request (as ::r/router and ::r/match) by the reitit.ring/ring-handler and with that, available to middleware and endpoints. To convert a Match into a path, one can use r/match->path, which optionally takes a map of query-parameters too.\nBelow is an example how to do reverse routing from a ring handler:\n(require '[reitit.core :as r])\n(require '[reitit.ring :as ring])\n\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/users\"\n {:get (fn [{::r/keys [router]}]\n {:status 200\n :body (for [i (range 10)]\n {:uri (-> router\n (r/match-by-name ::user {:id i})\n ;; with extra query-params\n (r/match->path {:iso \"möly\"}))})})}]\n [\"/users/:id\"\n {:name ::user\n :get (constantly {:status 200, :body \"user...\"})}]])))\n\n(app {:request-method :get, :uri \"/users\"})\n; {:status 200,\n; :body ({:uri \"/users/0?iso=m%C3%B6ly\"}\n; {:uri \"/users/1?iso=m%C3%B6ly\"}\n; {:uri \"/users/2?iso=m%C3%B6ly\"}\n; {:uri \"/users/3?iso=m%C3%B6ly\"}\n; {:uri \"/users/4?iso=m%C3%B6ly\"}\n; {:uri \"/users/5?iso=m%C3%B6ly\"}\n; {:uri \"/users/6?iso=m%C3%B6ly\"}\n; {:uri \"/users/7?iso=m%C3%B6ly\"}\n; {:uri \"/users/8?iso=m%C3%B6ly\"}\n; {:uri \"/users/9?iso=m%C3%B6ly\"})}\n\n"},"ring/default_handler.html":{"url":"ring/default_handler.html","title":"Default handler","keywords":"","body":"Default handler\nBy default, if no routes match, nil is returned, which is not valid response in Ring:\n(require '[reitit.ring :as ring])\n\n(defn handler [_]\n {:status 200, :body \"\"})\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/ping\" handler])))\n\n(app {:uri \"/invalid\"})\n; nil\n\nSetting the default-handler as a second argument to ring-handler:\n(def app\n (ring/ring-handler\n (ring/router\n [\"/ping\" handler])\n (constantly {:status 404, :body \"\"})))\n\n(app {:uri \"/invalid\"})\n; {:status 404, :body \"\"}\n\nTo get more correct http error responses, ring/create-default-handler can be used. It differentiates :not-found (no route matched), :method-not-allowed (no method matched) and :not-acceptable (handler returned nil).\nWith defaults:\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/ping\" {:get handler}]\n [\"/pong\" (constantly nil)]])\n (ring/create-default-handler)))\n\n(app {:request-method :get, :uri \"/ping\"})\n; {:status 200, :body \"\"}\n\n(app {:request-method :get, :uri \"/\"})\n; {:status 404, :body \"\"}\n\n(app {:request-method :post, :uri \"/ping\"})\n; {:status 405, :body \"\"}\n\n(app {:request-method :get, :uri \"/pong\"})\n; {:status 406, :body \"\"}\n\nWith custom responses:\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/ping\" {:get handler}]\n [\"/pong\" (constantly nil)]])\n (ring/create-default-handler\n {:not-found (constantly {:status 404, :body \"kosh\"})\n :method-not-allowed (constantly {:status 405, :body \"kosh\"})\n :not-acceptable (constantly {:status 406, :body \"kosh\"})})))\n\n(app {:request-method :get, :uri \"/ping\"})\n; {:status 200, :body \"\"}\n\n(app {:request-method :get, :uri \"/\"})\n; {:status 404, :body \"kosh\"}\n\n(app {:request-method :post, :uri \"/ping\"})\n; {:status 405, :body \"kosh\"}\n\n(app {:request-method :get, :uri \"/pong\"})\n; {:status 406, :body \"kosh\"}\n\n"},"ring/slash_handler.html":{"url":"ring/slash_handler.html","title":"Slash handler","keywords":"","body":"Slash handler\nThe router works with precise matches. If a route is defined without a trailing slash, for example, it won't match a request with a slash.\n(require '[reitit.ring :as ring])\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/ping\" (constantly {:status 200, :body \"\"})])))\n\n(app {:uri \"/ping/\"})\n; nil\n\nSometimes it is desirable that paths with and without a trailing slash are recognized as the same.\nSetting the redirect-trailing-slash-handler as a second argument to ring-handler:\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/ping\" (constantly {:status 200, :body \"\"})]\n [\"/pong/\" (constantly {:status 200, :body \"\"})]])\n (ring/redirect-trailing-slash-handler)))\n\n(app {:uri \"/ping/\"})\n; {:status 308, :headers {\"Location\" \"/ping\"}, :body \"\"}\n\n(app {:uri \"/pong\"})\n; {:status 308, :headers {\"Location\" \"/pong/\"}, :body \"\"}\n\nredirect-trailing-slash-handler accepts an optional :method parameter that allows configuring how (whether) to handle missing/extra slashes. The default is to handle both.\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/ping\" (constantly {:status 200, :body \"\"})]\n [\"/pong/\" (constantly {:status 200, :body \"\"})]])\n ; only handle extra trailing slash\n (ring/redirect-trailing-slash-handler {:method :strip})))\n\n(app {:uri \"/ping/\"})\n; {:status 308, :headers {\"Location\" \"/ping\"}, :body \"\"}\n\n(app {:uri \"/pong\"})\n; nil\n\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/ping\" (constantly {:status 200, :body \"\"})]\n [\"/pong/\" (constantly {:status 200, :body \"\"})]])\n ; only handle missing trailing slash\n (ring/redirect-trailing-slash-handler {:method :add})))\n\n(app {:uri \"/ping/\"})\n; nil\n\n(app {:uri \"/pong\"})\n; {:status 308, :headers {\"Location\" \"/pong/\"}, :body \"\"}\n\nredirect-trailing-slash-handler can be composed with the default handler using ring/routes for more correct http error responses:\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/ping\" (constantly {:status 200, :body \"\"})]\n [\"/pong/\" (constantly {:status 200, :body \"\"})]])\n (ring/routes\n (ring/redirect-trailing-slash-handler {:method :add})\n (ring/create-default-handler))))\n\n(app {:uri \"/ping/\"})\n; {:status 404, :body \"\", :headers {}}\n\n(app {:uri \"/pong\"})\n; {:status 308, :headers {\"Location\" \"/pong/\"}, :body \"\"}\n\n"},"ring/static.html":{"url":"ring/static.html","title":"Static Resources","keywords":"","body":"Static Resources (Clojure Only)\nStatic resources can be served using reitit.ring/create-resource-handler. It takes optionally an options map and returns a ring handler to serve files from Classpath.\nThere are two options to serve the files.\nInternal routes\nThis is good option if static files can be from non-conflicting paths, e.g. \"/assets/*\".\n(require '[reitit.ring :as ring])\n\n(ring/ring-handler\n (ring/router\n [[\"/ping\" (constantly {:status 200, :body \"pong\"})]\n [\"/assets/*\" (ring/create-resource-handler)]])\n (ring/create-default-handler))\n\nTo serve static files with conflicting routes, e.g. \"/*\", one needs to disable the conflict resolution:\n(require '[reitit.ring :as ring])\n\n(ring/ring-handler\n (ring/router\n [[\"/ping\" (constantly {:status 200, :body \"pong\"})]\n [\"/*\" (ring/create-resource-handler)]]\n {:conflicts (constantly nil)})\n (ring/create-default-handler))\n\nExternal routes\nA better way to serve files from conflicting paths, e.g. \"/*\", is to serve them from the default-handler. One can compose multiple default locations using ring-handler. This way, they are only served if none of the actual routes have matched.\n(ring/ring-handler\n (ring/router\n [\"/ping\" (constantly {:status 200, :body \"pong\"})])\n (ring/routes\n (ring/create-resource-handler {:path \"/\"})\n (ring/create-default-handler)))\n\nConfiguration\nreitit.ring/create-resource-handler takes optionally an options map to configure how the files are being served.\n\n\n\nkey\ndescription\n\n\n\n\n:parameter\noptional name of the wildcard parameter, defaults to unnamed keyword :\n\n\n:root\noptional resource root, defaults to \\\"public\\\"\n\n\n:path\noptional path to mount the handler to. Works only if mounted outside of a router.\n\n\n:loader\noptional class loader to resolve the resources\n\n\n:index-files\noptional vector of index-files to look in a resource directory, defaults to [\\\"index.html\\\"]\n\n\n:not-found-handler\noptional handler function to use if the requested resource is missing (404 Not Found)\n\n\n\nTODO\n\nsupport for things like :cache, :etag, :last-modified?, and :gzip\nsupport for ClojureScript\nserve from file-system\n\n"},"ring/dynamic_extensions.html":{"url":"ring/dynamic_extensions.html","title":"Dynamic Extensions","keywords":"","body":"Dynamic Extensions\nring-handler injects the Match into a request and it can be extracted at runtime with reitit.ring/get-match. This can be used to build ad-hoc extensions to the system.\nExample middleware to guard routes based on user roles:\n(require '[reitit.ring :as ring])\n(require '[clojure.set :as set])\n\n(defn wrap-enforce-roles [handler]\n (fn [{:keys [my-roles] :as request}]\n (let [required (some-> request (ring/get-match) :data ::roles)]\n (if (and (seq required) (not (set/subset? required my-roles)))\n {:status 403, :body \"forbidden\"}\n (handler request)))))\n\nMounted to an app via router data (affecting all routes):\n(def handler (constantly {:status 200, :body \"ok\"}))\n\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/api\"\n [\"/ping\" handler]\n [\"/admin\" {::roles #{:admin}}\n [\"/ping\" handler]]]]\n {:data {:middleware [wrap-enforce-roles]}})))\n\nAnonymous access to public route:\n(app {:request-method :get, :uri \"/api/ping\"})\n; {:status 200, :body \"ok\"}\n\nAnonymous access to guarded route:\n(app {:request-method :get, :uri \"/api/admin/ping\"})\n; {:status 403, :body \"forbidden\"}\n\nAuthorized access to guarded route:\n(app {:request-method :get, :uri \"/api/admin/ping\", :my-roles #{:admin}})\n; {:status 200, :body \"ok\"}\n\nDynamic extensions are nice, but we can do much better. See data-driven middleware and compiling routes.\n"},"ring/data_driven_middleware.html":{"url":"ring/data_driven_middleware.html","title":"Data-driven Middleware","keywords":"","body":"Data-driven Middleware\nRing defines middleware as a function of type handler & args => request => response. It's relatively easy to understand and enables good performance. Downside is that the middleware-chain is just a opaque function, making things like debugging and composition hard. It's too easy to apply the middleware in wrong order.\nReitit defines middleware as data:\n\nMiddleware can be defined as first-class data entries\nMiddleware can be mounted as a duct-style vector (of middleware)\nMiddleware can be optimized & compiled against an endpoint\nMiddleware chain can be transformed by the router\n\nMiddleware as data\nAll values in the :middleware vector in the route data are expanded into reitit.middleware/Middleware Records with using the reitit.middleware/IntoMiddleware Protocol. By default, functions, maps and Middleware records are allowed.\nRecords can have arbitrary keys, but the following keys have a special purpose:\n\n\n\nkey\ndescription\n\n\n\n\n:name\nName of the middleware as a qualified keyword\n\n\n:spec\nclojure.spec definition for the route data, see route data validation (optional)\n\n\n:wrap\nThe actual middleware function of handler & args => request => response\n\n\n:compile\nMiddleware compilation function, see compiling middleware.\n\n\n\nMiddleware Records are accessible in their raw form in the compiled route results, thus available for inventories, creating api-docs etc.\nFor the actual request processing, the Records are unwrapped into normal functions and composed into a middleware function chain, yielding zero runtime penalty.\nCreating Middleware\nThe following produce identical middleware runtime function.\nFunction\n(defn wrap [handler id]\n (fn [request]\n (handler (update request ::acc (fnil conj []) id))))\n\nMap\n(def wrap3\n {:name ::wrap3\n :description \"Middleware that does things.\"\n :wrap wrap})\n\nRecord\n(require '[reitit.middleware :as middleware])\n\n(def wrap2\n (middleware/map->Middleware\n {:name ::wrap2\n :description \"Middleware that does things.\"\n :wrap wrap}))\n\nUsing Middleware\n:middleware is merged to endpoints by the router.\n(require '[reitit.ring :as ring])\n\n(defn handler [{::keys [acc]}]\n {:status 200, :body (conj acc :handler)})\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [[wrap 1] [wrap2 2]]}\n [\"/ping\" {:get {:middleware [[wrap3 3]]\n :handler handler}}]])))\n\nAll the middleware are applied correctly:\n(app {:request-method :get, :uri \"/api/ping\"})\n; {:status 200, :body [1 2 3 :handler]}\n\nCompiling middleware\nMiddleware can be optimized against an endpoint using middleware compilation.\nIdeas for the future\n\nSupport Middleware dependency resolution with new keys :requires and :provides. Values are set of top-level keys of the request. e.g.\nInjectUserIntoRequestMiddleware requires #{:session} and provides #{:user}\nAuthorizationMiddleware requires #{:user}\n\n\n\nIdeas welcome & see issues for details.\n"},"ring/transforming_middleware_chain.html":{"url":"ring/transforming_middleware_chain.html","title":"Transforming Middleware Chain","keywords":"","body":"Transforming the Middleware Chain\nThere is an extra option in ring-router (actually, in the underlying middleware-router): :reitit.middleware/transform to transform the middleware chain per endpoint. Value should be a function or a vector of functions that get a vector of compiled middleware and should return a new vector of middleware.\nExample Application\n(require '[reitit.ring :as ring])\n(require '[reitit.middleware :as middleware])\n\n(defn wrap [handler id]\n (fn [request]\n (handler (update request ::acc (fnil conj []) id))))\n\n(defn handler [{::keys [acc]}]\n {:status 200, :body (conj acc :handler)})\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [[wrap 1] [wrap 2]]}\n [\"/ping\" {:get {:middleware [[wrap 3]]\n :handler handler}}]])))\n\n(app {:request-method :get, :uri \"/api/ping\"})\n; {:status 200, :body [1 2 3 :handler]}\n\nReversing the Middleware Chain\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [[wrap 1] [wrap 2]]}\n [\"/ping\" {:get {:middleware [[wrap 3]]\n :handler handler}}]]\n {::middleware/transform reverse})))\n\n(app {:request-method :get, :uri \"/api/ping\"})\n; {:status 200, :body [3 2 1 :handler]}\n\nInterleaving Middleware\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [[wrap 1] [wrap 2]]}\n [\"/ping\" {:get {:middleware [[wrap 3]]\n :handler handler}}]]\n {::middleware/transform #(interleave % (repeat [wrap :debug]))})))\n\n(app {:request-method :get, :uri \"/api/ping\"})\n; {:status 200, :body [1 :debug 2 :debug 3 :debug :handler]}\n\nPrinting Request Diffs\n[metosin/reitit-middleware \"0.5.5\"]\n\nUsing reitit.ring.middleware.dev/print-request-diffs transformation, the request diffs between each middleware are printed out to the console. To use it, add the following router option:\n:reitit.middleware/transform reitit.ring.middleware.dev/print-request-diffs\n\nSample output:\n\n"},"ring/middleware_registry.html":{"url":"ring/middleware_registry.html","title":"Middleware Registry","keywords":"","body":"Middleware Registry\nThe :middleware syntax in reitit-ring also supports Keywords. Keywords are looked up from the Middleware Registry, which is a map of keyword => IntoMiddleware. Middleware registry should be stored under key :reitit.middleware/registry in the router options. If a middleware keyword isn't found in the registry, router creation fails fast with a descriptive error message.\nExamples\nApplication using middleware defined in the Middleware Registry:\n(require '[reitit.ring :as ring])\n(require '[reitit.middleware :as middleware])\n\n(defn wrap-bonus [handler value]\n (fn [request]\n (handler (update request :bonus (fnil + 0) value))))\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [[:bonus 20]]}\n [\"/bonus\" {:middleware [:bonus10]\n :get (fn [{:keys [bonus]}]\n {:status 200, :body {:bonus bonus}})}]]\n {::middleware/registry {:bonus wrap-bonus\n :bonus10 [:bonus 10]}})))\n\nWorks as expected:\n(app {:request-method :get, :uri \"/api/bonus\"})\n; {:status 200, :body {:bonus 30}}\n\nRouter creation fails fast if the registry doesn't contain the middleware:\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [[:bonus 20]]}\n [\"/bonus\" {:middleware [:bonus10]\n :get (fn [{:keys [bonus]}]\n {:status 200, :body {:bonus bonus}})}]]\n {::middleware/registry {:bonus wrap-bonus}})))\n;CompilerException clojure.lang.ExceptionInfo: Middleware :bonus10 not found in registry.\n;\n;Available middleware in registry:\n;\n;| :id | :description |\n;|--------+--------------------------------------|\n;| :bonus | reitit.ring_test$wrap_bonus@59fddabb |\n\nWhen to use the registry?\nMiddleware as Keywords helps to keep the routes (all but handlers) as literal data (i.e. data that evaluates to itself), enabling the routes to be persisted in external formats like EDN-files and databases. Duct is a good example, where the middleware can be referenced from EDN-files. It should be easy to make Duct configuration a Middleware Registry in reitit-ring.\nOn the other hand, it's an extra level of indirection, making things more complex and removing the default IDE support of \"go to definition\" or \"look up source\".\nTODO\n\na prefilled registry of common middleware in the reitit-middleware\n\n"},"ring/exceptions.html":{"url":"ring/exceptions.html","title":"Exception Handling with Ring","keywords":"","body":"Exception Handling with Ring\n[metosin/reitit-middleware \"0.5.5\"]\n\nExceptions thrown in router creation can be handled with custom exception handler. By default, exceptions thrown at runtime from a handler or a middleware are not caught by the reitit.ring/ring-handler. A good practise is a have an top-level exception handler to log and format the errors for clients.\n(require '[reitit.ring.middleware.exception :as exception])\n\nexception/exception-middleware\nA preconfigured middleware using exception/default-handlers. Catches:\n\nRequest & response Coercion exceptions\nMuuntaja decode exceptions\nExceptions with :type of :reitit.ring/response, returning :response key from ex-data.\nSafely all other exceptions\n\n(require '[reitit.ring :as ring])\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/fail\" (fn [_] (throw (Exception. \"fail\")))]\n {:data {:middleware [exception/exception-middleware]}})))\n\n(app {:request-method :get, :uri \"/fail\"})\n;{:status 500\n; :body {:type \"exception\"\n; :class \"java.lang.Exception\"}}\n\nexception/create-exception-middleware\nCreates the exception-middleware with custom options. Takes a map of identifier => exception request => response that is used to select the exception handler for the thrown/raised exception identifier. Exception identifier is either a Keyword or a Exception Class.\nThe following handlers are available by default:\n\n\n\nkey\ndescription\n\n\n\n\n:reitit.ring/response\nvalue in ex-data key :response will be returned\n\n\n:muuntaja/decode\nhandle Muuntaja decoding exceptions\n\n\n:reitit.coercion/request-coercion\nrequest coercion errors (http 400 response)\n\n\n:reitit.coercion/response-coercion\nresponse coercion errors (http 500 response)\n\n\n::exception/default\na default exception handler if nothing else matched (default exception/default-handler).\n\n\n::exception/wrap\na 3-arity handler to wrap the actual handler handler exception request => response (no default).\n\n\n\nThe handler is selected from the options map by exception identifier in the following lookup order:\n1) :type of exception ex-data\n2) Class of exception\n3) :type ancestors of exception ex-data\n4) Super Classes of exception\n5) The ::default handler\n;; type hierarchy\n(derive ::error ::exception)\n(derive ::failure ::exception)\n(derive ::horror ::exception)\n\n(defn handler [message exception request]\n {:status 500\n :body {:message message\n :exception (.getClass exception)\n :data (ex-data exception)\n :uri (:uri request)}})\n\n(def exception-middleware\n (exception/create-exception-middleware\n (merge\n exception/default-handlers\n {;; ex-data with :type ::error\n ::error (partial handler \"error\")\n\n ;; ex-data with ::exception or ::failure\n ::exception (partial handler \"exception\")\n\n ;; SQLException and all it's child classes\n java.sql.SQLException (partial handler \"sql-exception\")\n\n ;; override the default handler\n ::exception/default (partial handler \"default\")\n\n ;; print stack-traces for all exceptions\n ::exception/wrap (fn [handler e request]\n (println \"ERROR\" (pr-str (:uri request)))\n (handler e request))})))\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/fail\" (fn [_] (throw (ex-info \"fail\" {:type ::failue})))]\n {:data {:middleware [exception-middleware]}})))\n\n(app {:request-method :get, :uri \"/fail\"})\n; ERROR \"/fail\"\n; => {:status 500,\n; :body {:message \"default\"\n; :exception clojure.lang.ExceptionInfo\n; :data {:type :user/failue}\n; :uri \"/fail\"}}\n\n"},"ring/default_middleware.html":{"url":"ring/default_middleware.html","title":"Default Middleware","keywords":"","body":"Default Middleware\n[metosin/reitit-middleware \"0.5.5\"]\n\nAny Ring middleware can be used with reitit-ring, but using data-driven middleware is preferred as they are easier to manage and in many cases, yield better performance. reitit-middleware contains a set of common ring middleware, lifted into data-driven middleware.\n\nParameter Handling\nException Handling\nContent Negotiation\nMultipart Request Handling\nInspecting Middleware Chain\n\nParameters Handling\nreitit.ring.middleware.parameters/parameters-middleware to capture query- and form-params. Wraps\nring.middleware.params/wrap-params.\nNOTE: will be factored into two parts: a query-parameters middleware and a Muuntaja format responsible for the the application/x-www-form-urlencoded body format.\nException Handling\nSee Exception Handling with Ring.\nContent Negotiation\nSee Content Negotiation.\nMultipart Request Handling\nWrapper for Ring Multipart Middleware. Emits swagger :consumes definitions automatically.\nExpected route data:\n\n\n\nkey\ndescription\n\n\n\n\n[:parameters :multipart]\nmounts only if defined for a route.\n\n\n\n(require '[reitit.ring.middleware.multipart :as multipart])\n\n\nmultipart/multipart-middleware a preconfigured middleware for multipart handling\nmultipart/create-multipart-middleware to generate with custom configuration\n\nInspecting Middleware Chain\nreitit.ring.middleware.dev/print-request-diffs is a middleware chain transforming function. It prints a request and response diff between each middleware. To use it, add the following router option:\n:reitit.middleware/transform reitit.ring.middleware.dev/print-request-diffs\n\nPartial sample output:\n\nExample app\nSee an example app with the default middleware in action: https://github.com/metosin/reitit/blob/master/examples/ring-swagger/src/example/server.clj.\n"},"ring/content_negotiation.html":{"url":"ring/content_negotiation.html","title":"Content Negotiation","keywords":"","body":"Content Negotiation\nWrapper for Muuntaja middleware for content-negotiation, request decoding and response encoding. Takes explicit configuration via :muuntaja key in route data. Emit's swagger :produces and :consumes definitions automatically based on the Muuntaja configuration.\nNegotiates a request body based on Content-Type header and response body based on Accept, Accept-Charset headers. Publishes the negotiation results as :muuntaja/request and :muuntaja/response keys into the request.\nDecodes the request body into :body-params using the :muuntaja/request key in request if the :body-params doesn't already exist.\nEncodes the response body using the :muuntaja/response key in request if the response doesn't have Content-Type header already set.\nExpected route data:\n\n\n\nkey\ndescription\n\n\n\n\n:muuntaja\nmuuntaja.core/Muuntaja instance, does not mount if not set.\n\n\n\n(require '[reitit.ring.middleware.muuntaja :as muuntaja])\n\n\nmuuntaja/format-middleware - Negotiation, request decoding and response encoding in a single Middleware\nmuuntaja/format-negotiate-middleware - Negotiation\nmuuntaja/format-request-middleware - Request decoding\nmuuntaja/format-response-middleware - Response encoding\n\n(require '[reitit.ring :as ring])\n(require '[reitit.ring.coercion :as rrc])\n(require '[reitit.coercion.spec :as rcs])\n(require '[ring.adapter.jetty :as jetty])\n(require '[muuntaja.core :as m])\n\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/math\"\n {:post {:summary \"negotiated request & response (json, edn, transit)\"\n :parameters {:body {:x int?, :y int?}}\n :responses {200 {:body {:total int?}}}\n :handler (fn [{{{:keys [x y]} :body} :parameters}]\n {:status 200\n :body {:total (+ x y)}})}}]\n [\"/xml\"\n {:get {:summary \"forced xml response\"\n :handler (fn [_]\n {:status 200\n :headers {\"Content-Type\" \"text/xml\"}\n :body \"kukka\"})}}]]\n {:data {:muuntaja m/instance\n :coercion rcs/coercion\n :middleware [muuntaja/format-middleware\n rrc/coerce-exceptions-middleware\n rrc/coerce-request-middleware\n rrc/coerce-response-middleware]}})))\n\n(jetty/run-jetty #'app {:port 3000, :join? false})\n\nTesting with httpie:\n> http POST :3000/math x:=1 y:=2\n\nHTTP/1.1 200 OK\nContent-Length: 11\nContent-Type: application/json; charset=utf-8\nDate: Wed, 22 Aug 2018 16:59:54 GMT\nServer: Jetty(9.2.21.v20170120)\n\n{\n \"total\": 3\n}\n\n> http :3000/xml\n\nHTTP/1.1 200 OK\nContent-Length: 20\nContent-Type: text/xml\nDate: Wed, 22 Aug 2018 16:59:58 GMT\nServer: Jetty(9.2.21.v20170120)\n\nkukka\n\nChanging default parameters\nThe current JSON formatter used by reitit already have the option to parse keys as keyword which is a sane default in Clojure. However, if you would like to parse all the double as bigdecimal you'd need to change an option of the JSON formatter\n(def new-muuntaja-instance\n (m/create\n (assoc-in\n m/default-options\n [:formats \"application/json\" :decoder-opts :bigdecimals]\n true)))\n\nNow you should change the m/instance installed in the router with the new-muuntaja-instance.\nYou can find more options for JSON and [EDN].\nAdding custom encoder\nThe example below is from muuntaja explaining how to add a custom encoder to parse a java.util.Date instance.\n\n(def muuntaja-instance\n (m/create\n (assoc-in\n m/default-options\n [:formats \"application/json\" :encoder-opts]\n {:date-format \"yyyy-MM-dd\"})))\n\n(->> {:value (java.util.Date.)}\n (m/encode m \"application/json\")\n slurp)\n; => \"{\\\"value\\\":\\\"2019-10-15\\\"}\"\n\nAdding all together\nIf you inspect m/default-options it's only a map, therefore you can compose your new muuntaja instance with as many options as you need it.\n(def new-muuntaja\n (m/create\n (-> m/default-options\n (assoc-in [:formats \"application/json\" :decoder-opts :bigdecimals] true)\n (assoc-in [:formats \"application/json\" :encoder-opts :data-format] \"yyyy-MM-dd\"))))\n\n"},"ring/coercion.html":{"url":"ring/coercion.html","title":"Pluggable Coercion","keywords":"","body":"Ring Coercion\nBasic coercion is explained in detail in the Coercion Guide. With Ring, both request parameters and response bodies can be coerced.\nThe following request parameters are currently supported:\n\n\n\ntype\nrequest source\n\n\n\n\n:query\n:query-params\n\n\n:body\n:body-params\n\n\n:form\n:form-params\n\n\n:header\n:header-params\n\n\n:path\n:path-params\n\n\n\nTo enable coercion, the following things need to be done:\n\nDefine a reitit.coercion/Coercion for the routes\nDefine types for the parameters and/or responses\nMount Coercion Middleware to apply to coercion\nUse the coerced parameters in a handler/middleware\n\nDefine coercion\nreitit.coercion/Coercion is a protocol defining how types are defined, coerced and inventoried.\nReitit ships with the following coercion modules:\n\nreitit.coercion.malli/coercion for malli\nreitit.coercion.schema/coercion for plumatic schema\nreitit.coercion.spec/coercion for both clojure.spec and data-specs\n\nCoercion can be attached to route data under :coercion key. There can be multiple Coercion implementations within a single router, normal scoping rules apply.\nDefining parameters and responses\nParameters are defined in route data under :parameters key. It's value should be a map of parameter :type -> Coercion Schema.\nResponses are defined in route data under :responses key. It's value should be a map of http status code to a map which can contain :body key with Coercion Schema as value.\nBelow is an example with Plumatic Schema. It defines schemas for :query, :body and :path parameters and for http 200 response :body.\nHandler can access the coerced parameters can be read under :parameters key in the request.\n(require '[reitit.coercion.schema])\n(require '[schema.core :as s])\n\n(def PositiveInt (s/constrained s/Int pos? 'PositiveInt))\n\n(def plus-endpoint\n {:coercion reitit.coercion.schema/coercion\n :parameters {:query {:x s/Int}\n :body {:y s/Int}\n :path {:z s/Int}}\n :responses {200 {:body {:total PositiveInt}}}\n :handler (fn [{:keys [parameters]}]\n (let [total (+ (-> parameters :query :x)\n (-> parameters :body :y)\n (-> parameters :path :z))]\n {:status 200\n :body {:total total}}))})\n\nCoercion Middleware\nDefining a coercion for a route data doesn't do anything, as it's just data. We have to attach some code to apply the actual coercion. We can use the middleware from reitit.ring.coercion:\n\ncoerce-request-middleware to apply the parameter coercion\ncoerce-response-middleware to apply the response coercion\ncoerce-exceptions-middleware to transform coercion exceptions into pretty responses\n\nFull example\nHere's an full example for applying coercion with Reitit, Ring and Schema:\n(require '[reitit.ring.coercion :as rrc])\n(require '[reitit.coercion.schema])\n(require '[reitit.ring :as ring])\n(require '[schema.core :as s])\n\n(def PositiveInt (s/constrained s/Int pos? 'PositiveInt))\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\"\n [\"/ping\" {:name ::ping\n :get (fn [_]\n {:status 200\n :body \"pong\"})}]\n [\"/plus/:z\" {:name ::plus\n :post {:coercion reitit.coercion.schema/coercion\n :parameters {:query {:x s/Int}\n :body {:y s/Int}\n :path {:z s/Int}}\n :responses {200 {:body {:total PositiveInt}}}\n :handler (fn [{:keys [parameters]}]\n (let [total (+ (-> parameters :query :x)\n (-> parameters :body :y)\n (-> parameters :path :z))]\n {:status 200\n :body {:total total}}))}}]]\n {:data {:middleware [rrc/coerce-exceptions-middleware\n rrc/coerce-request-middleware\n rrc/coerce-response-middleware]}})))\n\nValid request:\n(app {:request-method :post\n :uri \"/api/plus/3\"\n :query-params {\"x\" \"1\"}\n :body-params {:y 2}})\n; {:status 200, :body {:total 6}}\n\nInvalid request:\n(app {:request-method :post\n :uri \"/api/plus/3\"\n :query-params {\"x\" \"abba\"}\n :body-params {:y 2}})\n; {:status 400,\n; :body {:schema {:x \"Int\", \"Any\" \"Any\"},\n; :errors {:x \"(not (integer? \\\"abba\\\"))\"},\n; :type :reitit.coercion/request-coercion,\n; :coercion :schema,\n; :value {:x \"abba\"},\n; :in [:request :query-params]}}\n\nInvalid response:\n(app {:request-method :post\n :uri \"/api/plus/3\"\n :query-params {\"x\" \"1\"}\n :body-params {:y -10}})\n; {:status 500,\n; :body {:schema {:total \"(constrained Int PositiveInt)\"},\n; :errors {:total \"(not (PositiveInt -6))\"},\n; :type :reitit.coercion/response-coercion,\n; :coercion :schema,\n; :value {:total -6},\n; :in [:response :body]}}\n\nPretty printing spec errors\nSpec problems are exposed as-is into request & response coercion errors, enabling pretty-printers like expound to be used:\n(require '[reitit.ring :as ring])\n(require '[reitit.ring.middleware.exception :as exception])\n(require '[reitit.ring.coercion :as coercion])\n(require '[expound.alpha :as expound])\n\n(defn coercion-error-handler [status]\n (let [printer (expound/custom-printer {:theme :figwheel-theme, :print-specs? false})\n handler (exception/create-coercion-handler status)]\n (fn [exception request]\n (printer (-> exception ex-data :problems))\n (handler exception request))))\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/plus\"\n {:get\n {:parameters {:query {:x int?, :y int?}}\n :responses {200 {:body {:total pos-int?}}}\n :handler (fn [{{{:keys [x y]} :query} :parameters}]\n {:status 200, :body {:total (+ x y)}})}}]\n {:data {:coercion reitit.coercion.spec/coercion\n :middleware [(exception/create-exception-middleware\n (merge\n exception/default-handlers\n {:reitit.coercion/request-coercion (coercion-error-handler 400)\n :reitit.coercion/response-coercion (coercion-error-handler 500)}))\n coercion/coerce-request-middleware\n coercion/coerce-response-middleware]}})))\n\n(app\n {:uri \"/plus\"\n :request-method :get\n :query-params {\"x\" \"1\", \"y\" \"fail\"}})\n; => ...\n; -- Spec failed --------------------\n;\n; {:x ..., :y \"fail\"}\n; ^^^^^^\n;\n; should satisfy\n;\n; int?\n\n\n\n(app\n {:uri \"/plus\"\n :request-method :get\n :query-params {\"x\" \"1\", \"y\" \"-2\"}})\n; => ...\n;-- Spec failed --------------------\n;\n; {:total -1}\n; ^^\n;\n; should satisfy\n;\n; pos-int?\n\nOptimizations\nThe coercion middleware are compiled against a route. In the middleware compilation step the actual coercer implementations are constructed for the defined models. Also, the middleware doesn't mount itself if a route doesn't have :coercion and :parameters or :responses defined.\nWe can query the compiled middleware chain for the routes:\n(require '[reitit.core :as r])\n\n(-> (ring/get-router app)\n (r/match-by-name ::plus)\n :result :post :middleware\n (->> (mapv :name)))\n; [::mw/coerce-exceptions\n; ::mw/coerce-request\n; ::mw/coerce-response]\n\nRoute without coercion defined:\n(app {:request-method :get, :uri \"/api/ping\"})\n; {:status 200, :body \"pong\"}\n\nHas no mounted middleware:\n(-> (ring/get-router app)\n (r/match-by-name ::ping)\n :result :get :middleware\n (->> (mapv :name)))\n; []\n\n"},"ring/route_data_validation.html":{"url":"ring/route_data_validation.html","title":"Route Data Validation","keywords":"","body":"Route Data Validation\nRing route validation works just like with core router, with few differences:\n\nreitit.ring.spec/validate should be used instead of reitit.spec/validate - to support validating all endpoints (:get, :post etc.)\nWith clojure.spec validation, Middleware can contribute to route spec via :specs key. The effective route data spec is router spec merged with middleware specs.\n\nExample\nA simple app with spec-validation turned on:\n(require '[clojure.spec.alpha :as s])\n(require '[reitit.ring :as ring])\n(require '[reitit.ring.spec :as rrs])\n(require '[reitit.spec :as rs])\n(require '[expound.alpha :as e])\n\n(defn handler [_]\n {:status 200, :body \"ok\"})\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\"\n [\"/public\"\n [\"/ping\" {:get handler}]]\n [\"/internal\"\n [\"/users\" {:get {:handler handler}\n :delete {:handler handler}}]]]\n {:validate rrs/validate\n ::rs/explain e/expound-str})))\n\nAll good:\n(app {:request-method :get\n :uri \"/api/internal/users\"})\n; {:status 200, :body \"ok\"}\n\nExplicit specs via middleware\nMiddleware that requires :zone to be present in route data:\n(s/def ::zone #{:public :internal})\n\n(def zone-middleware\n {:name ::zone-middleware\n :spec (s/keys :req-un [::zone])\n :wrap (fn [handler]\n (fn [request]\n (let [zone (-> request (ring/get-match) :data :zone)]\n (println zone)\n (handler request))))})\n\nMissing route data fails fast at router creation:\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [zone-middleware]} ;; \nAdding the :zone to route data fixes the problem:\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [zone-middleware]}\n [\"/public\" {:zone :public} ;; {:status 200, :body \"ok\"}\n\nImplicit specs\nBy design, clojure.spec validates all fully-qualified keys with s/keys specs even if they are not defined in that keyset. Validation is implicit but powerful.\nLet's reuse the wrap-enforce-roles from Dynamic extensions and define specs for the data:\n(require '[clojure.set :as set])\n\n(s/def ::role #{:admin :manager})\n(s/def ::roles (s/coll-of ::role :into #{}))\n\n(defn wrap-enforce-roles [handler]\n (fn [{::keys [roles] :as request}]\n (let [required (some-> request (ring/get-match) :data ::roles)]\n (if (and (seq required) (not (set/subset? required roles)))\n {:status 403, :body \"forbidden\"}\n (handler request)))))\n\nwrap-enforce-roles silently ignores if the ::roles is not present:\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [zone-middleware\n wrap-enforce-roles]} ;; {:status 200, :body \"ok\"}\n\nBut fails if they are present and invalid:\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\" {:middleware [zone-middleware\n wrap-enforce-roles]}\n [\"/public\" {:zone :public}\n [\"/ping\" {:get handler}]]\n [\"/internal\" {:zone :internal}\n [\"/users\" {:get {:handler handler\n ::roles #{:manager} ;; \nPushing the data to the endpoints\nAbility to define (and reuse) route-data in mid-paths is a powerful feature, but having data defined all around might be harder to reason about. There is always an option to define all data at the endpoints.\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\"\n [\"/public\"\n [\"/ping\" {:zone :public\n :get handler\n :middleware [zone-middleware\n wrap-enforce-roles]}]]\n [\"/internal\"\n [\"/users\" {:zone :internal\n :middleware [zone-middleware\n wrap-enforce-roles]\n :get {:handler handler\n ::roles #{:manager}}\n :delete {:handler handler\n ::roles #{:admin}}}]]]\n {:validate rrs/validate\n ::rs/explain e/expound-str})))\n\nOr even flatten the routes:\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/api/public/ping\" {:zone :public\n :get handler\n :middleware [zone-middleware\n wrap-enforce-roles]}]\n [\"/api/internal/users\" {:zone :internal\n :middleware [zone-middleware\n wrap-enforce-roles]\n :get {:handler handler\n ::roles #{:manager}}\n :delete {:handler handler\n ::roles #{:admin}}}]]\n {:validate rrs/validate\n ::rs/explain e/expound-str})))\n\nThe common Middleware can also be pushed to the router, here cleanly separating behavior and data:\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/api/public/ping\" {:zone :public\n :get handler}]\n [\"/api/internal/users\" {:zone :internal\n :get {:handler handler\n ::roles #{:manager}}\n :delete {:handler handler\n ::roles #{:admin}}}]]\n {:data {:middleware [zone-middleware wrap-enforce-roles]}\n :validate rrs/validate\n ::rs/explain e/expound-str})))\n\n"},"ring/compiling_middleware.html":{"url":"ring/compiling_middleware.html","title":"Compiling Middleware","keywords":"","body":"Compiling Middleware\nThe dynamic extensions is a easy way to extend the system. To enable fast lookups into route data, we can compile them into any shape (records, functions etc.) we want, enabling fast access at request-time.\nBut, we can do much better. As we know the exact route that middleware/interceptor is linked to, we can pass the (compiled) route information into the middleware at creation-time. It can do local reasoning: extract and transform relevant data just for it and pass the optimized data into the actual request-handler via a closure - yielding much faster runtime processing. Middleware can also decide not to mount itself by returning nil. Why mount a wrap-enforce-roles middleware for a route if there are no roles required for it?\nTo enable this we use middleware records :compile key instead of the normal :wrap. :compile expects a function of route-data router-opts => ?IntoMiddleware.\nTo demonstrate the two approaches, below are response coercion middleware written as normal ring middleware function and as middleware record with :compile.\nNormal Middleware\n\nReads the compiled route information on every request. Everything is done at request-time.\n\n(defn wrap-coerce-response\n \"Middleware for pluggable response coercion.\n Expects a :coercion of type `reitit.coercion/Coercion`\n and :responses from route data, otherwise will do nothing.\"\n [handler]\n (fn\n ([request]\n (let [response (handler request)\n method (:request-method request)\n match (ring/get-match request)\n responses (-> match :result method :data :responses)\n coercion (-> match :data :coercion)\n opts (-> match :data :opts)]\n (if (and coercion responses)\n (let [coercers (response-coercers coercion responses opts)]\n (coerce-response coercers request response))\n response)))\n ([request respond raise]\n (let [method (:request-method request)\n match (ring/get-match request)\n responses (-> match :result method :data :responses)\n coercion (-> match :data :coercion)\n opts (-> match :data :opts)]\n (if (and coercion responses)\n (let [coercers (response-coercers coercion responses opts)]\n (handler request #(respond (coerce-response coercers request %))))\n (handler request respond raise))))))\n\nCompiled Middleware\n\nRoute information is provided at creation-time\nCoercers are compiled at creation-time\nMiddleware mounts only if :coercion and :responses are defined for the route\nAlso defines spec for the route data :responses for the route data validation.\n\n(require '[reitit.spec :as rs])\n\n(def coerce-response-middleware\n \"Middleware for pluggable response coercion.\n Expects a :coercion of type `reitit.coercion/Coercion`\n and :responses from route data, otherwise does not mount.\"\n {:name ::coerce-response\n :spec ::rs/responses\n :compile (fn [{:keys [coercion responses]} opts]\n (if (and coercion responses)\n (let [coercers (coercion/response-coercers coercion responses opts)]\n (fn [handler]\n (fn\n ([request]\n (coercion/coerce-response coercers request (handler request)))\n ([request respond raise]\n (handler request #(respond (coercion/coerce-response coercers request %)) raise)))))))})\n\nIt has 50% less code, it's much easier to reason about and is much faster.\nRequire Keys on Routes at Creation Time\nOften it is useful to require a route to provide a specific key.\n(require '[buddy.auth.accessrules :as accessrules])\n\n(s/def ::authorize\n (s/or :handler :accessrules/handler :rule :accessrules/rule))\n\n(def authorization-middleware\n {:name ::authorization\n :spec (s/keys :req-un [::authorize])\n :compile\n (fn [route-data _opts]\n (when-let [rule (:authorize route-data)]\n (fn [handler]\n (accessrules/wrap-access-rules handler {:rules [rule]}))))})\n\nIn the example above the :spec expresses that each route is required to provide the :authorize key. However, in this case the compile function returns nil when that key is missing, which means the middleware will not be mounted, the spec will not be considered, and the compiler will not enforce this requirement as intended.\nIf you just want to enforce the spec return a map without :wrap or :compile keys, e.g. an empty map, {}.\n(def authorization-middleware\n {:name ::authorization\n :spec (s/keys :req-un [::authorize])\n :compile\n (fn [route-data _opts]\n (if-let [rule (:authorize route-data)]\n (fn [handler]\n (accessrules/wrap-access-rules handler {:rules [rule]}))\n ;; return empty map just to enforce spec\n {}))})\n\nThe middleware (and associated spec) will still be part of the chain, but will not process the request.\n"},"ring/swagger.html":{"url":"ring/swagger.html","title":"Swagger Support","keywords":"","body":"Swagger Support\n[metosin/reitit-swagger \"0.5.5\"]\nReitit supports Swagger2 documentation, thanks to schema-tools and spec-tools. Documentation is extracted from route definitions, coercion :parameters and :responses and from a set of new documentation keys.\nTo enable swagger-documentation for a ring-router:\n\nannotate your routes with swagger-data\nmount a swagger-handler to serve the swagger-spec\noptionally mount a swagger-ui to visualize the swagger-spec\n\nSwagger data\nThe following route data keys contribute to the generated swagger specification:\n\n\n\nkey\ndescription\n\n\n\n\n:swagger\nmap of any swagger-data. Can have :id (keyword or sequence of keywords) to identify the api\n\n\n:no-doc\noptional boolean to exclude endpoint from api docs\n\n\n:tags\noptional set of string or keyword tags for an endpoint api docs\n\n\n:summary\noptional short string summary of an endpoint\n\n\n:description\noptional long description of an endpoint. Supports http://spec.commonmark.org/\n\n\n\nCoercion keys also contribute to the docs:\n\n\n\nkey\ndescription\n\n\n\n\n:parameters\noptional input parameters for a route, in a format defined by the coercion\n\n\n:responses\noptional descriptions of responses, in a format defined by coercion\n\n\n\nThere is a reitit.swagger.swagger-feature, which acts as both a Middleware and an Interceptor that is not participating in any request processing - it just defines the route data specs for the routes it's mounted to. It is only needed if the route data validation is turned on.\nSwagger spec\nTo serve the actual Swagger Specification, there is reitit.swagger/create-swagger-handler. It takes no arguments and returns a ring-handler which collects at request-time data from all routes for the same swagger api and returns a formatted Swagger specification as Clojure data, to be encoded by a response formatter.\nIf you need to post-process the generated spec, just wrap the handler with a custom Middleware or an Interceptor.\nSwagger-ui\nSwagger-ui is a user interface to visualize and interact with the Swagger specification. To make things easy, there is a pre-integrated version of the swagger-ui as a separate module.\n[metosin/reitit-swagger-ui \"0.5.5\"]\nreitit.swagger-ui/create-swagger-ui-hander can be used to create a ring-handler to serve the swagger-ui. It accepts the following options:\n\n\n\nkey\ndescription\n\n\n\n\n:parameter\noptional name of the wildcard parameter, defaults to unnamed keyword :\n\n\n:root\noptional resource root, defaults to \"swagger-ui\"\n\n\n:url\npath to swagger endpoint, defaults to /swagger.json\n\n\n:path\noptional path to mount the handler to. Works only if mounted outside of a router.\n\n\n:config\nparameters passed to swagger-ui as-is. See the docs\n\n\n\nWe use swagger-ui from ring-swagger-ui, which can be easily configured from routing application. It stores files swagger-ui in the resource classpath.\nWebjars also hosts a version of the swagger-ui.\nNOTE: Currently, swagger-ui module is just for Clojure. ClojureScript-support welcome as a PR!\nNOTE: If you want to use swagger-ui 2.x you can do so by explicitly downgrading metosin/ring-swagger-ui to 2.2.10.\nNOTE: If you use swagger-ui 3.x, you need to include :responses for Swagger-UI\nto display the response when trying out endpoints. You can define :responses {200 {:schema s/Any}}\nat the top-level to show responses for all endpoints.\nExamples\nSimple example\n\ntwo routes\nswagger-spec served from \"/swagger.json\"\nswagger-ui mounted to \"/api-docs\"\nnote that for real-world use, you need a content-negotiation middleware -\nsee the next example\n\n(require '[reitit.ring :as ring])\n(require '[reitit.swagger :as swagger])\n(require '[reitit.swagger-ui :as swagger-ui])\n\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/api\"\n [\"/ping\" {:get (constantly {:status 200, :body \"ping\"})}]\n [\"/pong\" {:post (constantly {:status 200, :body \"pong\"})}]]\n [\"\" {:no-doc true}\n [\"/swagger.json\" {:get (swagger/create-swagger-handler)}]\n [\"/api-docs/*\" {:get (swagger-ui/create-swagger-ui-handler)}]]])))\n\nThe generated swagger spec:\n(app {:request-method :get :uri \"/swagger.json\"})\n;{:status 200\n; :body {:swagger \"2.0\"\n; :x-id #{:reitit.swagger/default}\n; :paths {\"/api/ping\" {:get {}}\n; \"/api/pong\" {:post {}}}}}\n\nSwagger-ui:\n(app {:request-method :get, :uri \"/api-docs/index.html\"})\n; ... the swagger-ui index-page, configured correctly\n\nYou might be interested in adding a trailing slash handler to the app to serve the swagger-ui from /api-docs (without the trailing slash) too.\nAnother way to serve the swagger-ui is using the default handler:\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/api\"\n [\"/ping\" {:get (constantly {:status 200, :body \"ping\"})}]\n [\"/pong\" {:post (constantly {:status 200, :body \"pong\"})}]]\n [\"/swagger.json\"\n {:get {:no-doc true\n :handler (swagger/create-swagger-handler)}}]]) \n (swagger-ui/create-swagger-ui-handler {:path \"/api-docs\"})))\n\nMore complete example\n\nclojure.spec coercion\nswagger data (:tags, :produces, :summary, :basePath)\nswagger-spec served from \"/swagger.json\"\nswagger-ui mounted to \"/\"\nset of middleware for content negotiation, exceptions, multipart etc.\nmissed routes are handled by create-default-handler\nserved via ring-jetty\n\nWhole example project is in /examples/ring-swagger.\n(ns example.server\n (:require [reitit.ring :as ring]\n [reitit.swagger :as swagger]\n [reitit.swagger-ui :as swagger-ui]\n [reitit.ring.coercion :as coercion]\n [reitit.coercion.spec]\n [reitit.ring.middleware.muuntaja :as muuntaja]\n [reitit.ring.middleware.exception :as exception]\n [reitit.ring.middleware.multipart :as multipart]\n [reitit.ring.middleware.parameters :as parameters]\n [ring.middleware.params :as params]\n [ring.adapter.jetty :as jetty]\n [muuntaja.core :as m]\n [clojure.java.io :as io]))\n\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/swagger.json\"\n {:get {:no-doc true\n :swagger {:info {:title \"my-api\"}\n :basePath \"/\"} ;; prefix for all paths\n :handler (swagger/create-swagger-handler)}}]\n\n [\"/files\"\n {:swagger {:tags [\"files\"]}}\n\n [\"/upload\"\n {:post {:summary \"upload a file\"\n :parameters {:multipart {:file multipart/temp-file-part}}\n :responses {200 {:body {:file multipart/temp-file-part}}}\n :handler (fn [{{{:keys [file]} :multipart} :parameters}]\n {:status 200\n :body {:file file}})}}]\n\n [\"/download\"\n {:get {:summary \"downloads a file\"\n :swagger {:produces [\"image/png\"]}\n :handler (fn [_]\n {:status 200\n :headers {\"Content-Type\" \"image/png\"}\n :body (io/input-stream (io/resource \"reitit.png\"))})}}]]\n\n [\"/math\"\n {:swagger {:tags [\"math\"]}}\n\n [\"/plus\"\n {:get {:summary \"plus with spec query parameters\"\n :parameters {:query {:x int?, :y int?}}\n :responses {200 {:body {:total int?}}}\n :handler (fn [{{{:keys [x y]} :query} :parameters}]\n {:status 200\n :body {:total (+ x y)}})}\n :post {:summary \"plus with spec body parameters\"\n :parameters {:body {:x int?, :y int?}}\n :responses {200 {:body {:total int?}}}\n :handler (fn [{{{:keys [x y]} :body} :parameters}]\n {:status 200\n :body {:total (+ x y)}})}}]]]\n\n {:data {:coercion reitit.coercion.spec/coercion\n :muuntaja m/instance\n :middleware [;; query-params & form-params\n parameters/parameters-middleware\n ;; content-negotiation\n muuntaja/format-negotiate-middleware\n ;; encoding response body\n muuntaja/format-response-middleware\n ;; exception handling\n exception/exception-middleware\n ;; decoding request body\n muuntaja/format-request-middleware\n ;; coercing response bodys\n coercion/coerce-response-middleware\n ;; coercing request parameters\n coercion/coerce-request-middleware\n ;; multipart\n multipart/multipart-middleware]}})\n (ring/routes\n (swagger-ui/create-swagger-ui-handler {:path \"/\"})\n (ring/create-default-handler))))\n\n(defn start []\n (jetty/run-jetty #'app {:port 3000, :join? false})\n (println \"server running in port 3000\"))\n\nhttp://localhost:3000 should render now the swagger-ui:\n\nMultiple swagger apis\nThere can be multiple swagger apis within a router. Each route can be part of 0..n swagger apis. Swagger apis are identified by value in route data under key path [:swagger :id]. It can be either a keyword or a sequence of keywords. Normal route data scoping rules rules apply.\nExample with:\n\n4 routes\n2 swagger apis ::one and ::two\n3 swagger specs\n\n(require '[reitit.ring :as ring])\n(require '[reitit.swagger :as swagger])\n\n(def ping-route\n [\"/ping\" {:get (constantly {:status 200, :body \"ping\"})}])\n\n(def spec-route\n [\"/swagger.json\"\n {:get {:no-doc true\n :handler (swagger/create-swagger-handler)}}])\n\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/common\" {:swagger {:id #{::one ::two}}} ping-route]\n [\"/one\" {:swagger {:id ::one}} ping-route spec-route]\n [\"/two\" {:swagger {:id ::two}} ping-route spec-route\n [\"/deep\" {:swagger {:id ::one}} ping-route]]\n [\"/one-two\" {:swagger {:id #{::one ::two}}} spec-route]])))\n\n(-> {:request-method :get, :uri \"/one/swagger.json\"} app :body :paths keys)\n; (\"/common/ping\" \"/one/ping\" \"/two/deep/ping\")\n\n(-> {:request-method :get, :uri \"/two/swagger.json\"} app :body :paths keys)\n; (\"/common/ping\" \"/two/ping\")\n\n(-> {:request-method :get, :uri \"/one-two/swagger.json\"} app :body :paths keys)\n; (\"/common/ping\" \"/one/ping\" \"/two/ping\" \"/two/deep/ping\")\n\nTODO\n\nClojureScript\nexample for Macchiato\nbody formatting\nresource handling\n\n\n\n"},"ring/RESTful_form_methods.html":{"url":"ring/RESTful_form_methods.html","title":"RESTful form methods","keywords":"","body":"RESTful form methods\nWhen designing RESTful applications you will be doing a lot of \"PATCH\" and \"DELETE\" request, but most browsers don't support methods other than \"GET\" and \"POST\" when it comes to submitting forms. \nThere is a pattern to solve this (pioneered by Rails) using a hidden \"_method\" field in the form and swapping out the \"POST\" method for whatever is in that field.\nWe can do this with middleware in reitit like this: \n(defn- hidden-method\n [request]\n (keyword \n (or (get-in request [:form-params \"_method\"]) ;; look for \"_method\" field in :form-params\n (get-in request [:multipart-params \"_method\"])))) ;; or in :multipart-params\n\n(def wrap-hidden-method\n {:name ::wrap-hidden-method\n :wrap (fn [handler]\n (fn [request]\n (if-let [fm (and (= :post (:request-method request)) ;; if this is a :post request\n (hidden-method request))] ;; and there is a \"_method\" field \n (handler (assoc request :request-method fm)) ;; replace :request-method\n (handler request))))})\n\nAnd apply the middleware like this: \n(reitit.ring/ring-handler\n (reitit.ring/router ...)\n (reitit.ring/create-default-handler)\n {:middleware \n [reitit.ring.middleware.parameters/parameters-middleware ;; needed to have :form-params in the request map\n reitit.ring.middleware.multipart/multipart-middleware ;; needed to have :multipart-params in the request map\n wrap-hidden-method]}) ;; our hidden method wrapper\n\n(NOTE: This middleware must be placed here and not inside the route data given to reitit.ring/handler. \nThis is so that our middleware is applied before reitit matches the request with a specific handler using the wrong method.)\n"},"http/interceptors.html":{"url":"http/interceptors.html","title":"Interceptors","keywords":"","body":"Interceptors\nReitit has also support for interceptors as an alternative to using middleware. Basic interceptor handling is implemented in reitit.interceptor package. There is no interceptor executor shipped, but you can use libraries like Pedestal Interceptor or Sieppari to execute the chains.\nReitit-http\n[metosin/reitit-http \"0.5.5\"]\n\nA module for http-routing using interceptors instead of middleware. Builds on top of the reitit-ring module having all the same features.\nThe differences:\n\n:interceptors key used in route data instead of :middleware\nreitit.http/http-router requires an extra option :executor of type reitit.interceptor/Executor to execute the interceptor chain\noptionally, a routing interceptor can be used - it enqueues the matched interceptors into the context. See reitit.http/routing-interceptor for details.\n\n\n\nSimple example\n(require '[reitit.ring :as ring])\n(require '[reitit.http :as http])\n(require '[reitit.interceptor.sieppari :as sieppari])\n\n(defn interceptor [number]\n {:enter (fn [ctx] (update-in ctx [:request :number] (fnil + 0) number))})\n\n(def app\n (http/ring-handler\n (http/router\n [\"/api\"\n {:interceptors [(interceptor 1)]}\n\n [\"/number\"\n {:interceptors [(interceptor 10)]\n :get {:interceptors [(interceptor 100)]\n :handler (fn [req]\n {:status 200\n :body (select-keys req [:number])})}}]])\n\n ;; the default handler\n (ring/create-default-handler)\n\n ;; executor\n {:executor sieppari/executor}))\n\n\n(app {:request-method :get, :uri \"/\"})\n; {:status 404, :body \"\", :headers {}}\n\n(app {:request-method :get, :uri \"/api/number\"})\n; {:status 200, :body {:number 111}}\n\nWhy interceptors?\n\nhttps://quanttype.net/posts/2018-08-03-why-interceptors.html\nhttps://www.reddit.com/r/Clojure/comments/9csmty/why_interceptors/\n\n"},"http/pedestal.html":{"url":"http/pedestal.html","title":"Pedestal","keywords":"","body":"Pedestal\nPedestal is a backend web framework for Clojure. reitit-pedestal provides an alternative routing engine for Pedestal.\n[metosin/reitit-pedestal \"0.5.5\"]\n\nWhy should one use reitit instead of the Pedestal default routing?\n\nOne simple route syntax, with full route conflict resolution.\nSupports first class route data with spec validation.\nFixes some known problems in routing.\nCan handle trailing backslashes.\nOne router for both backend and frontend.\nSupports parameter coercion & Swagger.\nIs even faster.\n\nTo use Pedestal with reitit, you should first read both the Pedestal docs and the reitit interceptor guide.\nExample\nA minimalistic example on how to to swap the default-router with a reitit router.\n; [io.pedestal/pedestal.service \"0.5.5\"]\n; [io.pedestal/pedestal.jetty \"0.5.5\"]\n; [metosin/reitit-pedestal \"0.5.5\"]\n; [metosin/reitit \"0.5.5\"]\n\n(require '[io.pedestal.http :as server])\n(require '[reitit.pedestal :as pedestal])\n(require '[reitit.http :as http])\n(require '[reitit.ring :as ring])\n\n(defn interceptor [number]\n {:enter (fn [ctx] (update-in ctx [:request :number] (fnil + 0) number))})\n\n(def routes\n [\"/api\"\n {:interceptors [(interceptor 1)]}\n\n [\"/number\"\n {:interceptors [(interceptor 10)]\n :get {:interceptors [(interceptor 100)]\n :handler (fn [req]\n {:status 200\n :body (select-keys req [:number])})}}]])\n\n(-> {::server/type :jetty\n ::server/port 3000\n ::server/join? false\n ;; no pedestal routes\n ::server/routes []}\n (server/default-interceptors)\n ;; swap the reitit router\n (pedestal/replace-last-interceptor\n (pedestal/routing-interceptor\n (http/router routes)))\n (server/dev-interceptors)\n (server/create-server)\n (server/start))\n\nCompatibility\nThere is no common interceptor spec for Clojure and all default reitit interceptors (coercion, exceptions etc.) use the Sieppari interceptor model. It is mostly compatible with the Pedestal Interceptor model, only exception being that the :error handlers take just 1 arity (context) compared to Pedestal's 2-arity (context and exception).\nCurrently, out of the reitit default interceptors, there is only the reitit.http.interceptors.exception/exception-interceptor which has the :error defined.\nYou are most welcome to discuss about a common interceptor spec in #interceptors on Clojurians Slack.\nMore examples\nSimple\nSimple example with sync & async interceptors: https://github.com/metosin/reitit/tree/master/examples/pedestal\nSwagger\nMore complete example with custom interceptors, default interceptors, coercion and swagger-support enabled: https://github.com/metosin/reitit/tree/master/examples/pedestal-swagger\n"},"http/sieppari.html":{"url":"http/sieppari.html","title":"Sieppari","keywords":"","body":"Sieppari\n[metosin/reitit-sieppari \"0.5.5\"]\n\nSieppari is a new and fast interceptor implementation for Clojure, with pluggable async supporting core.async, Manifold and Promesa.\nTo use Sieppari with reitit-http, we need to attach a reitit.interceptor.sieppari/executor to a http-router to compile and execute the interceptor chains. Reitit and Sieppari share the same interceptor model, so all reitit default interceptors work seamlessly together.\nWe can use both synchronous ring and async-ring with Sieppari.\nSynchronous Ring\n(require '[reitit.http :as http])\n(require '[reitit.interceptor.sieppari :as sieppari])\n\n(defn i [x]\n {:enter (fn [ctx] (println \"enter \" x) ctx)\n :leave (fn [ctx] (println \"leave \" x) ctx)})\n\n(defn handler [_]\n (future {:status 200, :body \"pong\"}))\n\n(def app\n (http/ring-handler\n (http/router\n [\"/api\"\n {:interceptors [(i :api)]}\n\n [\"/ping\"\n {:interceptors [(i :ping)]\n :get {:interceptors [(i :get)]\n :handler handler}}]])\n {:executor sieppari/executor}))\n\n(app {:request-method :get, :uri \"/api/ping\"})\n;enter :api\n;enter :ping\n;enter :get\n;leave :get\n;leave :ping\n;leave :api\n;=> {:status 200, :body \"pong\"}\n\nAsync-ring\n(let [respond (promise)]\n (app {:request-method :get, :uri \"/api/ping\"} respond nil)\n (deref respond 1000 ::timeout))\n;enter :api\n;enter :ping\n;enter :get\n;leave :get\n;leave :ping\n;leave :api\n;=> {:status 200, :body \"pong\"}\n\nExamples\nSimple\n\nsimple example, with both sync & async code:\nhttps://github.com/metosin/reitit/tree/master/examples/http\n\n\n\nWith batteries\n\nwith default interceptors, coercion and swagger-support:\nhttps://github.com/metosin/reitit/tree/master/examples/http-swagger\n\n\n\n"},"http/default_interceptors.html":{"url":"http/default_interceptors.html","title":"Default Interceptors","keywords":"","body":"Default Interceptors\n[metosin/reitit-interceptors \"0.5.5\"]\n\nJust like the ring default middleware, but for interceptors.\nParameters handling\n\nreitit.http.interceptors.parameters/parameters-interceptor \n\nException handling\n\nreitit.http.interceptors.exception/exception-interceptor\n\nContent Negotiation\n\nreitit.http.interceptors.muuntaja/format-interceptor\nreitit.http.interceptors.muuntaja/format-negotiate-interceptor\nreitit.http.interceptors.muuntaja/format-request-interceptor\nreitit.http.interceptors.muuntaja/format-response-interceptor\n\nMultipart request handling\n\nreitit.http.interceptors.multipart/multipart-interceptor\n\nExample app\nSee an example app with the default interceptors in action: https://github.com/metosin/reitit/blob/master/examples/http-swagger/src/example/server.clj.\n"},"http/transforming_interceptor_chain.html":{"url":"http/transforming_interceptor_chain.html","title":"Transforming Interceptor Chain","keywords":"","body":"Transforming the Interceptor Chain\nThere is an extra option in http-router (actually, in the underlying interceptor-router): :reitit.interceptor/transform to transform the interceptor chain per endpoint. Value should be a function or a vector of functions that get a vector of compiled interceptors and should return a new vector of interceptors.\nNote: the last interceptor in the chain is usually the handler, compiled into an Interceptor. Applying a transformation clojure.core/reverse would put this interceptor into first in the chain, making the rest of the interceptors effectively unreachable. There is a helper reitit.interceptor/transform-butlast to transform all but the last interceptor.\nExample Application\n(require '[reitit.http :as http])\n(require '[reitit.interceptor.sieppari :as sieppari])\n\n(defn interceptor [message]\n {:enter (fn [ctx] (update-in ctx [:request :message] (fnil conj []) message))})\n\n(defn handler [req]\n {:status 200\n :body (select-keys req [:message])})\n\n(def app\n (http/ring-handler\n (http/router\n [\"/api\" {:interceptors [(interceptor 1) (interceptor 2)]}\n [\"/ping\" {:get {:interceptors [(interceptor 3)]\n :handler handler}}]])\n {:executor sieppari/executor}))\n\n(app {:request-method :get, :uri \"/api/ping\"})\n; {:status 200, :body {:message [1 2 3]}}\n\nReversing the Interceptor Chain\n(def app\n (http/ring-handler\n (http/router\n [\"/api\" {:interceptors [(interceptor 1) (interceptor 2)]}\n [\"/ping\" {:get {:interceptors [(interceptor 3)]\n :handler handler}}]]\n {::interceptor/transform (interceptor/transform-butlast reverse)})\n {:executor sieppari/executor}))\n\n(app {:request-method :get, :uri \"/api/ping\"})\n; {:status 200, :body {:message [3 2 1]}}\n\nInterleaving Interceptors\n(def app\n (http/ring-handler\n (http/router\n [\"/api\" {:interceptors [(interceptor 1) (interceptor 2)]}\n [\"/ping\" {:get {:interceptors [(interceptor 3)]\n :handler handler}}]]\n {::interceptor/transform #(interleave % (repeat (interceptor :debug)))})\n {:executor sieppari/executor}))\n\n(app {:request-method :get, :uri \"/api/ping\"})\n; {:status 200, :body {:message [1 :debug 2 :debug 3 :debug]}}\n\nPrinting Context Diffs\n[metosin/reitit-interceptors \"0.5.5\"]\n\nUsing reitit.http.interceptors.dev/print-context-diffs transformation, the context diffs between each interceptor are printed out to the console. To use it, add the following router option:\n:reitit.interceptor/transform reitit.http.interceptor.dev/print-context-diffs\n\nSample output:\n\nSample applications (uncomment the option to see the diffs):\n\nSieppari: https://github.com/metosin/reitit/blob/master/examples/http-swagger/src/example/server.clj\nPedestal: https://github.com/metosin/reitit/blob/master/examples/pedestal-swagger/src/example/server.clj\n\n"},"frontend/basics.html":{"url":"frontend/basics.html","title":"Basics","keywords":"","body":"Frontend basics\nReitit frontend integration is built from multiple layers:\n\nCore functions with some additional browser oriented features\nBrowser integration for attaching Reitit to hash-change or HTML\nhistory events\nStateful wrapper for easy use of history integration\nOptional controller extension\n\nCore functions\nreitit.frontend provides few useful functions wrapping core functions:\nmatch-by-path version which parses a URI using JavaScript, including\nquery-string, and also coerces the parameters.\nCoerced parameters are stored in match :parameters property. If coercion\nis not enabled, the original parameters are stored in the same property,\nto allow the same code to read parameters regardless if coercion is\nenabled.\nrouter which compiles coercers by default.\nmatch-by-name and match-by-name! with optional path-paramers and\nlogging errors to console.warn instead of throwing errors to prevent\nReact breaking due to errors.\nNext\nBrowser integration\n"},"frontend/browser.html":{"url":"frontend/browser.html","title":"Browser integration","keywords":"","body":"Frontend browser integration\nReitit includes two browser history integrations.\nFunctions follow HTML5 History API: push-state to change route, replace-state\nto change route without leaving previous entry in browser history.\nFragment router\nFragment is simple integration which stores the current route in URL fragment,\ni.e. after #. This means the route is never part of the request URI and\nserver will always know which file to return (index.html).\nHTML5 router\nHTML5 History API can be used to modify the URL in browser without making\nrequest to the server. This means the URL will look normal, but the downside is\nthat the server must respond to all routes with correct file (index.html).\nCheck examples for simple Ring handler example.\nAnchor click handling\nHTML5 History router will handle click events on anchors where the href\nmatches the route tree (and other rules).\nIf you have need to control this logic, for example to handle some\nanchor clicks where the href matches route tree normally (i.e. browser load)\nyou can provide :ignore-anchor-click? function to add your own logic to\nevent handling:\n(rfe/start!\n router\n {:use-fragment false\n :ignore-anchor-click? (fn [router e el uri]\n ;; Add additional check on top of the default checks\n (and (rfh/ignore-anchor-click? router e el uri)\n (not= \"false\" (gobj/get (.-dataset el) \"reititHandleClick\"))))})\n\n;; Use data-reitit-handle-click to disable Reitit anchor handling\n[:a\n {:href (rfe/href ::about)\n :data-reitit-handle-click false}\n \"About\"]\n\nEasy\nReitit frontend routers require storing the state somewhere and passing it to\nall the calls. Wrapper reitit.frontend.easy is provided which manages\na router instance and passes the instance to all calls. This should\nallow easy use in most applications, as browser anyway can only have single\nevent handler for page change events.\nHistory manipulation\nReitit doesn't include functions to manipulate the history stack, i.e.\ngo back or forwards, but calling History API functions directly should work:\n(.go js/window.history -1)\n;; or\n(.back js/window.history)\n"},"frontend/controllers.html":{"url":"frontend/controllers.html","title":"Controllers","keywords":"","body":"Controllers\n\nhttps://github.com/metosin/reitit/tree/master/examples/frontend-controllers\n\nControllers run code when a route is entered and left. This can be useful to:\n\nLoad resources\nUpdate application state\n\nHow controllers work\nA controller map can contain these properties:\n\nidentity function which takes a Match and returns an arbitrary value,\nor parameters value, which declares which parameters should affect\ncontroller identity\nstart & stop functions, which are called with controller identity\n\nWhen you navigate to a route that has a controller, controller identity\nis first resolved by using parameters declaration, or by calling identity function,\nor if neither is set, the identity is nil. Next, the controller\nis initialized by calling start with the controller identity value.\nWhen you exit that route, stop is called with the last controller identity value.\nIf you navigate to the same route with different match, identity gets\nresolved again. If the identity changes from the previous value, controller\nis reinitialized: stop and start get called again.\nYou can add controllers to a route by adding them to the route data in the\n:controllers vector. For example:\n[\"/item/:id\"\n {:controllers [{:parameters {:path [:id]}\n :start (fn [parameters] (js/console.log :start (-> parameters :path :id)))\n :stop (fn [parameters] (js/console.log :stop (-> parameters :path :id)))}]}]\n\nYou can leave out start or stop if you do not need both of them.\nEnabling controllers\nYou need to\ncall\nreitit.frontend.controllers/apply-controllers whenever\nthe URL changes. You can call it from the on-navigate callback of\nreitit.frontend.easy:\n(ns frontend.core\n (:require [reitit.frontend.easy :as rfe]\n [reitit.frontend.controllers :as rfc]))\n\n(defonce match-a (atom nil))\n\n(def routes\n [\"/\" ...])\n\n(defn init! []\n (rfe/start!\n routes\n (fn [new-match]\n (swap! match-a\n (fn [old-match]\n (when new-match\n (assoc new-match\n :controllers (rfc/apply-controllers (:controllers old-match) new-match))))))))\n\nSee also the full example.\nNested controllers\nWhen you nest routes in the route tree, the controllers get concatenated when\nroute data is merged. Consider this route tree:\n[\"/\" {:controllers [{:start (fn [_] (js/console.log \"root start\"))}]}\n [\"/item/:id\"\n {:controllers [{:params (fn [match] (get-in match [:path-params :id]))\n :start (fn [item-id] (js/console.log \"item start\" item-id))\n :stop (fn [item-id] (js/console.log \"item stop\" item-id))}]}]]\n\n\nWhen you navigate to any route at all, the root controller gets started.\nIf you navigate to /item/something, the root controller gets started first\nand then the item controller gets started.\nIf you then navigate from /item/something to /item/something-else, first\nthe item controller gets stopped with parameter something and then it gets\nstarted with the parameter something-else. The root controller stays on the\nwhole time since its parameters do not change.\n\nTips\nAuthentication\nControllers can be used to load resources from a server. If and when your\nAPI requires authentication you will need to implement logic to prevent controllers\ntrying to do requests if user isn't authenticated yet.\nRun controllers and check authentication\nIf you have both unauthenticated and authenticated resources, you can\nrun the controllers always and then check the authentication status\non controller code, or on the code called from controllers (e.g. re-frame event\nhandler).\nDisable controllers until user is authenticated\nIf all your resources require authentication an easy way to prevent bad\nrequests is to enable controllers only after authentication is done.\nTo do this you can check authentication status and call apply-controllers\nonly after authentication is done (also remember to manually call apply-controllers\nwith current match when authentication is done). Or if no navigation is possible\nbefore authentication is done, you can start the router only after\nauthentication is done.\nAlternatives\nSimilar solution could be used to describe required resources as data (maybe\neven GraphQL query) per route, and then have code automatically load\nmissing resources.\nControllers elsewhere\n\nControllers in Keechma\n\n"},"advanced/configuring_routers.html":{"url":"advanced/configuring_routers.html","title":"Configuring Routers","keywords":"","body":"Configuring Routers\nRouters can be configured via options. The following options are available for the reitit.core/router:\n\n\n\nkey\ndescription\n\n\n\n\n:path\nBase-path for routes\n\n\n:routes\nInitial resolved routes (default [])\n\n\n:data\nInitial route data (default {})\n\n\n:spec\nclojure.spec definition for a route data, see reitit.spec on how to use this\n\n\n:syntax\nPath-parameter syntax as keyword or set of keywords (default #{:bracket :colon})\n\n\n:expand\nFunction of arg opts => data to expand route arg to route data (default reitit.core/expand)\n\n\n:coerce\nFunction of route opts => route to coerce resolved route, can throw or return nil\n\n\n:compile\nFunction of route opts => result to compile a route handler\n\n\n:validate\nFunction of routes opts => () to validate route (data) via side-effects\n\n\n:conflicts\nFunction of {route #{route}} => () to handle conflicting routes\n\n\n:exception\nFunction of Exception => Exception to handle creation time exceptions (default reitit.exception/exception)\n\n\n:router\nFunction of routes opts => router to override the actual router implementation\n\n\n\n"},"advanced/composing_routers.html":{"url":"advanced/composing_routers.html","title":"Composing Routers","keywords":"","body":"Composing Routers\nData-driven approach in reitit allows us to compose routes, route data, route specs, middleware and interceptors chains. We can compose routers too. This is needed to achieve dynamic routing like in Compojure.\nImmutability\nOnce a router is created, the routing tree is immutable and cannot be changed. To change the routing, we need to create a new router with changed routes and/or options. For this, the Router protocol exposes it's resolved routes via r/routes and options via r/options.\nAdding routes\nLet's create a router:\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [[\"/foo\" ::foo]\n [\"/bar/:id\" ::bar]]))\n\nWe can query the resolved routes and options:\n(r/routes router)\n;[[\"/foo\" {:name :user/foo}]\n; [\"/bar/:id\" {:name :user/bar}]]\n\n(r/options router)\n;{:lookup #object[...]\n; :expand #object[...]\n; :coerce #object[...]\n; :compile #object[...]\n; :conflicts #object[...]}\n\nLet's add a helper function to create a new router with extra routes:\n(defn add-routes [router routes]\n (r/router\n (into (r/routes router) routes)\n (r/options router)))\n\nWe can now create a new router with extra routes:\n(def router2\n (add-routes\n router\n [[\"/baz/:id/:subid\" ::baz]]))\n\n(r/routes router2)\n;[[\"/foo\" {:name :user/foo}]\n; [\"/bar/:id\" {:name :user/bar}]\n; [\"/baz/:id/:subid\" {:name :user/baz}]]\n\nThe original router was not changed:\n(r/routes router)\n;[[\"/foo\" {:name :user/foo}]\n; [\"/bar/:id\" {:name :user/bar}]]\n\nWhen a new router is created, all rules are applied, including the conflict resolution:\n(add-routes\n router2\n [[\"/:this/should/:fail\" ::fail]])\n;CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route paths:\n;\n; /baz/:id/:subid\n;-> /:this/should/:fail\n\nMerging routers\nLet's create a helper function to merge routers:\n(defn merge-routers [& routers]\n (r/router\n (apply merge (map r/routes routers))\n (apply merge (map r/options routers))))\n\nWe can now merge multiple routers into one:\n(def router\n (merge-routers\n (r/router [\"/route1\" ::route1])\n (r/router [\"/route2\" ::route2])\n (r/router [\"/route3\" ::route3])))\n\n(r/routes router)\n;[[\"/route1\" {:name :user/route1}]\n; [\"/route2\" {:name :user/route2}]\n; [\"/route3\" {:name :user/route3}]]\n\nNesting routers\nRouters can be nested using the catch-all parameter.\nHere's a router with deeply nested routers under a :router key in the route data:\n(def router\n (r/router\n [[\"/ping\" :ping]\n [\"/olipa/*\" {:name :olipa\n :router (r/router\n [[\"/olut\" :olut]\n [\"/makkara\" :makkara]\n [\"/kerran/*\" {:name :kerran\n :router (r/router\n [[\"/avaruus\" :avaruus]\n [\"/ihminen\" :ihminen]])}]])}]]))\n\nMatching by path:\n(r/match-by-path router \"/olipa/kerran/iso/kala\")\n;#Match{:template \"/olipa/*\"\n; :data {:name :olipa\n; :router #object[reitit.core$mixed_router]}\n; :result nil\n; :path-params {: \"kerran/iso/kala\"}\n; :path \"/olipa/iso/kala\"}\n\nThat didn't work as we wanted, as the nested routers don't have such a route. The core routing doesn't understand anything the :router key, so it only matched against the top-level router, which gave a match for the catch-all path.\nAs the Match contains all the route data, we can create a new matching function that understands the :router key. Below is a function that does recursive matching using the subrouters. It returns either nil or a vector of matches.\n(require '[clojure.string :as str])\n\n(defn recursive-match-by-path [router path]\n (if-let [match (r/match-by-path router path)]\n (if-let [subrouter (-> match :data :router)]\n (let [subpath (subs path (str/last-index-of (:template match) \"/\"))]\n (if-let [submatch (recursive-match-by-path subrouter subpath)]\n (cons match submatch)))\n (list match))))\n\nWith invalid nested path we get now nil as expected:\n(recursive-match-by-path router \"/olipa/kerran/iso/kala\")\n; nil\n\nWith valid path we get all the nested matches:\n(recursive-match-by-path router \"/olipa/kerran/avaruus\")\n;[#reitit.core.Match{:template \"/olipa/*\"\n; :data {:name :olipa\n; :router #object[reitit.core$mixed_router]}\n; :result nil\n; :path-params {: \"kerran/avaruus\"}\n; :path \"/olipa/kerran/avaruus\"}\n; #reitit.core.Match{:template \"/kerran/*\"\n; :data {:name :kerran\n; :router #object[reitit.core$lookup_router]}\n; :result nil\n; :path-params {: \"avaruus\"}\n; :path \"/kerran/avaruus\"}\n; #reitit.core.Match{:template \"/avaruus\" \n; :data {:name :avaruus} \n; :result nil \n; :path-params {} \n; :path \"/avaruus\"}]\n\nLet's create a helper to get only the route names for matches:\n(defn name-path [router path]\n (some->> (recursive-match-by-path router path)\n (mapv (comp :name :data))))\n\n(name-path router \"/olipa/kerran/avaruus\")\n; [:olipa :kerran :avaruus]\n\nSo, we can nest routers, but why would we do that?\nDynamic routing\nIn all the examples above, the routers were created ahead of time, making the whole route tree effectively static. To have more dynamic routing, we can use router references allowing the router to be swapped over time. We can also create fully dynamic routers where the router is re-created for each request. Let's walk through both cases.\nFirst, we need to modify our matching function to support router references:\n(defn- match :data :router \nThen, we need some routers.\nFirst, a reference to a router that can be updated on background, for example when a new entry in inserted into a database. We'll wrap the router into a atom:\n(def beer-router\n (atom\n (r/router \n [[\"/lager\" :lager]])))\n\nSecond, a reference to router, which is re-created on each routing request:\n(def dynamic-router\n (reify clojure.lang.IDeref\n (deref [_]\n (r/router\n [\"/duo\" (keyword (str \"duo\" (rand-int 100)))]))))\n\nWe can compose the routers into a system-level static root router:\n(def router\n (r/router\n [[\"/gin/napue\" :napue]\n [\"/ciders/*\" :ciders]\n [\"/beers/*\" {:name :beers\n :router beer-router}]\n [\"/dynamic/*\" {:name :dynamic\n :router dynamic-router}]]))\n\nMatching root routes:\n(name-path router \"/vodka/russian\")\n; nil\n\n(name-path router \"/gin/napue\")\n; [:napue]\n\nMatching (nested) beer routes:\n(name-path router \"/beers/lager\")\n; [:beers :lager]\n\n(name-path router \"/beers/saison\")\n; nil\n\nNo saison!? Let's add the route:\n(swap! beer-router add-routes [[\"/saison\" :saison]])\n\nThere we have it:\n(name-path router \"/beers/saison\")\n; [:beers :saison]\n\nWe can't add conflicting routes:\n(swap! beer-router add-routes [[\"/saison\" :saison]])\n;CompilerException clojure.lang.ExceptionInfo: Router contains conflicting route paths:\n;\n; /saison\n;-> /saison\n\nThe dynamic routes are re-created on every request:\n(name-path router \"/dynamic/duo\")\n; [:dynamic :duo71]\n\n(name-path router \"/dynamic/duo\")\n; [:dynamic :duo55]\n\nPerformance\nWith nested routers, instead of having to do just one route match, matching is recursive, which adds a small cost. All nested routers need to be of type catch-all at top-level, which is order of magnitude slower than fully static routes. Dynamic routes are the slowest ones, at least two orders of magnitude slower, as the router needs to be recreated for each request.\nA quick benchmark on the recursive lookups:\n\n\n\npath\ntime\ntype\n\n\n\n\n/gin/napue\n40ns\nstatic\n\n\n/ciders/weston\n440ns\ncatch-all\n\n\n/beers/saison\n600ns\ncatch-all + static\n\n\n/dynamic/duo\n12000ns\ncatch-all + dynamic\n\n\n\nThe non-recursive lookup for /gin/napue is around 23ns.\nComparing the dynamic routing performance with Compojure:\n(require '[compojure.core :refer [context])\n\n(def app\n (context \"/dynamic\" [] (constantly :duo)))\n\n(app {:uri \"/dynamic/duo\" :request-method :get})\n; :duo\n\n\n\n\npath\ntime\ntype\n\n\n\n\n/dynamic/duo\n20000ns\ncompojure\n\n\n\nCan we make the nester routing faster? Sure. We could use the Router :compile hook to compile the nested routers for better performance. We could also allow router creation rules to be disabled, to get the dynamic routing much faster.\nWhen to use nested routers?\nNesting routers is not trivial and because of that, should be avoided. For dynamic (request-time) route generation, it's the only choice. For other cases, nested routes are most likely a better option.\nLet's re-create the previous example with normal route nesting/composition.\nA helper to the root router:\n(defn create-router [beers]\n (r/router\n [[\"/gin/napue\" :napue]\n [\"/ciders/*\" :ciders]\n [\"/beers\" (for [beer beers]\n [(str \"/\" beer) (keyword \"beer\" beer)])]\n [\"/dynamic/*\" {:name :dynamic\n :router dynamic-router}]]))\n\nNew new root router reference and a helper to reset it:\n(def router\n (atom (create-router nil)))\n\n(defn reset-router! [beers]\n (reset! router (create-router beers)))\n\nThe routing tree:\n(r/routes @router)\n;[[\"/gin/napue\" {:name :napue}]\n; [\"/ciders/*\" {:name :ciders}]\n; [\"/dynamic/*\" {:name :dynamic,\n; :router #object[user$reify__24359]}]]\n\nLet's reset the router with some beers:\n(reset-router! [\"lager\" \"sahti\" \"bock\"])\n\nWe can see that the beer routes are now embedded into the core router:\n(r/routes @router)\n;[[\"/gin/napue\" {:name :napue}]\n; [\"/ciders/*\" {:name :ciders}]\n; [\"/beers/lager\" {:name :beer/lager}]\n; [\"/beers/sahti\" {:name :beer/sahti}]\n; [\"/beers/bock\" {:name :beer/bock}]\n; [\"/dynamic/*\" {:name :dynamic,\n; :router #object[user$reify__24359]}]]\n\nAnd the routing works:\n(name-path @router \"/beers/sahti\")\n;[:beer/sahti]\n\nAll the beer-routes now match in constant time.\n\n\n\npath\ntime\ntype\n\n\n\n\n/beers/sahti\n40ns\nstatic\n\n\n\nTODO\n\nadd an example how to do dynamic routing with reitit-ring\nmaybe create a recursive-router into a separate ns with all Router functions implemented correctly? maybe not...\nadd reitit.core/merge-routes to effectively merge routes with route data\n\n"},"advanced/different_routers.html":{"url":"advanced/different_routers.html","title":"Different Routers","keywords":"","body":"Different Routers\nReitit ships with several different implementations for the Router protocol, originally based on the Pedestal implementation. router function selects the most suitable implementation by inspecting the expanded routes. The implementation can be set manually using :router option, see configuring routers.\n\n\n\nrouter\ndescription\n\n\n\n\n:linear-router\nMatches the routes one-by-one starting from the top until a match is found. Slow, but works with all route trees.\n\n\n:trie-router\nRouter that creates a optimized search trie out of an route table. Much faster than :linear-router for wildcard routes. Valid only if there are no Route conflicts.\n\n\n:lookup-router\nFast router, uses hash-lookup to resolve the route. Valid if no paths have path or catch-all parameters and there are no Route conflicts.\n\n\n:single-static-path-router\nSuper fast router: string-matches a route. Valid only if there is one static route.\n\n\n:mixed-router\nContains two routers: :trie-router for wildcard routes and a :lookup-router or :single-static-path-router for static routes. Valid only if there are no Route conflicts.\n\n\n:quarantine-router\nContains two routers: :mixed-router for non-conflicting routes and a :linear-router for conflicting routes.\n\n\n\nThe router name can be asked from the router:\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [[\"/ping\" ::ping]\n [\"/api/:users\" ::users]]))\n\n(r/router-name router)\n; :mixed-router\n\nOverriding the router implementation:\n(require '[reitit.core :as r])\n\n(def router\n (r/router\n [[\"/ping\" ::ping]\n [\"/api/:users\" ::users]]\n {:router r/linear-router}))\n\n(r/router-name router)\n; :linear-router\n\n"},"advanced/route_validation.html":{"url":"advanced/route_validation.html","title":"Route Validation","keywords":"","body":"Route validation\nNamespace reitit.spec contains clojure.spec definitions for raw-routes, routes, router and router options.\nExample\n(require '[clojure.spec.alpha :as s])\n(require '[reitit.spec :as spec])\n\n(def routes-from-db\n [\"tenant1\" ::tenant1])\n\n(s/valid? ::spec/raw-routes routes-from-db)\n; false\n\n(s/explain ::spec/raw-routes routes-from-db)\n; In: [0] val: \"tenant1\" fails spec: :reitit.spec/path at: [:route :path] predicate: (or (blank? %) (starts-with? % \"/\"))\n; In: [0] val: \"tenant1\" fails spec: :reitit.spec/raw-route at: [:routes] predicate: (cat :path :reitit.spec/path :arg (? :reitit.spec/arg) :childs (* (and (nilable :reitit.spec/raw-route))))\n; In: [1] val: :user/tenant1 fails spec: :reitit.spec/raw-route at: [:routes] predicate: (cat :path :reitit.spec/path :arg (? :reitit.spec/arg) :childs (* (and (nilable :reitit.spec/raw-route))))\n; :clojure.spec.alpha/spec :reitit.spec/raw-routes\n; :clojure.spec.alpha/value [\"tenant1\" :user/tenant1]\n\nAt development time\nreitit.core/router can be instrumented and use a tool like expound to pretty-print the spec problems.\nFirst add a :dev dependency to:\n[expound \"0.4.0\"] ; or higher\n\nSome bootstrapping:\n(require '[clojure.spec.test.alpha :as stest])\n(require '[expound.alpha :as expound])\n(require '[clojure.spec.alpha :as s])\n(require '[reitit.spec])\n\n(stest/instrument `reitit/router)\n(set! s/*explain-out* expound/printer)\n\nAnd we are ready to go:\n(require '[reitit.core :as r])\n\n(r/router\n [\"/api\"\n [\"/public\"\n [\"/ping\"]\n [\"pong\"]]])\n\n; CompilerException clojure.lang.ExceptionInfo: Call to #'reitit.core/router did not conform to spec:\n;\n; -- Spec failed --------------------\n;\n; Function arguments\n;\n; ([\"/api\" ...])\n; ^^^^^^\n;\n; should satisfy\n;\n; (clojure.spec.alpha/cat\n; :path\n; :reitit.spec/path\n; :arg\n; (clojure.spec.alpha/? :reitit.spec/arg)\n; :childs\n; (clojure.spec.alpha/*\n; (clojure.spec.alpha/and\n; (clojure.spec.alpha/nilable :reitit.spec/raw-route))))\n;\n; or\n;\n; (clojure.spec.alpha/cat\n; :path\n; :reitit.spec/path\n; :arg\n; (clojure.spec.alpha/? :reitit.spec/arg)\n; :childs\n; (clojure.spec.alpha/*\n; (clojure.spec.alpha/and\n; (clojure.spec.alpha/nilable :reitit.spec/raw-route))))\n;\n; -- Relevant specs -------\n;\n; :reitit.spec/raw-route:\n; (clojure.spec.alpha/cat\n; :path\n; :reitit.spec/path\n; :arg\n; (clojure.spec.alpha/? :reitit.spec/arg)\n; :childs\n; (clojure.spec.alpha/*\n; (clojure.spec.alpha/and\n; (clojure.spec.alpha/nilable :reitit.spec/raw-route))))\n; :reitit.spec/raw-routes:\n; (clojure.spec.alpha/or\n; :route\n; :reitit.spec/raw-route\n; :routes\n; (clojure.spec.alpha/coll-of :reitit.spec/raw-route :into []))\n;\n; -- Spec failed --------------------\n;\n; Function arguments\n;\n; ([... [... ... [\"pong\"]]])\n; ^^^^^^\n;\n; should satisfy\n;\n; (fn\n; [%]\n; (or\n; (clojure.string/blank? %)\n; (clojure.string/starts-with? % \"/\")))\n;\n; or\n;\n; (fn\n; [%]\n; (or\n; (clojure.string/blank? %)\n; (clojure.string/starts-with? % \"/\")))\n;\n; -- Relevant specs -------\n;\n; :reitit.spec/path:\n; (clojure.spec.alpha/and\n; clojure.core/string?\n; (clojure.core/fn\n; [%]\n; (clojure.core/or\n; (clojure.string/blank? %)\n; (clojure.string/starts-with? % \"/\"))))\n; :reitit.spec/raw-route:\n; (clojure.spec.alpha/cat\n; :path\n; :reitit.spec/path\n; :arg\n; (clojure.spec.alpha/? :reitit.spec/arg)\n; :childs\n; (clojure.spec.alpha/*\n; (clojure.spec.alpha/and\n; (clojure.spec.alpha/nilable :reitit.spec/raw-route))))\n; :reitit.spec/raw-routes:\n; (clojure.spec.alpha/or\n; :route\n; :reitit.spec/raw-route\n; :routes\n; (clojure.spec.alpha/coll-of :reitit.spec/raw-route :into []))\n;\n; -------------------------\n; Detected 2 errors\n\n"},"advanced/dev_workflow.html":{"url":"advanced/dev_workflow.html","title":"Dev Workflow","keywords":"","body":"Dev Workflow\nMany applications will require the routes to span multiple namespaces. It is quite easy to do so with reitit, but we might hit a problem during development.\nAn example\nConsider this sample routing :\n(ns ns1)\n\n(def routes\n [\"/bar\" ::bar])\n\n(ns ns2)\n(require '[ns1])\n\n(def routes\n [[\"/ping\" ::ping]\n [\"/more\" ns1/routes]])\n\n(ns ns3)\n(require '[ns1])\n(require '[ns2])\n(require '[reitit.core :as r])\n\n(def routes\n [\"/api\"\n [\"/ns2\" ns2/routes]\n [\"/ping\" ::ping]])\n\n(def router (r/router routes))\n\nWe may query the top router and get the expected result :\n(r/match-by-path router \"/api/ns2/more/bar\")\n;#reitit.core.Match{:template \"/api/ns2/more/bar\", :data {:name :ns1/bar}, :result nil, :path-params {}, :path \"/api/ns2/more/bar\"}\n\nNotice the route name : :ns1/bar\nWhen we change the routes in ns1 like this :\n(ns ns1\n (:require [reitit.core :as r]))\n\n(def routes\n [\"/bar\" ::bar-with-new-name])\n\nAfter we recompile the ns1 namespace, and query again\nns1/routes\n;[\"/bar\" :ns1/bar-with-new-name]\n;The routes var in ns1 was changed indeed\n\n(r/match-by-path router \"/api/ns2/more/bar\")\n;#reitit.core.Match{:template \"/api/ns2/more/bar\", :data {:name :ns1/bar}, :result nil, :path-params {}, :path \"/api/ns2/more/bar\"}\n\nThe route name is still :ns1/bar !\nWhile we could use the reloaded workflow to reload the whole routing tree, it is not always possible, and quite frankly a bit slower than we might want for fast iterations.\nA crude solution\nIn order to see the changes without reloading the whole route tree, we can use functions.\n(ns ns1)\n\n(defn routes [] ;; Now a function !\n [\"/bar\" ::bar])\n\n(ns ns2)\n(require '[ns1])\n\n(defn routes [] ;; Now a function !\n [[\"/ping\" ::ping]\n [\"/more\" (ns1/routes)]]) ;; Now a function call\n\n(ns ns3)\n(require '[ns1])\n(require '[ns2])\n(require '[reitit.core :as r])\n\n(defn routes [] ;; Now a function !\n [\"/api\"\n [\"/ns2\" (ns2/routes)] ;; Now a function call\n [\"/ping\" ::ping]])\n\n(def router #(r/router (routes))) ;; Now a function\n\nLet's query again\n(r/match-by-path (router) \"/api/ns2/more/bar\") \n;#reitit.core.Match{:template \"/api/ns2/more/bar\", :data {:name :ns1/bar}, :result nil, :path-params {}, :path \"/api/ns2/more/bar\"}\n\nNotice that's we're now calling a function rather than just passing router to the matching function.\nNow let's again change the route name in ns1, and recompile that namespace.\n(ns ns1)\n\n(defn routes [] \n [\"/bar\" ::bar-with-new-name])\n\nlet's see the query result :\n(r/match-by-path (router) \"/api/ns2/more/bar\")\n;#reitit.core.Match{:template \"/api/ns2/more/bar\", :data {:name :ns1/bar-with-new-name}, :result nil, :path-params {}, :path \"/api/ns2/more/bar\"}\n\nNotice that the name is now correct, without reloading every namespace under the sun.\nWhy is this a crude solution ?\nThe astute reader will have noticed that we're recompiling the full routing tree on every invocation. While this solution is practical during development, it goes contrary to the performance goals of reitit.\nWe need a way to only do this once at production time.\nAn easy fix\nLet's apply a small change to our ns3. We'll replace our router by two different routers, one for dev and one for production.\n(ns ns3)\n(require '[ns1])\n(require '[ns2])\n(require '[reitit.core :as r])\n\n(defn routes [] \n [\"/api\"\n [\"/ns2\" (ns2/routes)] \n [\"/ping\" ::ping]])\n\n(def dev-router #(r/router (routes))) ;; A router for dev\n(def prod-router (constantly (r/router (routes)))) ;; A router for prod\n\nAnd there you have it, dynamic during dev, performance at production. We have it all !\n"},"advanced/shared_routes.html":{"url":"advanced/shared_routes.html","title":"Shared Routes","keywords":"","body":"Shared routes\nAs reitit-core works with both Clojure & ClojureScript, one can have a shared routing table for both the frontend and the backend application, using the Clojure Common Files.\nFor backend, you need to define a :handler for the request processing, for frontend, :name enables the use of reverse routing.\nThere are multiple options to use shared routing table.\nUsing reader conditionals\n;; define the handlers for clojure\n#?(:clj (declare get-kikka))\n#?(:clj (declare post-kikka))\n\n;; :name for both, :handler just for clojure\n(def routes\n [\"/kikka\"\n {:name ::kikka\n #?@(:clj [:get {:handler get-kikka}])\n #?@(:clj [:post {:handler post-kikka}])}])\n\nUsing custom expander\nraw-routes can have any non-sequential data as a route argument, which gets expanded using the :expand option given to the reitit.core.router function. It defaults to reitit.core/expand multimethod.\nFirst, define the common routes (in a .cljc file):\n(def routes\n [[\"/kikka\" ::kikka]\n [\"/bar\" ::bar]])\n\nThose can be used as-is from ClojureScript:\n(require '[reitit.core :as r])\n\n(def router\n (r/router routes))\n\n(r/match-by-name router ::kikka)\n;#Match{:template \"/kikka\"\n; :data {:name :user/kikka}\n; :result nil\n; :path-params nil\n; :path \"/kikka\"}\n\nFor the backend, we can use a custom-expander to expand the routes:\n(require '[reitit.ring :as ring])\n(require '[reitit.core :as r])\n\n(defn my-expand [registry]\n (fn [data opts]\n (if (keyword? data)\n (some-> data\n registry\n (r/expand opts)\n (assoc :name data))\n (r/expand data opts))))\n\n;; the handler functions\n(defn get-kikka [_] {:status 200, :body \"get\"})\n(defn post-kikka [_] {:status 200, :body \"post\"})\n(defn bar [_] {:status 200, :body \"bar\"})\n\n(def app\n (ring/ring-handler\n (ring/router\n [[\"/kikka\" ::kikka]\n [\"/bar\" ::bar]]\n ;; use a custom expander\n {:expand (my-expand\n {::kikka {:get get-kikka\n :post post-kikka}\n ::bar bar})})))\n\n(app {:request-method :post, :uri \"/kikka\"})\n; {:status 200, :body \"post\"}\n\n"},"performance.html":{"url":"performance.html","title":"Performance","keywords":"","body":"Performance\nReitit tries to be really, really fast.\n\nRationale\n\nMultiple routing algorithms, chosen based on the route tree\nRoute flattening and re-ordering\nManaged mutability over immutability\nPrecompute/compile as much as possible (matches, middleware, interceptors, routes, path-parameter sets)\nUse abstractions that enable JVM optimizations\nUse small functions to enable JVM Inlining\nUse Java where needed\nProtocols over Multimethods\nRecords over Maps\nAlways be measuring\nDon't trust the (micro-)benchmarks\n\nDoes routing performance matter?\nWell, it depends. With small route trees, it might not. But, with large (real-life) route trees, difference between the fastest and the slowest tested libs can be two or three orders of magnitude. For busy sites it actually matters if you routing request takes 100 ns or 100 µs. A lot.\nTechEmpower Web Framework Benchmarks\nReitit + jsonista + pohjavirta is one of the fastest JSON api stacks in the tests. See full results here.\n\nTests\nAll perf tests are found in the repo and have been run with the following setup:\n;;\n;; start repl with `lein perf repl`\n;; perf measured with the following setup:\n;;\n;; Model Name: MacBook Pro\n;; Model Identifier: MacBookPro11,3\n;; Processor Name: Intel Core i7\n;; Processor Speed: 2,5 GHz\n;; Number of Processors: 1\n;; Total Number of Cores: 4\n;; L2 Cache (per Core): 256 KB\n;; L3 Cache: 6 MB\n;; Memory: 16 GB\n;;\nNOTE: Tests are not scientific proof and may contain errors. You should always run the perf tests with your own (real-life) routing tables to get more accurate results for your use case. Also, if you have idea how to test things better, please let us know.\nSimple Example\nThe routing sample taken from bide README:\n(require '[reitit.core :as r])\n(require '[criterium.core :as cc])\n\n(def routes\n (r/router\n [[\"/auth/login\" :auth/login]\n [\"/auth/recovery/token/:token\" :auth/recovery]\n [\"/workspace/:project/:page\" :workspace/page]]))\n\n;; Execution time mean (per 1000) : 3.2 µs -> 312M ops/sec\n(cc/quick-bench\n (dotimes [_ 1000]\n (r/match-by-path routes \"/auth/login\")))\n\n;; Execution time mean (per 1000): 115 µs -> 8.7M ops/sec\n(cc/quick-bench\n (dotimes [_ 1000]\n (r/match-by-path routes \"/workspace/1/1\")))\n\nBased on the perf tests, the first (static path) lookup is 300-500x faster and the second (wildcard path) lookup is 18-110x faster that the other tested routing libs (Ataraxy, Bidi, Compojure and Pedestal).\nBut, the example is too simple for any real benchmark. Also, some of the libraries always match on the :request-method too and by doing so, do more work than just match by path. Compojure does most work also by invoking the handler.\nSo, we need to test something more realistic.\nRESTful apis\nTo get better view on the real life routing performance, there is test of a mid-size rest(ish) http api with 50+ routes, having a lot of path parameters. The route definitions are pulled off from the OpenSensors swagger definitions.\nThanks to the snappy Wildcard Trie (a modification of Radix Tree), reitit-ring is fastest here. Calfpath and Pedestal are also quite fast.\n\nCQRS apis\nAnother real-life test scenario is a CQRS style route tree, where all the paths are static, e.g. /api/command/add-order. The 300 route definitions are pulled out from Lupapiste.\nBoth reitit-ring and Pedestal shine in this test, thanks to the fast lookup-routers. On average, they are two and on best case, three orders of magnitude faster than the other tested libs. Ataraxy failed this test on Method code too large! error.\n\nNOTE: in real life, there are usually always also wild-card routes present. In this case, Pedestal would fallback from lookup-router to the prefix-tree router, which is order of magnitude slower (30x in this test). Reitit would handle this nicely thanks to it's :mixed-router: all static routes would still be served with :lookup-router, just the wildcard routes with :segment-tree. The performance would not notably degrade.\nPath conflicts\nTODO\nWhy measure?\nThe reitit routing perf is measured to get an internal baseline to optimize against. We also want to ensure that new features don't regress the performance. Perf tests should be run in a stable CI environment. Help welcome!\nLooking out of the box\nA quick poke to the fast routers in Go indicates that reitit is less than 50% slower than the fastest routers in Go. Which is kinda awesome.\nFaster!\nBy default, reitit.ring/ring-router, reitit.http/ring-router and reitit.http/routing-interceptor inject both Match and Router into the request. You can remove the injections setting options :inject-match? and :inject-router? to false. This saves some tens of nanos (with the hw described above).\n(require '[reitit.ring :as ring])\n(require '[criterium.core :as cc])\n\n(defn create [options]\n (ring/ring-handler\n (ring/router\n [\"/ping\" (constantly {:status 200, :body \"ok\"})])\n (ring/create-default-handler)\n options))\n\n;; 130ns\n(let [app (create nil)]\n (cc/quick-bench\n (app {:request-method :get, :uri \"/ping\"})))\n\n;; 80ns\n(let [app (create {:inject-router? false, :inject-match? false})]\n (cc/quick-bench\n (app {:request-method :get, :uri \"/ping\"})))\n\nNOTE: Without Router, you can't to do reverse routing and without Match you can't write dynamic extensions.\nPerformance tips\nFew things that have an effect on performance:\n\nWildcard-routes are an order of magnitude slower than static routes\nConflicting routes are served with LinearRouter, which is the slowest implementation.\nIt's ok to mix non-wildcard, wildcard or even conflicting routes in a same routing tree. Reitit will create an hierarchy of routers to serve all the routes with best possible implementation. \nMove computation from request processing time into creation time, using by compiling middleware, interceptors and route data.\nUnmounted middleware (or interceptor) is infinitely faster than a mounted one effectively doing nothing.\n\n\n\n"},"development.html":{"url":"development.html","title":"Development Instructions","keywords":"","body":"Development Instructions\nBuilding\n./scripts/lein-modules do clean, install\n\nRunning tests\n./scripts/test.sh clj\n./scripts/test.sh cljs\n\nDocumentation\nThe documentation is built with gitbook. To preview your changes locally:\nnpm install -g gitbook-cli\ngitbook install\ngitbook serve\n\nTo bump up version:\nWe use Break Versioning. Remember our promise: patch-level bumps never include breaking changes!\n# new version\n./scripts/set-version \"1.0.0\"\n./scripts/lein-modules install\n\n# works\nlein test\n\n# deploy to clojars\n./scripts/lein-modules do clean, deploy clojars\n\n"},"faq.html":{"url":"faq.html","title":"FAQ","keywords":"","body":"Frequently Asked Questions\n\nWhy yet another routing library?\nHow can I contribute?\nHow does Reitit differ from Bidi?\nHow does Reitit differ from Pedestal?\nHow does Reitit differ from Compojure?\nHow do you pronounce \"reitit\"?\n\nWhy yet another routing library?\nRouting and dispatching is in the core of most business apps, so we should have a great library to for it. There are already many good routing libs for Clojure, but we felt none was perfect. So, we took best parts of existing libs and added features that were missing: first-class composable route data, full route conflict resolution and pluggable coercion. Goal was to make a data-driven library that works, is fun to use and is really, really fast.\nHow can I contribute?\nYou can join #reitit channel in Clojurians slack to discuss things. Known roadmap is mostly written in issues.\nHow does Reitit differ from Bidi?\nBidi is an great and proven library for ClojureScript and we have been using it in many of our frontend projects. Both Reitit and Bidi are data-driven, bi-directional and work with both Clojure & ClojureScript. Here are the main differences:\nRoute syntax\n\nBidi supports multiple representations for route syntax, Reitit supports just one (simple) syntax.\nBidi uses special (Clojure) syntax for route patterns while Reitit separates (human-readable) paths strings from route data - still exposing the machine-readable syntax for extensions.\n\nBidi:\n(def routes\n [\"/\" [[\"auth/login\" :auth/login]\n [[\"auth/recovery/token/\" :token] :auth/recovery]\n [\"workspace/\" [[[:project-uuid \"/\" :page-uuid] :workspace/page]]]]])\n\nReitit:\n(def routes\n [[\"/auth/login\" :auth/login]\n [\"/auth/recovery/token/:token\" :auth/recovery]\n [\"/workspace/:project-uuid/:page-uuid\" :workspace/page]])\n\nFeatures\n\nBidi has extra features like route guards\nReitit ships with composable route data, specs, full route conflict resolution and pluggable coercion.\n\nPerformance\n\nBidi is not optimized for speed and thus, Reitit is much faster than Bidi. From Bidi source:\n\n;; Route compilation was only marginally effective and hard to\n;; debug. When bidi matching takes in the order of 30 micro-seconds,\n;; this is good enough in relation to the time taken to process the\n;; overall request.\n\nHow does Reitit differ from Pedestal?\nPedestal is an great and proven library and has had great influence in Reitit. Both Reitit and Pedestal are data-driven and provide bi-directional routing and fast. Here are the main differences:\nClojureScript\n\nPedestal targets only Clojure, while Reitit works also with ClojureScript.\n\nRoute syntax\n\nPedestal supports multiple representations for route syntax: terse, table and verbose. Reitit provides only one representation.\nPedestal supports both maps or keyword-arguments in route data, in Reitit, it's all maps.\n\nPedestal:\n[\"/api/ping\" :get identity :route-name ::ping]\n\nReitit:\n[\"/api/ping\" {:get identity, :name ::ping}]\n\nFeatures\n\nPedestal supports route guards\nPedestal supports interceptors (reitit-http module will support them too).\nReitit ships with composable route data, specs, full route conflict resolution and pluggable coercion.\nIn Pedestal, different routers behave differently, in Reitit, all work the same.\n\nPerformance\nReitit routing was originally based on Pedestal Routing an thus they same similar performance. For routing trees with both static and wildcard routes, Reitit is much faster thanks to it's mixed-router algorithm.\nHow does Reitit differ from Compojure?\nCompojure is the most used routing library in Clojure. It's proven and awesome.\nClojureScript\n\nCompojure targets only Clojure, while Reitit works also with ClojureScript.\n\nRoute syntax\n\nCompojure uses routing functions and macros while reitit is all data\nCompojure allows easy destructuring of route params on mid-path\nApplying middleware for sub-paths is hacky on Compojure, reitit-ring resolves this with data-driven middleware\n\nCompojure:\n(defroutes routes\n (wrap-routes\n (context \"/api\" []\n (GET \"/users/:id\" [id :\nreitit-ring with reitit-spec module:\n(def routes\n [\"/api\" {:middleware [[wrap-api :secure]]}\n [\"/users/:id\" {:get {:parameters {:path {:id int?}}}\n :handler (fn [{:keys [parameters]}]\n (ok (get-user (-> parameters :body :id))))}\n [\"/pizza\" {:post {:middleware [wrap-log]\n :handler post-pizza-handler}]]])\n\nFeatures\n\nDynamic routing is trivial in Compojure, with reitit, some trickery is needed\nReitit ships with composable route data, specs, full route conflict resolution and pluggable coercion.\n\nPerformance\nReitit is much faster than Compojure.\nHow do you pronounce \"reitit\"?\nGoogle Translate does a decent job pronouncing it (click the speaker icon on the left). The English expression rate it is a good approximation.\n"}}} \ No newline at end of file