diff --git a/compiling_middleware.html b/compiling_middleware.html new file mode 100644 index 00000000..6ab639ba --- /dev/null +++ b/compiling_middleware.html @@ -0,0 +1,475 @@ + + + + + + + Compiling middleware · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ +
+ + + + + + + + +
+
+ +
+
+ +
+ +

Compiling Middleware

+

The meta-data extensions are a easy way to extend the system. Routes meta-data can be transformed into any shape (records, functions etc.) in route compilation, enabling fast access at request-time.

+

Still, we can do better. As we know the exact route that interceptor/middleware is linked to, we can pass the (compiled) route information into the interceptor/middleware at creation-time. It can extract and transform relevant data just for it and pass it into the actual request-handler via a closure - yielding faster runtime processing.

+

To do this we use middleware records :gen hook instead of the normal :wrap. :gen expects a function of route-meta router-opts => wrap. Middleware can also return nil, which effective unmounts the middleware. Why mount a wrap-enforce-roles middleware for a route if there are no roles required for it?

+

To demonstrate the two approaches, below are response coercion middleware written as normal ring middleware function and as middleware record with :gen. These are the actual codes are from reitit.coercion:

+

Naive

+
    +
  • Extracts the compiled route information on every request.
  • +
+
(defn wrap-coerce-response
+  "Pluggable response coercion middleware.
+  Expects a :coercion of type `reitit.coercion.protocol/Coercion`
+  and :responses from route meta, otherwise does not mount."
+  [handler]
+  (fn
+    ([request]
+     (let [response (handler request)
+           method (:request-method request)
+           match (ring/get-match request)
+           responses (-> match :result method :meta :responses)
+           coercion (-> match :meta :coercion)
+           opts (-> match :meta :opts)]
+       (if (and coercion responses)
+         (let [coercers (response-coercers coercion responses opts)
+               coerced (coerce-response coercers request response)]
+           (coerce-response coercers request (handler request)))
+         (handler request))))
+    ([request respond raise]
+     (let [response (handler request)
+           method (:request-method request)
+           match (ring/get-match request)
+           responses (-> match :result method :meta :responses)
+           coercion (-> match :meta :coercion)
+           opts (-> match :meta :opts)]
+       (if (and coercion responses)
+         (let [coercers (response-coercers coercion responses opts)
+               coerced (coerce-response coercers request response)]
+           (handler request #(respond (coerce-response coercers request %))))
+         (handler request respond raise))))))
+
+

Compiled

+
    +
  • Route information is provided via a closure
  • +
  • Pre-compiled coercers
  • +
  • Mounts only if :coercion and :responses are defined for the route
  • +
+
(def gen-wrap-coerce-response
+  "Generator for pluggable response coercion middleware.
+  Expects a :coercion of type `reitit.coercion.protocol/Coercion`
+  and :responses from route meta, otherwise does not mount."
+  (middleware/create
+    {:name ::coerce-response
+     :gen (fn [{:keys [responses coercion opts]} _]
+            (if (and coercion responses)
+              (let [coercers (response-coercers coercion responses opts)]
+                (fn [handler]
+                  (fn
+                    ([request]
+                     (coerce-response coercers request (handler request)))
+                    ([request respond raise]
+                     (handler request #(respond (coerce-response coercers request %)) raise)))))))}))
+
+

The :gen -version has 50% less code, is easier to reason about and is 2-4x faster on basic perf tests.

+ + +
+ +
+
+
+ +

results matching ""

+
    + +
    +
    + +

    No results matching ""

    + +
    +
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configuring_routers.html b/configuring_routers.html new file mode 100644 index 00000000..187725a6 --- /dev/null +++ b/configuring_routers.html @@ -0,0 +1,450 @@ + + + + + + + Configuring routers · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
    + +
    + +
    + + + + + + + + +
    +
    + +
    +
    + +
    + +

    Configuring Routers

    +

    Routers can be configured via options. Options allow things like clojure.spec validation for meta-data and fast, compiled handlers. The following options are available for the reitit.core/router:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    keydescription
    :pathBase-path for routes
    :routesInitial resolved routes (default [])
    :metaInitial expanded route-meta vector (default [])
    :expandFunction of arg opts => meta to expand route arg to route meta-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
    :conflictsFunction of {route #{route}} => side-effect to handle conflicting routes (default reitit.core/throw-on-conflicts!)
    :routerFunction of routes opts => router to override the actual router implementation
    + + +
    + +
    +
    +
    + +

    results matching ""

    +
      + +
      +
      + +

      No results matching ""

      + +
      +
      +
      + +
      +
      + +
      + + + + + + + + + + +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitbook/fonts/fontawesome/FontAwesome.otf b/gitbook/fonts/fontawesome/FontAwesome.otf new file mode 100644 index 00000000..d4de13e8 Binary files /dev/null and b/gitbook/fonts/fontawesome/FontAwesome.otf differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.eot b/gitbook/fonts/fontawesome/fontawesome-webfont.eot new file mode 100644 index 00000000..c7b00d2b Binary files /dev/null and b/gitbook/fonts/fontawesome/fontawesome-webfont.eot differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.svg b/gitbook/fonts/fontawesome/fontawesome-webfont.svg new file mode 100644 index 00000000..8b66187f --- /dev/null +++ b/gitbook/fonts/fontawesome/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.ttf b/gitbook/fonts/fontawesome/fontawesome-webfont.ttf new file mode 100644 index 00000000..f221e50a Binary files /dev/null and b/gitbook/fonts/fontawesome/fontawesome-webfont.ttf differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.woff b/gitbook/fonts/fontawesome/fontawesome-webfont.woff new file mode 100644 index 00000000..6e7483cf Binary files /dev/null and b/gitbook/fonts/fontawesome/fontawesome-webfont.woff differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 b/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 new file mode 100644 index 00000000..7eb74fd1 Binary files /dev/null and b/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 differ diff --git a/gitbook/gitbook-plugin-editlink/plugin.js b/gitbook/gitbook-plugin-editlink/plugin.js new file mode 100644 index 00000000..e72c966b --- /dev/null +++ b/gitbook/gitbook-plugin-editlink/plugin.js @@ -0,0 +1,23 @@ +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 new file mode 100644 index 00000000..ff7be714 --- /dev/null +++ b/gitbook/gitbook-plugin-fontsettings/fontsettings.js @@ -0,0 +1,240 @@ +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 new file mode 100644 index 00000000..26591fe8 --- /dev/null +++ b/gitbook/gitbook-plugin-fontsettings/website.css @@ -0,0 +1,291 @@ +/* + * 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 new file mode 100644 index 00000000..14810ce0 --- /dev/null +++ b/gitbook/gitbook-plugin-github/plugin.js @@ -0,0 +1,14 @@ +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 new file mode 100644 index 00000000..cecaaab5 --- /dev/null +++ b/gitbook/gitbook-plugin-highlight/ebook.css @@ -0,0 +1,135 @@ +pre, +code { + /* http://jmblog.github.io/color-themes-for-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +pre .hljs-comment, +code .hljs-comment, +pre .hljs-title, +code .hljs-title { + color: #8e908c; +} +pre .hljs-variable, +code .hljs-variable, +pre .hljs-attribute, +code .hljs-attribute, +pre .hljs-tag, +code .hljs-tag, +pre .hljs-regexp, +code .hljs-regexp, +pre .hljs-deletion, +code .hljs-deletion, +pre .ruby .hljs-constant, +code .ruby .hljs-constant, +pre .xml .hljs-tag .hljs-title, +code .xml .hljs-tag .hljs-title, +pre .xml .hljs-pi, +code .xml .hljs-pi, +pre .xml .hljs-doctype, +code .xml .hljs-doctype, +pre .html .hljs-doctype, +code .html .hljs-doctype, +pre .css .hljs-id, +code .css .hljs-id, +pre .css .hljs-class, +code .css .hljs-class, +pre .css .hljs-pseudo, +code .css .hljs-pseudo { + color: #c82829; +} +pre .hljs-number, +code .hljs-number, +pre .hljs-preprocessor, +code .hljs-preprocessor, +pre .hljs-pragma, +code .hljs-pragma, +pre .hljs-built_in, +code .hljs-built_in, +pre .hljs-literal, +code .hljs-literal, +pre .hljs-params, +code .hljs-params, +pre .hljs-constant, +code .hljs-constant { + color: #f5871f; +} +pre .ruby .hljs-class .hljs-title, +code .ruby .hljs-class .hljs-title, +pre .css .hljs-rules .hljs-attribute, +code .css .hljs-rules .hljs-attribute { + color: #eab700; +} +pre .hljs-string, +code .hljs-string, +pre .hljs-value, +code .hljs-value, +pre .hljs-inheritance, +code .hljs-inheritance, +pre .hljs-header, +code .hljs-header, +pre .hljs-addition, +code .hljs-addition, +pre .ruby .hljs-symbol, +code .ruby .hljs-symbol, +pre .xml .hljs-cdata, +code .xml .hljs-cdata { + color: #718c00; +} +pre .css .hljs-hexcolor, +code .css .hljs-hexcolor { + color: #3e999f; +} +pre .hljs-function, +code .hljs-function, +pre .python .hljs-decorator, +code .python .hljs-decorator, +pre .python .hljs-title, +code .python .hljs-title, +pre .ruby .hljs-function .hljs-title, +code .ruby .hljs-function .hljs-title, +pre .ruby .hljs-title .hljs-keyword, +code .ruby .hljs-title .hljs-keyword, +pre .perl .hljs-sub, +code .perl .hljs-sub, +pre .javascript .hljs-title, +code .javascript .hljs-title, +pre .coffeescript .hljs-title, +code .coffeescript .hljs-title { + color: #4271ae; +} +pre .hljs-keyword, +code .hljs-keyword, +pre .javascript .hljs-function, +code .javascript .hljs-function { + color: #8959a8; +} +pre .hljs, +code .hljs { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} +pre .coffeescript .javascript, +code .coffeescript .javascript, +pre .javascript .xml, +code .javascript .xml, +pre .tex .hljs-formula, +code .tex .hljs-formula, +pre .xml .javascript, +code .xml .javascript, +pre .xml .vbscript, +code .xml .vbscript, +pre .xml .css, +code .xml .css, +pre .xml .hljs-cdata, +code .xml .hljs-cdata { + opacity: 0.5; +} diff --git a/gitbook/gitbook-plugin-highlight/website.css b/gitbook/gitbook-plugin-highlight/website.css new file mode 100644 index 00000000..6674448f --- /dev/null +++ b/gitbook/gitbook-plugin-highlight/website.css @@ -0,0 +1,434 @@ +.book .book-body .page-wrapper .page-inner section.normal pre, +.book .book-body .page-wrapper .page-inner section.normal code { + /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* 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-title, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-title { + 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-attribute, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.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-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, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { + 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-preprocessor, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.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-literal, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-literal, +.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-constant, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-constant { + color: #f5871f; +} +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .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-value, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-value, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-header, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-addition, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + color: #718c00; +} +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { + color: #3e999f; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, +.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, +.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, +.book .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { + 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 .javascript .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { + 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; + background: white; + color: #4d4d4c; + padding: 0.5em; +} +.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, +.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .xml, +.book .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, +.book .book-body .page-wrapper .page-inner section.normal code .xml .javascript, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, +.book .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .css, +.book .book-body .page-wrapper .page-inner section.normal code .xml .css, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + opacity: 0.5; +} +.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 { + /* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + /* Solarized Green */ + /* Solarized Cyan */ + /* Solarized Blue */ + /* Solarized Yellow */ + /* Solarized Orange */ + /* Solarized Red */ + /* Solarized Violet */ +} +.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; + 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-template_comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template_comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctype, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctype, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pi, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pi, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-javadoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-javadoc { + 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-winutils, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-winutils, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .method, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .method, +.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, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-tag, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-tag, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-request, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-request, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-status, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-status, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .nginx .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .nginx .hljs-title { + 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-command, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-command, +.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-tag .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-rules .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-rules .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-phpdoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-phpdoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.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, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-hexcolor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-hexcolor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_url, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_url { + 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-localvars, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-localvars, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-chunk, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-chunk, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-decorator, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-decorator, +.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-identifier, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-identifier, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .vhdl .hljs-literal, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .vhdl .hljs-literal, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-id, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-id, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-function, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-function { + 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-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 .lisp .hljs-body, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-body, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .smalltalk .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .smalltalk .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-constant, +.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-parent, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-parent, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .haskell .hljs-type, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .haskell .hljs-type, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_reference, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_reference { + color: #b58900; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-shebang, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-shebang, +.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-symbol .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-change, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-change, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-special, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-special, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr_selector, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr_selector, +.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-cdata, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-cdata, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .clojure .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .clojure .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-header { + color: #cb4b16; +} +.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, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-important, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-important { + color: #dc322f; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_label, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_label { + color: #6c71c4; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula { + background: #eee8d5; +} +.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 { + /* 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 Aqua */ + /* 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-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title { + 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-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.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-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, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { + 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-preprocessor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.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-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-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-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-constant { + color: #e78c45; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .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-value, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-value, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-header, +.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, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + color: #b9ca4a; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { + color: #70c0b1; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { + 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 .javascript .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { + 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; + background: black; + color: #eaeaea; + padding: 0.5em; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .xml, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .css, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .css, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + opacity: 0.5; +} diff --git a/gitbook/gitbook-plugin-lunr/lunr.min.js b/gitbook/gitbook-plugin-lunr/lunr.min.js new file mode 100644 index 00000000..6aa6bc7d --- /dev/null +++ b/gitbook/gitbook-plugin-lunr/lunr.min.js @@ -0,0 +1,7 @@ +/** + * 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 new file mode 100644 index 00000000..709a4e4c --- /dev/null +++ b/gitbook/gitbook-plugin-sharing/buttons.js @@ -0,0 +1,90 @@ +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 new file mode 100644 index 00000000..13077b45 --- /dev/null +++ b/gitbook/gitbook.js @@ -0,0 +1,4 @@ +!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(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/parameter_coercion.html b/parameter_coercion.html new file mode 100644 index 00000000..c8f0d803 --- /dev/null +++ b/parameter_coercion.html @@ -0,0 +1,488 @@ + + + + + + + Parameter coercion · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +
      + + + + + + + + +
      + +
      + +
      + + + + + + + + +
      +
      + +
      +
      + +
      + +

      Parameter coercion

      +

      Reitit provides pluggable parameter coercion via reitit.coercion.protocol/Coercion protocol, originally introduced in compojure-api. Reitit ships with reitit.coercion.spec/SpecCoercion providing implemenation for clojure.spec and data-specs.

      +

      NOTE: Before Clojure 1.9.0 is shipped, to use the spec-coercion, one needs to add the following dependencies manually to the project:

      +
      [org.clojure/clojure "1.9.0-alpha20"]
      +[org.clojure/spec.alpha "0.1.123"]
      +[metosin/spec-tools "0.3.3"]
      +
      +

      Ring request and response coercion

      +

      To use Coercion with Ring, one needs to do the following:

      +
        +
      1. Define parameters and responses as data into route meta-data, in format adopted from ring-swagger:
          +
        • :parameters map, with submaps for different parameters: :query, :body, :form, :header and :path. Parameters are defined in the format understood by the Coercion.
        • +
        • :responses map, with response status codes as keys (or :default for "everything else") with maps with :schema and optionally :description as values.
        • +
        +
      2. +
      3. Define a Coercion to route meta-data under :coercion
      4. +
      5. Mount request & response coercion middleware to the routes.
      6. +
      +

      If the request coercion succeeds, the coerced parameters are injected into request under :parameters.

      +

      If either request or response coercion fails, an descriptive error is thrown.

      +

      Example with data-specs

      +
      (require '[reitit.ring :as ring])
      +(require '[reitit.coercion :as coercion])
      +(require '[reitit.coercion.spec :as spec])
      +
      +(def app
      +  (ring/ring-handler
      +    (ring/router
      +      ["/api"
      +       ["/ping" {:parameters {:body {:x int?, :y int?}}
      +                 :responses {200 {:schema {:total pos-int?}}}
      +                 :get {:handler (fn [{{{:keys [x y]} :body} :parameters}]
      +                                  {:status 200
      +                                   :body {:total (+ x y)}})}}]]
      +      {:meta {:middleware [coercion/gen-wrap-coerce-parameters
      +                           coercion/gen-wrap-coerce-response]
      +              :coercion spec/coercion}})))
      +
      +
      (app
      +  {:request-method :get
      +   :uri "/api/ping"
      +   :body-params {:x 1, :y 2}})
      +; {:status 200, :body {:total 3}}
      +
      +

      Example with specs

      +
      (require '[reitit.ring :as ring])
      +(require '[reitit.coercion :as coercion])
      +(require '[reitit.coercion.spec :as spec])
      +(require '[clojure.spec.alpha :as s])
      +(require '[spec-tools.core :as st])
      +
      +(s/def ::x (st/spec int?))
      +(s/def ::y (st/spec int?))
      +(s/def ::total int?)
      +(s/def ::request (s/keys :req-un [::x ::y]))
      +(s/def ::response (s/keys :req-un [::total]))
      +
      +(def app
      +  (ring/ring-handler
      +    (ring/router
      +      ["/api"
      +       ["/ping" {:parameters {:body ::request}
      +                 :responses {200 {:schema ::response}}
      +                 :get {:handler (fn [{{{:keys [x y]} :body} :parameters}]
      +                                  {:status 200
      +                                   :body {:total (+ x y)}})}}]]
      +      {:meta {:middleware [coercion/gen-wrap-coerce-parameters
      +                           coercion/gen-wrap-coerce-response]
      +              :coercion spec/coercion}})))
      +
      +
      (app
      +  {:request-method :get
      +   :uri "/api/ping"
      +   :body-params {:x 1, :y 2}})
      +; {:status 200, :body {:total 3}}
      +
      + + +
      + +
      +
      +
      + +

      results matching ""

      +
        + +
        +
        + +

        No results matching ""

        + +
        +
        +
        + +
        +
        + +
        + + + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ring.html b/ring.html new file mode 100644 index 00000000..93686d54 --- /dev/null +++ b/ring.html @@ -0,0 +1,575 @@ + + + + + + + Ring support · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        + + + + + + + + +
        + +
        + +
        + + + + + + + + +
        +
        + +
        +
        + +
        + +

        Ring support

        +

        Ring-router adds support for ring concepts like handlers, middleware and routing based on :request-method. Ring-router is created with reitit.ring/router function. It runs a custom route compiler, creating a optimized stucture for handling route matches, with compiled middleware chain & handlers for all request methods. It also ensures that all routes have a :handler defined.

        +

        Simple Ring app:

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

        Applying the handler:

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

        The expanded routes:

        +
        (-> app (ring/get-router) (reitit/routes))
        +; [["/ping"
        +;   {:handler #object[...]}
        +;   #Methods{:any #Endpoint{:meta {:handler #object[...]},
        +;                           :handler #object[...],
        +;                           :middleware []}}]]
        +
        +

        Note that the compiled resuts as third element in the route vector.

        +

        Request-method based routing

        +

        Handler are also looked under request-method keys: :get, :head, :patch, :delete, :options, :post or :put. Top-level handler is used if request-method based handler is not found.

        +
        (def app
        +  (ring/ring-handler
        +    (ring/router
        +      ["/ping" {:name ::ping
        +                :get handler
        +                :post handler}])))
        +
        +(app {:request-method :get, :uri "/ping"})
        +; {:status 200, :body "ok"}
        +
        +(app {:request-method :put, :uri "/ping"})
        +; nil
        +
        +

        Reverse routing:

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

        Middleware

        +

        Middleware can be added with a :middleware key, with a vector value of the following:

        +
          +
        1. ring middleware function handler -> request -> response
        2. +
        3. vector of middleware function handler ?args -> request -> response and optinally it's args.
        4. +
        +

        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
        +      ["/api" {:middleware [#(wrap % :api)]}
        +       ["/ping" handler]
        +       ["/admin" {:middleware [[wrap :admin]]}
        +        ["/db" {:middleware [[wrap :db]]
        +                :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]}
        +
        +

        Middleware Records

        +

        Reitit supports first-class data-driven middleware via reitit.middleware/Middleware records, created with reitit.middleware/create function. The following keys have special purpose:

        + + + + + + + + + + + + + + + + + + + + + +
        keydescription
        :nameName of the middleware as qualified keyword (optional,recommended for libs)
        :wrapThe actual middleware function of handler args? => request => response
        :genMiddleware compile function, see compiling middleware.
        +

        When routes are compiled, all middleware are expanded (and optionally compiled) into Middleware and stored in compilation results for later use (api-docs etc). For actual request processing, they are unwrapped into normal middleware functions producing zero runtime performance penalty. Middleware expansion is backed by reitit.middleware/IntoMiddleware protocol, enabling plain clojure(script) maps to be used.

        +

        A Record:

        +
        (require '[reitit.middleware :as middleware])
        +
        +(def wrap2
        +  (middleware/create
        +    {:name ::wrap2
        +     :description "a nice little mw, takes 1 arg."
        +     :wrap wrap}))
        +
        +

        As plain map:

        +
        ;; plain map
        +(def wrap3
        +  {:name ::wrap3
        +   :description "a nice little mw, :api as arg"
        +   :wrap (fn [handler]
        +           (wrap handler :api))})
        +
        +

        Async Ring

        +

        All built-in middleware provide both 2 and 3-arity and are compiled for both Clojure & ClojureScript, so they work with Async Ring and Node.js too.

        +

        Meta-data based 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 dynamic extensions to the system.

        +

        Example middleware to guard routes based on user roles:

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

        Mounted to an app via router meta-data (effecting all routes):

        +
        (def handler (constantly {:status 200, :body "ok"}))
        +
        +(def app
        +  (ring/ring-handler
        +    (ring/router
        +      [["/api"
        +        ["/ping" handler]
        +        ["/admin" {::roles #{:admin}}
        +         ["/ping" handler]]]]
        +      {:meta {: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", ::roles #{:admin}})
        +; {:status 200, :body "ok"}
        +
        + + +
        + +
        +
        +
        + +

        results matching ""

        +
          + +
          +
          + +

          No results matching ""

          + +
          +
          +
          + +
          +
          + +
          + + + + + + + + + + + + + + +
          + + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/routing/route_conflicts.html b/routing/route_conflicts.html new file mode 100644 index 00000000..cc067c94 --- /dev/null +++ b/routing/route_conflicts.html @@ -0,0 +1,433 @@ + + + + + + + Route conflicts · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          + + + + + + + + +
          + +
          + +
          + + + + + + + + +
          +
          + +
          +
          + +
          + +

          Route conflicts

          +

          Route trees should not have multiple routes that match to a single (request) path. router checks the route tree at creation for conflicts and calls a registered :conflicts option callback with the found conflicts. Default implementation throws ex-info with a descriptive message.

          +
          (reitit/router
          +  [["/ping"]
          +   ["/:user-id/orders"]
          +   ["/bulk/:bulk-id"]
          +   ["/public/*path"]
          +   ["/:version/status"]])
          +; CompilerException clojure.lang.ExceptionInfo: router contains conflicting routes:
          +;
          +;    /:user-id/orders
          +; -> /public/*path
          +; -> /bulk/:bulk-id
          +;
          +;    /bulk/:bulk-id
          +; -> /:version/status
          +;
          +;    /public/*path
          +; -> /:version/status
          +;
          +
          + + +
          + +
          +
          +
          + +

          results matching ""

          +
            + +
            +
            + +

            No results matching ""

            + +
            +
            +
            + +
            +
            + +
            + + + + + + + + + + + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/routing/route_metadata.html b/routing/route_metadata.html new file mode 100644 index 00000000..cd7d51c4 --- /dev/null +++ b/routing/route_metadata.html @@ -0,0 +1,455 @@ + + + + + + + Route metadata · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            +
            + + + + + + + + +
            + +
            + +
            + + + + + + + + +
            +
            + +
            +
            + +
            + +

            Route meta-data

            +

            Routes can have arbitrary meta-data. For nested routes, the meta-data is accumulated from root towards leafs using meta-merge.

            +

            A router based on nested route tree:

            +
            (def router
            +  (reitit/router
            +    ["/api" {:interceptors [::api]}
            +     ["/ping" ::ping]
            +     ["/admin" {:roles #{:admin}}
            +      ["/users" ::users]
            +      ["/db" {:interceptors [::db]
            +              :roles ^:replace #{:db-admin}}
            +       ["/:db" {:parameters {:db String}}
            +        ["/drop" ::drop-db]
            +        ["/stats" ::db-stats]]]]]))
            +
            +

            Resolved route tree:

            +
            (reitit/routes router)
            +; [["/api/ping" {:interceptors [::api]
            +;                :name ::ping}]
            +;  ["/api/admin/users" {:interceptors [::api]
            +;                       :roles #{:admin}
            +;                       :name ::users}]
            +;  ["/api/admin/db/:db/drop" {:interceptors [::api ::db]
            +;                             :roles #{:db-admin}
            +;                             :parameters {:db String}
            +;                             :name ::drop-db}]
            +;  ["/api/admin/db/:db/stats" {:interceptors [::api ::db]
            +;                              :roles #{:db-admin}
            +;                              :parameters {:db String}
            +;                              :name ::db-stats}]]
            +
            +

            Path-based routing:

            +
            (reitit/match-by-path router "/api/admin/users")
            +; #Match{:template "/api/admin/users"
            +;        :meta {:interceptors [::api]
            +;               :roles #{:admin}
            +;               :name ::users}
            +;        :result nil
            +;        :params {}
            +;        :path "/api/admin/users"}
            +
            +

            On match, route meta-data is returned and can interpreted by the application.

            +

            Routers also support meta-data compilation enabling things like fast Ring or Pedestal -style handlers. Compilation results are found under :result in the match. See configuring routers for details.

            + + +
            + +
            +
            +
            + +

            results matching ""

            +
              + +
              +
              + +

              No results matching ""

              + +
              +
              +
              + +
              +
              + +
              + + + + + + + + + + + + + + +
              + + +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/routing/route_syntax.html b/routing/route_syntax.html new file mode 100644 index 00000000..da5c2b14 --- /dev/null +++ b/routing/route_syntax.html @@ -0,0 +1,435 @@ + + + + + + + Route syntax · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              +
              + + + + + + + + +
              + +
              + +
              + + + + + + + + +
              +
              + +
              +
              + +
              + +

              Route Syntax

              +

              Routes are defined as vectors, which String path, optional (non-vector) route argument and optional child routes. Routes can be wrapped in vectors.

              +

              Simple route:

              +
              ["/ping"]
              +
              +

              Two routes:

              +
              [["/ping"]
              + ["/pong"]]
              +
              +

              Routes with meta-data:

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

              Routes with path and catch-all parameters:

              +
              [["/users/:user-id"]
              + ["/public/*path"]]
              +
              +

              Nested routes with meta-data:

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

              Same routes flattened:

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

              results matching ""

              +
                + +
                +
                + +

                No results matching ""

                + +
                +
                +
                + +
                +
                + +
                + + + + + + + + + + +
                + + +
                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/routing/routers.html b/routing/routers.html new file mode 100644 index 00000000..2d55f793 --- /dev/null +++ b/routing/routers.html @@ -0,0 +1,471 @@ + + + + + + + Routers · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                +
                + + + + + + + + +
                + +
                + +
                + + + + + + + + +
                +
                + +
                +
                + +
                + +

                Routers

                +

                For routing, a Router is needed. Reitit ships with several different router implementations: :linear-router, :lookup-router and :mixed-router, based on the awesome Pedestal implementation.

                +

                Router is created with reitit.core/router, which takes routes and optional options map as arguments. The route tree gets expanded, optionally coerced and compiled. Actual Router implementation is selected automatically but can be defined with a :router option. Router support both path- and name-based lookups.

                +

                Creating a router:

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

                :mixed-router is created (both static & wild routes are found):

                +
                (reitit/router-name router)
                +; :mixed-router
                +
                +

                The expanded routes:

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

                Route names:

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

                Path-based routing

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

                Name-based (reverse) routing

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

                Only a partial match. Let's provide the path-parameters:

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

                There is also a exception throwing version:

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

                results matching ""

                +
                  + +
                  +
                  + +

                  No results matching ""

                  + +
                  +
                  +
                  + +
                  +
                  + +
                  + + + + + + + + + + + + + + +
                  + + +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/search_index.json b/search_index.json new file mode 100644 index 00000000..41bee4a8 --- /dev/null +++ b/search_index.json @@ -0,0 +1 @@ +{"index":{"version":"0.5.12","fields":[{"name":"title","boost":10},{"name":"keywords","boost":15},{"name":"body","boost":1}],"ref":"url","documentStore":{"store":{"./":["&","(clojure.spec)","both","class","clojure(script).","coercion","conflict","data","driven","extend","fast","first","friendli","generic,","http","interceptor","introduct","latest","meta","middlewar","pluggabl","reitit","resolut","rout","router","simpl","syntax","ti","version"],"routing/route_syntax.html":["(non","::db]","::db}","::ping]","::ping]]","::pong}]]","::user]","::user}",":name","[\"/admin\"","[\"/api\"","[\"/api/admin/db\"","[\"/api/ping\"","[\"/db\"","[\"/ping\"","[\"/ping\"]","[\"/pong\"","[\"/pong\"]]","[\"/public/*path\"]]","[\"/user\"","[::admin],","[::admin]}","[[\"/api/admin/user\"","[[\"/ping\"","[[\"/ping\"]","[[\"/users/:us","argument","catch","child","data:","defin","flattened:","id\"]","meta","nest","option","parameters:","path","path,","rout","route:","routes.","routes:","same","simpl","string","syntax","two","vector)","vectors,","vectors.","wrap","{:middlewar","{:name"],"routing/routers.html":["\"/api/user/1\"","\"/api/user/1\")","\"/api/user/:id\"","\"/api/user/:id\",","\"/hello\")","\"1\"})","\"1\"}}","#match{:templ","#partialmatch{:templ","#{:id}","#{:id}}","&","'[reitit.cor","(both","(def","(reitit/match","(reitit/parti","(reitit/rout","(requir","(reverse)","/api/user/:id:","::ping]","::user","::user)","::user))","::user]]]))",":a",":linear",":lookup",":meta",":mix",":param",":path",":requir",":result",":router",":user/ping}]",":user/user]",":user/user}",":user/user},",":user/user}]]",";","[\"/api/user/:id\"","[\"/ping\"","[\"/user/:id\"","[:user/p","[[\"/api\"","[[\"/api/ping\"","actual","arguments.","automat","awesom","base","both","coerc","compiled.","creat","defin","differ","except","exceptioninfo","expand","expanded,","found):","get","implement","implementation.","implementations:","let'","lookups.","map","match.","match?","miss","name","name!","names:","needed.","nil","nil,","option","option.","param","parameters:","partial","path","pedest","provid","reitit","reitit.core/router,","reitit])","rout","router","router)","router,","router:","routes:","routing,","select","sever","ship","static","support","take","throw","tree","true","version:","wild","{:id","{:name"],"routing/route_metadata.html":["\"/api/admin/users\"","\"/api/admin/users\")","\"/api/admin/users\"}","#match{:templ","#{:admin}","#{:admin}}","#{:db","(def","(reitit/match","(reitit/rout","::db","::db]","::drop","::ping]","::ping}]","::users]","::users}","::users}]",":meta",":name",":param",":paramet",":path",":result",":role",";","[\"/:db\"","[\"/admin\"","[\"/api\"","[\"/api/admin/db/:db/drop\"","[\"/api/admin/db/:db/stats\"","[\"/api/admin/users\"","[\"/db\"","[\"/drop\"","[\"/ping\"","[\"/stats\"","[\"/users\"","[::api","[::api]","[::api]}","[::db]","[[\"/api/ping\"","^:replac","accumul","admin}","admin}}","application.","arbitrari","base","compil","configur","data","data.","db]","db}]","details.","enabl","fast","found","handlers.","interpret","leaf","match,","match.","merge.","meta","metadata","nest","nil","path","pedest","resolv","result","return","ring","root","rout","router","router)","routes,","routing:","see","stats]]]]]))","stats}]]","string}","string}}","style","support","thing","toward","tree:","under","us","{:db","{:interceptor","{:paramet","{:role","{}"],"routing/route_conflicts.html":["(reitit/rout","(request)","/:user","/:version/statu","/bulk/:bulk","/public/*path",":conflict",";",">","[\"/:user","[\"/:version/status\"]])","[\"/bulk/:bulk","[\"/public/*path\"]","[[\"/ping\"]","call","callback","check","clojure.lang.exceptioninfo:","compilerexcept","conflict","conflicts.","contain","creation","default","descript","ex","found","id","id\"]","id/ord","id/orders\"]","implement","info","match","message.","multipl","option","path.","regist","rout","router","routes:","singl","throw","tree"],"ring.html":["\"/api/admin/db\"})","\"/api/admin/ping\",","\"/api/admin/ping\"})","\"/api/ping\"})","\"/favicon.ico\"})","\"/ping\"","\"/ping\"})","\"a","\"forbidden\"}","\"ok\"}","\"ok\"})","\"ok\"}))","#endpoint{:meta","#methods{:ani","#object[...],","#object[...]}","#object[...]},","#{:admin}}","#{:admin}})","%","&","'[clojure.set","'[reitit.middlewar","'[reitit.r","(","(and","(api","(app","(conj","(constantli","(def","(defn","(effect","(fn","(fnil","(handler","(if","(let","(middleware/cr","(not","(optional,recommend","(reitit/match","(reitit/routes))","(requir","(ring/get","(ring/r","(ring/rout","(seq","(set/intersect","(some","(updat","(wrap","1","2","200,","3","403,","::acc","::ping","::ping)","::role","::roles)]","::wrap2","::wrap3",":a",":admin",":admin]]}",":api",":api))})",":api)]}",":bodi",":db",":db]]",":delet",":delete)]",":delete,",":descript",":gen",":get",":get,",":handler",":handler)})",":handler]}",":head,",":meta",":middlewar",":name",":options,",":patch,",":path)",":post",":put,",":put.",":request",":uri",":wrap",";",";;","=>",">","?arg","[\"/admin\"","[\"/api\"","[\"/db\"","[\"/ping\"","[#(wrap","[::acc]}]","[::roles]","[:api","[[\"/api\"","[[\"/ping\"","[[wrap","[])","[]}}]]","[_]","[handler","[handler]","[request]","[requir","[wrap","[{:key","acc","access","actual","ad","add","anonym","app","app:","appli","arg\"","arg.\"","args.","args?","ariti","async","author","back","base","both","build","built","chain","class","clojur","clojure(script)","clojurescript,","compil","compiled)","compiled,","compiler,","concept","conj","correctly:","creat","custom","data","defined.","descript","doc","driven","dynam","element","enabl","enforc","ensur","etc).","exampl","expand","expans","extens","extract","first","follow","following:","found.","function","function,","function.","guard","handl","handler","handler:","handler]","handler])))","handler]]]]","handlers,","handler}])))","handler}}]]])))","id))))","id]","inject","it'","key","key,","keys:","keyword","later","level","libs)","littl","look","map","map:","match","match)","match.","matches,","meta","method","method.","methods.","middlewar","middleware.","middleware:","middleware])","mount","mw,","name","nest","nice","nil","node.j","normal","note","optim","optin","option","penalty.","perform","plain","processing,","produc","protocol,","provid","public","purpose:","qualifi","record","record:","records,","reitit","reitit.middleware/cr","reitit.middleware/intomiddlewar","reitit.middleware/middlewar","reitit.ring/get","reitit.ring/rout","request","request)))))","request}]","requir","required)","respons","result","resut","revers","ring","ring])","role","roles)))","roles:","roles]}})))","rout","route:","router","router)","routes):","routes:","routing:","run","runtim","see","set])","simpl","special","store","stuctur","support","system.","take","third","too.","top","under","unwrap","us","used.","user","valu","vector","vector.","via","work","wrap","wrap2","wrap3","wrap}))","zero","{::role","{:handler","{:meta","{:middlewar","{:name","{:request","{:statu"],"parameter_coercion.html":["\"/api/ping\"","\"0.1.123\"]","\"0.3.3\"]","\"1.9.0","\"everyth","&","'[clojure.spec.alpha","'[reitit.coercion","'[reitit.coercion.spec","'[reitit.r","'[spec","(+","(app","(def","(fn","(or","(requir","(ring/r","(ring/rout","(s/def","(s/key","(st/spec","1,","1.9.0","200","200,","2}})","3}}","::i","::request","::request}","::respons","::response}}","::total","::x","::y]))",":a",":bodi",":body,",":body}",":coercion",":default",":descript",":form,",":get",":header",":paramet",":parameters.",":parameters}]",":path.",":query,",":req",":respons",":schema",":uri",":y",";","[\"/api\"","[\"/ping\"","[::total]))","[::x","[coercion/gen","[metosin/spec","[org.clojure/clojur","[org.clojure/spec.alpha","[x","[{{{:key","add","adopt","alpha20\"]","api.","app","befor","clojur","clojure.spec","code","coerc","coercion","coercion,","coercion.","coercion/gen","coercion])","compojur","data","data,","defin","depend","descript","differ","else\")","error","exampl","fails,","follow","following:","format","handler","implemen","inject","int?)","int?))","int?,","int?}}","int?}}}","introduc","key","manual","map","map,","meta","method","middlewar","mount","need","note:","on","option","origin","param","paramet","parameters:","pluggabl","po","project:","protocol,","provid","reitit","reitit.coercion.protocol/coercion","reitit.coercion.spec/speccoercion","request","respons","response]","ring","ring,","ring])","rout","routes.","s])","ship","shipped,","spec","spec/coercion}})))","spec])","specs.","st])","statu","submap","succeeds,","swagger:","thrown.","tool","tools.cor","un","under","understood","us","values.","via","wrap","x","y)}})}}]]","y]}","{200","{:bodi","{:handler","{:meta","{:middlewar","{:paramet","{:request","{:schema","{:statu","{:total","{:x"],"compiling_middleware.html":["\"gener","\"pluggabl","#(respond","%))","%))))","(","(:request","([request","([request]","(and","(coerc","(compiled)","(def","(defn","(fn","(handler","(if","(let","(middleware/cr","(records,","(respons","(ring/get","2","4x","50%","::coerc",":coercion",":coercion)",":gen",":gen.",":meta",":opts)]",":respons",":responses)",":result",":wrap.","=>",">","[coercer","[handler]","[respons","[{:key","_]","`reitit.coercion.protocol/coercion`","access","actual","approaches,","basic","below","better.","closur","code","code,","coerc","coercer","coercion","compil","compilation,","creation","data","defin","demonstr","easi","easier","effect","enabl","enforc","etc.)","exact","expect","extend","extens","extract","fast","faster","function","gen","handler","hook","inform","instead","interceptor/middlewar","it?","know","less","link","match","meta","meta,","method","middlewar","middleware.","mount","mount.\"","naiv","nil,","normal","opt","opts)","opts)]","opts]}","otherwis","pass","perf","pluggabl","pre","processing.","provid","raise))))))","raise)))))))}))","raise]","reason","record","reitit.coercion:","relev","request","request)","request)))","request))))","request.","requir","respond","respons","response)]","responses)","return","ring","role","rout","router","runtim","shape","still,","system.","tests.","time.","to,","transform","two","type","unmount","us","version","via","way","wrap","wrap.","written","yield","{:name"],"validating.html":["\"/\"))","\"/\")))","\"0.3.0\"]","%","&","'[clojure.spec.alpha","'[clojure.spec.test.alpha","'[expound.alpha","'[reitit.spec])","(clojure.core/fn","(clojure.spec.alpha/*","(clojure.spec.alpha/?","(clojure.spec.alpha/and","(clojure.spec.alpha/cat","(clojure.spec.alpha/col","(clojure.spec.alpha/or","(clojure.string/start","(fn","(reitit/rout","(requir","(set!","(st/instrument","...","...]","2",":a",":arg",":child",":into",":path",":reitit.spec/arg)",":reitit.spec/path",":reitit.spec/path:",":reitit.spec/raw",":rout",";","[\"/api\"","[\"/ping\"]","[\"/publuc\"","[\"pong\"]]]","[\"pong\"]]])","[%]","[...","[]))","[expound","^^^^^^","`reitit/router)","add","clojure.core/string?","contain","data","dependencies:","detect","develop","enabl","error","expound/printer)","expound])","fail","following:","input","meta","namespac","on","options.","out*","output","reitit.spec","relev","rout","route)))","route:","router","routes,","routes:","s/*explain","s])","satisfi","spec","st])","time,","todo","tree","valid","with?"],"configuring_routers.html":["#{route}}","(default",":coerc",":compil",":conflict",":expand",":meta",":path",":rout",":router","=>","[])","actual","allow","arg","avail","base","clojure.spec","coerc","compil","configur","conflict","conflicts!)","data","descript","effect","expand","fast,","follow","function","handl","handler","handlers.","implement","initi","key","meta","nil","opt","option","options.","overrid","path","reitit.core/expand)","reitit.core/router:","reitit.core/throw","resolv","result","return","rout","route,","router","side","thing","throw","valid","vector","via","{rout"]},"length":10},"tokenStore":{"root":{"1":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}},".":{"9":{"docs":{},".":{"0":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},"docs":{}}},"docs":{}}},"2":{"0":{"0":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.015437392795883362},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}},"docs":{}},"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}},"}":{"docs":{},"}":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}},"3":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"}":{"docs":{},"}":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}},"4":{"0":{"3":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}},"docs":{}},"docs":{},"x":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}},"5":{"0":{"docs":{},"%":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}},"docs":{}},"docs":{},"&":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}},"(":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.01764705882352941}},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.029411764705882353}}},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{},"/":{"docs":{},"*":{"docs":{"validating.html":{"ref":"validating.html","tf":0.013761467889908258}}},"?":{"docs":{"validating.html":{"ref":"validating.html","tf":0.013761467889908258}}},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"validating.html":{"ref":"validating.html","tf":0.01834862385321101}}}}},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{"validating.html":{"ref":"validating.html","tf":0.013761467889908258}}}},"o":{"docs":{},"l":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}}},"o":{"docs":{},"r":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}}}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"f":{"docs":{},"n":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"j":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"l":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.01764705882352941}}}}},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"d":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}}}},"n":{"docs":{},"o":{"docs":{},"n":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"b":{"docs":{},"o":{"docs":{},"t":{"docs":{},"h":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.012006861063464836},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},"n":{"docs":{"ring.html":{"ref":"ring.html","tf":0.00686106346483705},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.04081632653061224}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},"/":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.02912621359223301},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"i":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.019417475728155338},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}}},"q":{"docs":{},"u":{"docs":{},"i":{"docs":{},"r":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.02572347266881029},"validating.html":{"ref":"validating.html","tf":0.01834862385321101}}}},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},")":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},")":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"s":{"docs":{},",":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.00686106346483705},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.00686106346483705},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}}}},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}}},"p":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"p":{"docs":{"ring.html":{"ref":"ring.html","tf":0.015437392795883362},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}},"e":{"docs":{},"f":{"docs":{},"f":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"f":{"docs":{},"n":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.011764705882352941},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}},"i":{"docs":{},"l":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.023529411764705882}}}}}}}}},"i":{"docs":{},"f":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}}},"l":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.014705882352941176}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}}}}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},",":{"docs":{},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}}}}}}},"r":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}},"s":{"docs":{},"e":{"docs":{},"q":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"t":{"docs":{},"/":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}},"!":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"/":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.01607717041800643}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}},"t":{"docs":{},"/":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}}}}},"u":{"docs":{},"p":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"+":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}},":":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}}},"[":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}},"]":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}}}}},"b":{"docs":{},"o":{"docs":{},"t":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.019417475728155338},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617},"ring.html":{"ref":"ring.html","tf":0.008576329331046312},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}},"i":{"docs":{},"c":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}},"c":{"docs":{},"k":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"e":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}},"c":{"docs":{},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"e":{"docs":{},"(":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},".":{"docs":{"./":{"ref":"./","tf":0.029411764705882353}}}}}}}}}}},".":{"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":{},"i":{"docs":{},"n":{"docs":{},"f":{"docs":{},"o":{"docs":{},":":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"?":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}}}}},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}},"s":{"docs":{},"u":{"docs":{},"r":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.01607717041800643},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.011764705882352941},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":5.02572347266881},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.03529411764705882}},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},".":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},"/":{"docs":{},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}},"]":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}},"e":{"docs":{},"r":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.029411764705882353}}}}}}},"n":{"docs":{},"f":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":5.042857142857143},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},"s":{"docs":{},".":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}},"!":{"docs":{},")":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}}},"i":{"docs":{},"g":{"docs":{},"u":{"docs":{},"r":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"configuring_routers.html":{"ref":"configuring_routers.html","tf":5.020408163265306}}}}}}},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"j":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617},"ring.html":{"ref":"ring.html","tf":0.010291595197255575},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":5.011764705882353},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.02040816326530612}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"r":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},",":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}}},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"r":{"docs":{},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"l":{"docs":{},"y":{"docs":{},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}},"d":{"docs":{},"e":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},",":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}},"l":{"docs":{},"l":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}}},"h":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.014563106796116505},"ring.html":{"ref":"ring.html","tf":0.005145797598627788}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.08823529411764706},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.023952095808383235},"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.012861736334405145},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.02040816326530612}},":":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.028985507246376812}}},".":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}},"r":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.058823529411764705},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"e":{"docs":{},"f":{"docs":{},"i":{"docs":{},"n":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.00964630225080386},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},"s":{"docs":{},".":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},":":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}}},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}},"v":{"docs":{},"e":{"docs":{},"l":{"docs":{},"o":{"docs":{},"p":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}},"i":{"docs":{},"f":{"docs":{},"f":{"docs":{},"e":{"docs":{},"r":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"b":{"docs":{},"]":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}},"}":{"docs":{},"]":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}},"o":{"docs":{},"c":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"y":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"e":{"docs":{},"x":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}},"s":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"i":{"docs":{},"n":{"docs":{},"f":{"docs":{},"o":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.02040816326530612}},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}},"s":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}}}},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"/":{"docs":{},"p":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}},"]":{"docs":{},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}},"c":{"docs":{},"t":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"n":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"c":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"s":{"docs":{},"u":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"s":{"docs":{},"e":{"docs":{},"\"":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"t":{"docs":{},"c":{"docs":{},")":{"docs":{},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},".":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}},"a":{"docs":{},"s":{"docs":{},"i":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},"e":{"docs":{},"r":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"f":{"docs":{},"f":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}},"f":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},"e":{"docs":{},"r":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}},",":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}},"i":{"docs":{},"l":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}},"s":{"docs":{},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"i":{"docs":{},"r":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.029411764705882353}}}}}}}}},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}}}}}}}},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}},")":{"docs":{},":":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"ring.html":{"ref":"ring.html","tf":0.00686106346483705},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.05102040816326531}},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{},"c":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.029411764705882353}}}}}}}},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}},"u":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.029411764705882353}}}}},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},"e":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.029159519725557463},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},"s":{"docs":{},".":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"]":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"}":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}}}},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.029411764705882353}},"/":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}}}}}}}}}}},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"t":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}},"r":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"t":{"docs":{"./":{"ref":"./","tf":10}}}}}}}},"?":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},"}":{"docs":{},"}":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"}":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"f":{"docs":{},"o":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}},"r":{"docs":{},"m":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}}}}},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"p":{"docs":{},"u":{"docs":{},"t":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.02040816326530612}}}}}},"d":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.02857142857142857}},"\"":{"docs":{},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}},"/":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{},"]":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}}}}},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},"s":{"docs":{},":":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}}}}}}}}}},"t":{"docs":{},"'":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"?":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.029411764705882353}}}},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"e":{"docs":{},"t":{"docs":{},"'":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}},"a":{"docs":{},"f":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}},"v":{"docs":{},"e":{"docs":{},"l":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"s":{"docs":{},"s":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"u":{"docs":{},"p":{"docs":{},"s":{"docs":{},".":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}},"i":{"docs":{},"b":{"docs":{},"s":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"t":{"docs":{},"t":{"docs":{},"l":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}},"n":{"docs":{},"k":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.028985507246376812},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.03592814371257485},"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.04081632653061224}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":5}}}}}},",":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.02058319039451115},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.01764705882352941}},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"s":{"docs":{},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"r":{"docs":{},"g":{"docs":{},"e":{"docs":{},".":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},".":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}}},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"ring.html":{"ref":"ring.html","tf":0.032590051457975985},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":5.020588235294118}},"e":{"docs":{},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"]":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}},"s":{"docs":{},"s":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}},"a":{"docs":{},"p":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.029411764705882353}},".":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"?":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},",":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"e":{"docs":{},"s":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"n":{"docs":{},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"l":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}},".":{"docs":{},"\"":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}},"w":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}},"p":{"docs":{},"l":{"docs":{},"u":{"docs":{},"g":{"docs":{},"g":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788}}}}}},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},"e":{"docs":{},"t":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":5.022508038585209}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},":":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}}},"t":{"docs":{},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}},"t":{"docs":{},"h":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/routers.html":{"ref":"routing/routers.html","tf":0.02912621359223301},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},",":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}},".":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}},"s":{"docs":{},"s":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"t":{"docs":{},"y":{"docs":{},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"r":{"docs":{},"f":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"r":{"docs":{},"o":{"docs":{},"v":{"docs":{},"i":{"docs":{},"d":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},".":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}}},"d":{"docs":{},"u":{"docs":{},"c":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"t":{"docs":{},"o":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},":":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"e":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"r":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}},"o":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.058823529411764705},"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},":":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}}},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},")":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}}},"t":{"docs":{},"h":{"docs":{},"r":{"docs":{},"o":{"docs":{},"w":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"t":{"docs":{},"o":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"/":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}}}}}}}}}}}}},":":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"c":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"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.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"/":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}},"]":{"docs":{},")":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}},"s":{"docs":{},"o":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.029411764705882353}}}},"v":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.02040816326530612}}}}},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.01607717041800643},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.05}},"e":{"docs":{},"]":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}},")":{"docs":{},"]":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}},"s":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}}}}},"d":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}}}}}},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"n":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"s":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.018867924528301886},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.01607717041800643},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.03235294117647059}},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.01764705882352941}},")":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"}":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},".":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"i":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},"e":{"docs":{},"d":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"a":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"l":{"docs":{},"e":{"docs":{},"v":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353},"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.08823529411764706},"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":5.115942028985507},"routing/routers.html":{"ref":"routing/routers.html","tf":0.03398058252427184},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":5.029940119760479},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":5.057142857142857},"ring.html":{"ref":"ring.html","tf":0.0137221269296741},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.03235294117647059},"validating.html":{"ref":"validating.html","tf":3.356269113149847},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.11224489795918367}},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"routing/routers.html":{"ref":"routing/routers.html","tf":10.077669902912621},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.029940119760479042},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.02857142857142857},"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353},"validating.html":{"ref":"validating.html","tf":0.013761467889908258},"configuring_routers.html":{"ref":"configuring_routers.html","tf":5.040816326530612}},")":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.014563106796116505},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}},",":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.009708737864077669}}},":":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}},":":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}},"s":{"docs":{},".":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},":":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}},",":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}},")":{"docs":{},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},")":{"docs":{},")":{"docs":{},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.013761467889908258}}}}},",":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},":":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"o":{"docs":{},"t":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}},"l":{"docs":{},"e":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}},"s":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"]":{"docs":{},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":5.015437392795883},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},"]":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}},"u":{"docs":{},"n":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"t":{"docs":{},"i":{"docs":{},"m":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"a":{"docs":{},"i":{"docs":{},"s":{"docs":{},"e":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},")":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}}}}},"]":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}},"s":{"docs":{},"i":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"n":{"docs":{},"g":{"docs":{},"l":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}},"d":{"docs":{},"e":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}},"y":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"x":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":5.0144927536231885}}}}}},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}},"t":{"docs":{},"i":{"docs":{},"s":{"docs":{},"f":{"docs":{},"i":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}}}}}},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617}},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"c":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}},"s":{"docs":{},"]":{"docs":{},"]":{"docs":{},"]":{"docs":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}}},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}},"u":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}},"y":{"docs":{},"l":{"docs":{},"e":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"]":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},",":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}},"e":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"t":{"docs":{},"]":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"h":{"docs":{},"i":{"docs":{},"p":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"p":{"docs":{},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"a":{"docs":{},"p":{"docs":{},"e":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"u":{"docs":{},"p":{"docs":{},"p":{"docs":{},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":5.005145797598628}}}}}}},"b":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}},"c":{"docs":{},"c":{"docs":{},"e":{"docs":{},"e":{"docs":{},"d":{"docs":{},"s":{"docs":{},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}}},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.00964630225080386},"validating.html":{"ref":"validating.html","tf":0.027522935779816515}},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}}}}}}}}},"]":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}},"s":{"docs":{},".":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"]":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}},"w":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},":":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}},"/":{"docs":{},"*":{"docs":{},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}},"t":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.029411764705882353}},"m":{"docs":{},"e":{"docs":{},".":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}},",":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}},"w":{"docs":{},"o":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}},"a":{"docs":{},"k":{"docs":{},"e":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"h":{"docs":{},"r":{"docs":{},"o":{"docs":{},"w":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},"n":{"docs":{},".":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}},"r":{"docs":{},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.02857142857142857},"validating.html":{"ref":"validating.html","tf":3.3379204892966357}},":":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617}}}}},"u":{"docs":{},"e":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}},"a":{"docs":{},"n":{"docs":{},"s":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}}},"o":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}},"o":{"docs":{},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"l":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"s":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}},"p":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},",":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}},"d":{"docs":{},"o":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"s":{"docs":{},".":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.029411764705882353},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},":":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},")":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}},"s":{"docs":{},",":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}},".":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"e":{"docs":{},"s":{"docs":{},".":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}},"i":{"docs":{},"d":{"docs":{"validating.html":{"ref":"validating.html","tf":3.3470948012232413},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}},"i":{"docs":{},"a":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}},":":{"docs":{},":":{"docs":{},"d":{"docs":{},"b":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617}},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617}}},"}":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}},"r":{"docs":{},"o":{"docs":{},"p":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.028985507246376812}}}},"}":{"docs":{},"]":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}},"]":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}},"}":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}},")":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.009708737864077669}},")":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}},"s":{"docs":{},"]":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}},"]":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}}},"a":{"docs":{},"c":{"docs":{},"c":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"s":{"docs":{},")":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"}":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"e":{"docs":{},"}":{"docs":{},"}":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"2":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"3":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"docs":{}}}}},"i":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},"t":{"docs":{},"o":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"x":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},"y":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.028985507246376812},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.029940119760479042},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"a":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.00686106346483705},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.02572347266881029},"validating.html":{"ref":"validating.html","tf":0.013761467889908258}},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"]":{"docs":{},"]":{"docs":{},"}":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}},"p":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},")":{"docs":{},")":{"docs":{},"}":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"]":{"docs":{},"}":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"r":{"docs":{},"g":{"docs":{"validating.html":{"ref":"validating.html","tf":0.013761467889908258}}}}},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"u":{"docs":{},"p":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.014563106796116505},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.01764705882352941},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}},"i":{"docs":{},"x":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.014563106796116505}}},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.014563106796116505},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}},"e":{"docs":{},"t":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},".":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},"}":{"docs":{},"]":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}}}}},"t":{"docs":{},"h":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.009708737864077669},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"validating.html":{"ref":"validating.html","tf":0.013761467889908258},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},".":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}},"c":{"docs":{},"h":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}},"u":{"docs":{},"t":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},"u":{"docs":{},"i":{"docs":{},"r":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"s":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.014563106796116505},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.00964630225080386},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}},"e":{"docs":{},"s":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"/":{"docs":{},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.013761467889908258}}}}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"validating.html":{"ref":"validating.html","tf":0.013761467889908258}},":":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}},"r":{"docs":{},"a":{"docs":{},"w":{"docs":{"validating.html":{"ref":"validating.html","tf":0.05045871559633028}}}}}}}}}}}}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"validating.html":{"ref":"validating.html","tf":0.01834862385321101},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},"e":{"docs":{},"r":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}},"l":{"docs":{},"e":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.029940119760479042}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"}":{"docs":{},"]":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"]":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},"}":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.009708737864077669}},",":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},"]":{"docs":{},"]":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.015437392795883362},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.00964630225080386},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}},"h":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"validating.html":{"ref":"validating.html","tf":0.013761467889908258}}}}}}},"b":{"docs":{},"o":{"docs":{},"d":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.018867924528301886},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.01929260450160772}}},"y":{"docs":{},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},"}":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}},"d":{"docs":{},"b":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"]":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}},"e":{"docs":{},")":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788}}}}}}},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.011764705882352941}},".":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.012861736334405145}},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.012006861063464836}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788}},")":{"docs":{},"}":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"]":{"docs":{},"}":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}}}}}},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"e":{"docs":{},"r":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"s":{"docs":{},")":{"docs":{},"]":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788}},".":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},",":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"s":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"y":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.00964630225080386}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"o":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}}}},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}}},"[":{"docs":{},"\"":{"docs":{},"/":{"docs":{},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}}},"p":{"docs":{},"i":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}},"/":{"docs":{},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"d":{"docs":{},"b":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}},"/":{"docs":{},":":{"docs":{},"d":{"docs":{},"b":{"docs":{},"/":{"docs":{},"d":{"docs":{},"r":{"docs":{},"o":{"docs":{},"p":{"docs":{},"\"":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"s":{"docs":{},"\"":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}}}}}}}},"d":{"docs":{},"b":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"r":{"docs":{},"o":{"docs":{},"p":{"docs":{},"\"":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.008576329331046312},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}},"]":{"docs":{},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}}}}},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"/":{"docs":{},"*":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"\"":{"docs":{},"]":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}}}}}}}}}},"u":{"docs":{},"c":{"docs":{},"\"":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}},"s":{"docs":{},"\"":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}},":":{"docs":{},"d":{"docs":{},"b":{"docs":{},"\"":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}},"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":{},"]":{"docs":{},"]":{"docs":{},")":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"s":{"docs":{},"\"":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}},"b":{"docs":{},"u":{"docs":{},"l":{"docs":{},"k":{"docs":{},"/":{"docs":{},":":{"docs":{},"b":{"docs":{},"u":{"docs":{},"l":{"docs":{},"k":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}}}}}}},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},"]":{"docs":{},"]":{"docs":{},"]":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}},":":{"docs":{},":":{"docs":{},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"]":{"docs":{},",":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.028985507246376812}}},"}":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}}}}},"p":{"docs":{},"i":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617}},"]":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.017964071856287425}},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}},"c":{"docs":{},"c":{"docs":{},"]":{"docs":{},"}":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"d":{"docs":{},"b":{"docs":{},"]":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{},"s":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"t":{"docs":{},"o":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{},"]":{"docs":{},")":{"docs":{},")":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}}},"x":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"p":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}},"[":{"docs":{},"\"":{"docs":{},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"/":{"docs":{},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}},"\"":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"]":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"/":{"docs":{},":":{"docs":{},"u":{"docs":{},"s":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}}}}}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}}},"#":{"docs":{},"(":{"docs":{},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}}}},"]":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.02040816326530612}},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"_":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"]":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"i":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"{":{"docs":{},":":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"{":{"docs":{},"{":{"docs":{},":":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}},"e":{"docs":{},"r":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}}}}}}},"o":{"docs":{},"r":{"docs":{},"g":{"docs":{},".":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},"/":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}}}}}}}}}}}}}}}}},"x":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}},"%":{"docs":{},"]":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}},".":{"docs":{},".":{"docs":{},".":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}}},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.02040816326530612}},"u":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406}},"s":{"docs":{},".":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}},"\"":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},".":{"docs":{},"\"":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"s":{"docs":{},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"?":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"b":{"docs":{},"i":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}}},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"c":{"docs":{},"t":{"docs":{},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345},"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}},"c":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"u":{"docs":{},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"u":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"w":{"docs":{},"e":{"docs":{},"s":{"docs":{},"o":{"docs":{},"m":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617}},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}},"p":{"docs":{},"p":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0137221269296741},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},"l":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}}}}},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"r":{"docs":{},"o":{"docs":{},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"s":{"docs":{},",":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}}}},"i":{"docs":{},".":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}},"n":{"docs":{},"o":{"docs":{},"n":{"docs":{},"y":{"docs":{},"m":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}}},"s":{"docs":{},"y":{"docs":{},"n":{"docs":{},"c":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"2":{"0":{"docs":{},"\"":{"docs":{},"]":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}},"docs":{}},"docs":{}}}},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}},"v":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}},"n":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"e":{"docs":{},"d":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.03398058252427184},"ring.html":{"ref":"ring.html","tf":0.003430531732418525}},"!":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},"s":{"docs":{},":":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},"p":{"docs":{},"a":{"docs":{},"c":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}},"i":{"docs":{},"v":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}},"i":{"docs":{},"l":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.014563106796116505},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},",":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.009708737864077669},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}},"c":{"docs":{},"e":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},".":{"docs":{},"j":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}},"t":{"docs":{},"e":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},":":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.04081632653061224}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.028985507246376812},"routing/routers.html":{"ref":"routing/routers.html","tf":0.014563106796116505},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.02040816326530612}},".":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},"s":{"docs":{},".":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}},"m":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"n":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"s":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}},"]":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}},"]":{"docs":{},"}":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}},"r":{"docs":{},"i":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}},"t":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{},"w":{"docs":{},"i":{"docs":{},"s":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}},"u":{"docs":{},"t":{"docs":{},"*":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}},"p":{"docs":{},"u":{"docs":{},"t":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"i":{"docs":{},"d":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"2":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"3":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.012861736334405145},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.008823529411764706}},"}":{"docs":{},")":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},".":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}},"i":{"docs":{},"t":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}},"t":{"docs":{},"h":{"docs":{},"?":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}}}},"o":{"docs":{},"r":{"docs":{},"k":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}},"a":{"docs":{},"y":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}},"{":{"2":{"0":{"0":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}},"docs":{}},"docs":{}},"docs":{},":":{"docs":{},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.043478260869565216},"ring.html":{"ref":"ring.html","tf":0.008576329331046312},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"routing/route_syntax.html":{"ref":"routing/route_syntax.html","tf":0.014492753623188406},"routing/routers.html":{"ref":"routing/routers.html","tf":0.024271844660194174},"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"i":{"docs":{},"d":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.014563106796116505}}},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.041916167664670656}}}}}}}}}}}}},"d":{"docs":{},"b":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.017964071856287425}}}},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.015437392795883362},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}},":":{"docs":{},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"h":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{"ring.html":{"ref":"ring.html","tf":0.018867924528301886},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.012861736334405145}}}}}},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}},"b":{"docs":{},"o":{"docs":{},"d":{"docs":{},"i":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}},"t":{"docs":{},"o":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.01607717041800643}}}}}}},"x":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.00964630225080386}}}},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}},"\"":{"0":{"docs":{},".":{"1":{"docs":{},".":{"1":{"2":{"3":{"docs":{},"\"":{"docs":{},"]":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}},"docs":{}},"docs":{}},"docs":{}}},"3":{"docs":{},".":{"0":{"docs":{},"\"":{"docs":{},"]":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}},"3":{"docs":{},"\"":{"docs":{},"]":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}},"docs":{}}},"docs":{}}},"1":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},"}":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.009708737864077669}}}}},".":{"9":{"docs":{},".":{"0":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}},"docs":{}}},"docs":{}}},"docs":{},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"1":{"docs":{},"\"":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.009708737864077669}},")":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}},"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"\"":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.009708737864077669}},",":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}}}}},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"\"":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}},")":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}}},"d":{"docs":{},"b":{"docs":{},"\"":{"docs":{},"}":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"}":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},"}":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}}}}}}}}},"h":{"docs":{},"e":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"\"":{"docs":{},")":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}},"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.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"\"":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},"}":{"docs":{},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.005145797598627788}}}}}}}}},"\"":{"docs":{},")":{"docs":{},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}},"a":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"b":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"e":{"docs":{},"n":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525}}}}}}}}}}}}},"o":{"docs":{},"k":{"docs":{},"\"":{"docs":{},"}":{"docs":{"ring.html":{"ref":"ring.html","tf":0.00686106346483705}},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"e":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"p":{"docs":{},"l":{"docs":{},"u":{"docs":{},"g":{"docs":{},"g":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}}}}},"#":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"{":{"docs":{},":":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.009708737864077669},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"s":{"docs":{},"{":{"docs":{},":":{"docs":{},"a":{"docs":{},"n":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}},"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":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}}}}}}}}}}}}}},"{":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},"}":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}},"}":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.011976047904191617}},"}":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},")":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}},"d":{"docs":{},"b":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.017964071856287425}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"}":{"docs":{},"}":{"docs":{"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"p":{"docs":{},"o":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"{":{"docs":{},":":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"[":{"docs":{},".":{"docs":{},".":{"docs":{},".":{"docs":{},"]":{"docs":{},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"}":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}}}}}},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}}}},"'":{"docs":{},"[":{"docs":{},"r":{"docs":{},"e":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},".":{"docs":{},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{},"e":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}}}},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"]":{"docs":{},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}}}}},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"j":{"docs":{},"u":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},".":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"h":{"docs":{},"a":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}},"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":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}}}}}}},"/":{"docs":{},"a":{"docs":{},"p":{"docs":{},"i":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},":":{"docs":{},"i":{"docs":{},"d":{"docs":{},":":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.0048543689320388345}}}}}}}}}}}}}}},":":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.014285714285714285}}}}}},"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":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.02857142857142857}}}}}}}}}}}}}}}},"b":{"docs":{},"u":{"docs":{},"l":{"docs":{},"k":{"docs":{},"/":{"docs":{},":":{"docs":{},"b":{"docs":{},"u":{"docs":{},"l":{"docs":{},"k":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.02857142857142857}}}}}}}}}}}},"p":{"docs":{},"u":{"docs":{},"b":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"/":{"docs":{},"*":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.02857142857142857}}}}}}}}}}}}}}},";":{"docs":{"routing/routers.html":{"ref":"routing/routers.html","tf":0.10679611650485436},"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.11976047904191617},"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.17142857142857143},"ring.html":{"ref":"ring.html","tf":0.025728987993138937},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"validating.html":{"ref":"validating.html","tf":0.30275229357798167}},";":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"^":{"docs":{},":":{"docs":{},"r":{"docs":{},"e":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"c":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809}}}}}}}}},"^":{"docs":{},"^":{"docs":{},"^":{"docs":{},"^":{"docs":{},"^":{"docs":{"validating.html":{"ref":"validating.html","tf":0.009174311926605505}}}}}}}},"u":{"docs":{},"n":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.0017152658662092624},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"o":{"docs":{},"d":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286}}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"a":{"docs":{},"p":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"m":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}}},"s":{"docs":{"routing/route_metadata.html":{"ref":"routing/route_metadata.html","tf":0.005988023952095809},"ring.html":{"ref":"ring.html","tf":0.005145797598627788},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"r":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},">":{"docs":{"routing/route_conflicts.html":{"ref":"routing/route_conflicts.html","tf":0.05714285714285714},"ring.html":{"ref":"ring.html","tf":0.012006861063464836},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.01764705882352941}}},"%":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"validating.html":{"ref":"validating.html","tf":0.009174311926605505}},")":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}},")":{"docs":{},")":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"=":{"docs":{},">":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.05102040816326531}}}},"?":{"docs":{},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"ring.html":{"ref":"ring.html","tf":0.003430531732418525},"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.003215434083601286},"configuring_routers.html":{"ref":"configuring_routers.html","tf":0.01020408163265306}},",":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}},"s":{"docs":{},":":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}},"n":{"docs":{},"o":{"docs":{},"w":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}},"q":{"docs":{},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"f":{"docs":{},"i":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}}}}},"z":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{"ring.html":{"ref":"ring.html","tf":0.0017152658662092624}}}}}},"x":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}},"y":{"docs":{},")":{"docs":{},"}":{"docs":{},"}":{"docs":{},")":{"docs":{},"}":{"docs":{},"}":{"docs":{},"]":{"docs":{},"]":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}}}}}}}},"]":{"docs":{},"}":{"docs":{"parameter_coercion.html":{"ref":"parameter_coercion.html","tf":0.006430868167202572}}}},"i":{"docs":{},"e":{"docs":{},"l":{"docs":{},"d":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}}}}},"_":{"docs":{},"]":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0029411764705882353}}}},"`":{"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":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"t":{"docs":{},"o":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"`":{"docs":{"compiling_middleware.html":{"ref":"compiling_middleware.html","tf":0.0058823529411764705}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"/":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}}}}}}}}}}}},".":{"docs":{},".":{"docs":{},".":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}},"]":{"docs":{"validating.html":{"ref":"validating.html","tf":0.0045871559633027525}}}}}}},"length":1109},"corpusTokens":["\"/\"))","\"/\")))","\"/api/admin/db\"})","\"/api/admin/ping\",","\"/api/admin/ping\"})","\"/api/admin/users\"","\"/api/admin/users\")","\"/api/admin/users\"}","\"/api/ping\"","\"/api/ping\"})","\"/api/user/1\"","\"/api/user/1\")","\"/api/user/:id\"","\"/api/user/:id\",","\"/favicon.ico\"})","\"/hello\")","\"/ping\"","\"/ping\"})","\"0.1.123\"]","\"0.3.0\"]","\"0.3.3\"]","\"1\"})","\"1\"}}","\"1.9.0","\"a","\"everyth","\"forbidden\"}","\"gener","\"ok\"}","\"ok\"})","\"ok\"}))","\"pluggabl","#(respond","#endpoint{:meta","#match{:templ","#methods{:ani","#object[...],","#object[...]}","#object[...]},","#partialmatch{:templ","#{:admin}","#{:admin}}","#{:admin}})","#{:db","#{:id}","#{:id}}","#{route}}","%","%))","%))))","&","'[clojure.set","'[clojure.spec.alpha","'[clojure.spec.test.alpha","'[expound.alpha","'[reitit.coercion","'[reitit.coercion.spec","'[reitit.cor","'[reitit.middlewar","'[reitit.r","'[reitit.spec])","'[spec","(","(+","(:request","([request","([request]","(and","(api","(app","(both","(clojure.core/fn","(clojure.spec)","(clojure.spec.alpha/*","(clojure.spec.alpha/?","(clojure.spec.alpha/and","(clojure.spec.alpha/cat","(clojure.spec.alpha/col","(clojure.spec.alpha/or","(clojure.string/start","(coerc","(compiled)","(conj","(constantli","(def","(default","(defn","(effect","(fn","(fnil","(handler","(if","(let","(middleware/cr","(non","(not","(optional,recommend","(or","(records,","(reitit/match","(reitit/parti","(reitit/rout","(reitit/routes))","(request)","(requir","(respons","(reverse)","(ring/get","(ring/r","(ring/rout","(s/def","(s/key","(seq","(set!","(set/intersect","(some","(st/instrument","(st/spec","(updat","(wrap","...","...]","/:user","/:version/statu","/api/user/:id:","/bulk/:bulk","/public/*path","1","1,","1.9.0","2","200","200,","2}})","3","3}}","403,","4x","50%","::acc","::coerc","::db","::db]","::db}","::drop","::i","::ping","::ping)","::ping]","::ping]]","::ping}]","::pong}]]","::request","::request}","::respons","::response}}","::role","::roles)]","::total","::user","::user)","::user))","::user]","::user]]]))","::users]","::users}","::users}]","::user}","::wrap2","::wrap3","::x","::y]))",":a",":admin",":admin]]}",":api",":api))})",":api)]}",":arg",":bodi",":body,",":body}",":child",":coerc",":coercion",":coercion)",":compil",":conflict",":db",":db]]",":default",":delet",":delete)]",":delete,",":descript",":expand",":form,",":gen",":gen.",":get",":get,",":handler",":handler)})",":handler]}",":head,",":header",":into",":linear",":lookup",":meta",":middlewar",":mix",":name",":options,",":opts)]",":param",":paramet",":parameters.",":parameters}]",":patch,",":path",":path)",":path.",":post",":put,",":put.",":query,",":reitit.spec/arg)",":reitit.spec/path",":reitit.spec/path:",":reitit.spec/raw",":req",":request",":requir",":respons",":responses)",":result",":role",":rout",":router",":schema",":uri",":user/ping}]",":user/user]",":user/user}",":user/user},",":user/user}]]",":wrap",":wrap.",":y",";",";;","=>",">","?arg","[\"/:db\"","[\"/:user","[\"/:version/status\"]])","[\"/admin\"","[\"/api\"","[\"/api/admin/db\"","[\"/api/admin/db/:db/drop\"","[\"/api/admin/db/:db/stats\"","[\"/api/admin/users\"","[\"/api/ping\"","[\"/api/user/:id\"","[\"/bulk/:bulk","[\"/db\"","[\"/drop\"","[\"/ping\"","[\"/ping\"]","[\"/pong\"","[\"/pong\"]]","[\"/public/*path\"]","[\"/public/*path\"]]","[\"/publuc\"","[\"/stats\"","[\"/user\"","[\"/user/:id\"","[\"/users\"","[\"pong\"]]]","[\"pong\"]]])","[#(wrap","[%]","[...","[::acc]}]","[::admin],","[::admin]}","[::api","[::api]","[::api]}","[::db]","[::roles]","[::total]))","[::x","[:api","[:user/p","[[\"/api\"","[[\"/api/admin/user\"","[[\"/api/ping\"","[[\"/ping\"","[[\"/ping\"]","[[\"/users/:us","[[wrap","[])","[]))","[]}}]]","[_]","[coercer","[coercion/gen","[expound","[handler","[handler]","[metosin/spec","[org.clojure/clojur","[org.clojure/spec.alpha","[request]","[requir","[respons","[wrap","[x","[{:key","[{{{:key","^:replac","^^^^^^","_]","`reitit.coercion.protocol/coercion`","`reitit/router)","acc","access","accumul","actual","ad","add","admin}","admin}}","adopt","allow","alpha20\"]","anonym","api.","app","app:","appli","application.","approaches,","arbitrari","arg","arg\"","arg.\"","args.","args?","argument","arguments.","ariti","async","author","automat","avail","awesom","back","base","basic","befor","below","better.","both","build","built","call","callback","catch","chain","check","child","class","clojur","clojure(script)","clojure(script).","clojure.core/string?","clojure.lang.exceptioninfo:","clojure.spec","clojurescript,","closur","code","code,","coerc","coercer","coercion","coercion,","coercion.","coercion/gen","coercion])","compil","compilation,","compiled)","compiled,","compiled.","compiler,","compilerexcept","compojur","concept","configur","conflict","conflicts!)","conflicts.","conj","contain","correctly:","creat","creation","custom","data","data,","data.","data:","db]","db}]","default","defin","defined.","demonstr","depend","dependencies:","descript","details.","detect","develop","differ","doc","driven","dynam","easi","easier","effect","element","else\")","enabl","enforc","ensur","error","etc).","etc.)","ex","exact","exampl","except","exceptioninfo","expand","expanded,","expans","expect","expound/printer)","expound])","extend","extens","extract","fail","fails,","fast","fast,","faster","first","flattened:","follow","following:","format","found","found):","found.","friendli","function","function,","function.","gen","generic,","get","guard","handl","handler","handler:","handler]","handler])))","handler]]]]","handlers,","handlers.","handler}])))","handler}}]]])))","hook","http","id","id\"]","id))))","id/ord","id/orders\"]","id]","implemen","implement","implementation.","implementations:","info","inform","initi","inject","input","instead","int?)","int?))","int?,","int?}}","int?}}}","interceptor","interceptor/middlewar","interpret","introduc","introduct","it'","it?","key","key,","keys:","keyword","know","later","latest","leaf","less","let'","level","libs)","link","littl","look","lookups.","manual","map","map,","map:","match","match)","match,","match.","match?","matches,","merge.","message.","meta","meta,","metadata","method","method.","methods.","middlewar","middleware.","middleware:","middleware])","miss","mount","mount.\"","multipl","mw,","naiv","name","name!","names:","namespac","need","needed.","nest","nice","nil","nil,","node.j","normal","note","note:","on","opt","optim","optin","option","option.","options.","opts)","opts)]","opts]}","origin","otherwis","out*","output","overrid","param","paramet","parameters:","partial","pass","path","path,","path.","pedest","penalty.","perf","perform","plain","pluggabl","po","pre","processing,","processing.","produc","project:","protocol,","provid","public","purpose:","qualifi","raise))))))","raise)))))))}))","raise]","reason","record","record:","records,","regist","reitit","reitit.coercion.protocol/coercion","reitit.coercion.spec/speccoercion","reitit.coercion:","reitit.core/expand)","reitit.core/router,","reitit.core/router:","reitit.core/throw","reitit.middleware/cr","reitit.middleware/intomiddlewar","reitit.middleware/middlewar","reitit.ring/get","reitit.ring/rout","reitit.spec","reitit])","relev","request","request)","request)))","request))))","request)))))","request.","request}]","requir","required)","resolut","resolv","respond","respons","response)]","response]","responses)","result","resut","return","revers","ring","ring,","ring])","role","roles)))","roles:","roles]}})))","root","rout","route)))","route,","route:","router","router)","router,","router:","routes):","routes,","routes.","routes:","routing,","routing:","run","runtim","s/*explain","s])","same","satisfi","see","select","set])","sever","shape","ship","shipped,","side","simpl","singl","spec","spec/coercion}})))","spec])","special","specs.","st])","static","stats]]]]]))","stats}]]","statu","still,","store","string","string}","string}}","stuctur","style","submap","succeeds,","support","swagger:","syntax","system.","take","tests.","thing","third","throw","thrown.","ti","time,","time.","to,","todo","too.","tool","tools.cor","top","toward","transform","tree","tree:","true","two","type","un","under","understood","unmount","unwrap","us","used.","user","valid","valu","values.","vector","vector)","vector.","vectors,","vectors.","version","version:","via","way","wild","with?","work","wrap","wrap.","wrap2","wrap3","wrap}))","written","x","y)}})}}]]","y]}","yield","zero","{200","{::role","{:bodi","{:db","{:handler","{:id","{:interceptor","{:meta","{:middlewar","{:name","{:paramet","{:request","{:role","{:schema","{:statu","{:total","{:x","{rout","{}"],"pipeline":["stopWordFilter","stemmer"]},"store":{"./":{"url":"./","title":"Introduction","keywords":"","body":"reitit\nreitit is a friendly data-driven router for Clojure(Script).\n\nSimple data-driven route syntax\nFirst-class route meta-data\nGeneric, not tied to HTTP\nRoute conflict resolution\nPluggable coercion (clojure.spec)\nboth Middleware & Interceptors\nExtendable\nFast\n\nLatest version\n\n"},"routing/route_syntax.html":{"url":"routing/route_syntax.html","title":"Route syntax","keywords":"","body":"Route Syntax\nRoutes are defined as vectors, which String path, optional (non-vector) route argument and optional child routes. Routes can be wrapped in vectors.\nSimple route:\n[\"/ping\"]\n\nTwo routes:\n[[\"/ping\"]\n [\"/pong\"]]\n\nRoutes with meta-data:\n[[\"/ping\" ::ping]\n [\"/pong\" {:name ::pong}]]\n\nRoutes with path and catch-all parameters:\n[[\"/users/:user-id\"]\n [\"/public/*path\"]]\n\nNested routes with meta-data:\n[\"/api\"\n [\"/admin\" {:middleware [::admin]}\n [\"/user\" ::user]\n [\"/db\" ::db]\n [\"/ping\" ::ping]]\n\nSame routes flattened:\n[[\"/api/admin/user\" {:middleware [::admin], :name ::user}\n [\"/api/admin/db\" {:middleware [::admin], :name ::db}\n [\"/api/ping\" ::ping]]\n\n"},"routing/routers.html":{"url":"routing/routers.html","title":"Routers","keywords":"","body":"Routers\nFor routing, a Router is needed. Reitit ships with several different router implementations: :linear-router, :lookup-router and :mixed-router, based on the awesome Pedestal implementation.\nRouter is created with reitit.core/router, which takes routes and optional options map as arguments. The route tree gets expanded, optionally coerced and compiled. Actual Router implementation is selected automatically but can be defined with a :router option. Router support both path- and name-based lookups.\nCreating a router:\n(require '[reitit.core :as reitit])\n\n(def router\n (reitit/router\n [[\"/api\"\n [\"/ping\" ::ping]\n [\"/user/:id\" ::user]]]))\n\n:mixed-router is created (both static & wild routes are found):\n(reitit/router-name router)\n; :mixed-router\n\nThe expanded routes:\n(reitit/routes router)\n; [[\"/api/ping\" {:name :user/ping}]\n; [\"/api/user/:id\" {:name :user/user}]]\n\nRoute names:\n(reitit/route-names router)\n; [:user/ping :user/user]\n\nPath-based routing\n(reitit/match-by-path router \"/hello\")\n; nil\n\n(reitit/match-by-path router \"/api/user/1\")\n; #Match{:template \"/api/user/:id\"\n; :meta {:name :user/user}\n; :path \"/api/user/1\"\n; :result nil\n; :params {:id \"1\"}}\n\nName-based (reverse) routing\n(reitit/match-by-name router ::user)\n; #PartialMatch{:template \"/api/user/:id\",\n; :meta {:name :user/user},\n; :result nil,\n; :params nil,\n; :required #{:id}}\n\n(reitit/partial-match? (reitit/match-by-name router ::user))\n; true\n\nOnly a partial match. Let's provide the path-parameters:\n(reitit/match-by-name router ::user {:id \"1\"})\n; #Match{:template \"/api/user/:id\"\n; :meta {:name :user/user}\n; :path \"/api/user/1\"\n; :result nil\n; :params {:id \"1\"}}\n\nThere is also a exception throwing version:\n(reitit/match-by-name! router ::user)\n; ExceptionInfo missing path-params for route /api/user/:id: #{:id}\n\n"},"routing/route_metadata.html":{"url":"routing/route_metadata.html","title":"Route metadata","keywords":"","body":"Route meta-data\nRoutes can have arbitrary meta-data. For nested routes, the meta-data is accumulated from root towards leafs using meta-merge.\nA router based on nested route tree:\n(def router\n (reitit/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 [\"/:db\" {:parameters {:db String}}\n [\"/drop\" ::drop-db]\n [\"/stats\" ::db-stats]]]]]))\n\nResolved route tree:\n(reitit/routes router)\n; [[\"/api/ping\" {:interceptors [::api]\n; :name ::ping}]\n; [\"/api/admin/users\" {:interceptors [::api]\n; :roles #{:admin}\n; :name ::users}]\n; [\"/api/admin/db/:db/drop\" {:interceptors [::api ::db]\n; :roles #{:db-admin}\n; :parameters {:db String}\n; :name ::drop-db}]\n; [\"/api/admin/db/:db/stats\" {:interceptors [::api ::db]\n; :roles #{:db-admin}\n; :parameters {:db String}\n; :name ::db-stats}]]\n\nPath-based routing:\n(reitit/match-by-path router \"/api/admin/users\")\n; #Match{:template \"/api/admin/users\"\n; :meta {:interceptors [::api]\n; :roles #{:admin}\n; :name ::users}\n; :result nil\n; :params {}\n; :path \"/api/admin/users\"}\n\nOn match, route meta-data is returned and can interpreted by the application.\nRouters also support meta-data compilation enabling things like fast Ring or Pedestal -style handlers. Compilation results are found under :result in the match. See configuring routers for details.\n"},"routing/route_conflicts.html":{"url":"routing/route_conflicts.html","title":"Route conflicts","keywords":"","body":"Route conflicts\nRoute trees should not have multiple routes that match to a single (request) path. router checks the route tree at creation for conflicts and calls a registered :conflicts option callback with the found conflicts. Default implementation throws ex-info with a descriptive message.\n(reitit/router\n [[\"/ping\"]\n [\"/:user-id/orders\"]\n [\"/bulk/:bulk-id\"]\n [\"/public/*path\"]\n [\"/:version/status\"]])\n; CompilerException clojure.lang.ExceptionInfo: router contains conflicting routes:\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\n"},"ring.html":{"url":"ring.html","title":"Ring support","keywords":"","body":"Ring support\nRing-router adds support for ring concepts like handlers, middleware and routing based on :request-method. Ring-router is created with reitit.ring/router function. It runs a custom route compiler, creating a optimized stucture for handling route matches, with compiled middleware chain & handlers for all request methods. It also ensures that all routes have a :handler defined.\nSimple Ring app:\n(require '[reitit.ring :as ring])\n\n(defn handler [_]\n {:status 200, :body \"ok\"})\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/ping\" handler])))\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 expanded routes:\n(-> app (ring/get-router) (reitit/routes))\n; [[\"/ping\"\n; {:handler #object[...]}\n; #Methods{:any #Endpoint{:meta {:handler #object[...]},\n; :handler #object[...],\n; :middleware []}}]]\n\nNote that the compiled resuts as third element in the route vector.\nRequest-method based routing\nHandler are also looked under request-method keys: :get, :head, :patch, :delete, :options, :post or :put. Top-level handler is used if request-method based handler is not found.\n(def app\n (ring/ring-handler\n (ring/router\n [\"/ping\" {:name ::ping\n :get handler\n :post handler}])))\n\n(app {:request-method :get, :uri \"/ping\"})\n; {:status 200, :body \"ok\"}\n\n(app {:request-method :put, :uri \"/ping\"})\n; nil\n\nReverse routing:\n(-> app\n (ring/get-router)\n (reitit/match-by-name ::ping)\n :path)\n; \"/ping\"\n\nMiddleware\nMiddleware can be added with a :middleware key, with a vector value of the following:\n\nring middleware function handler -> request -> response\nvector of middleware function handler ?args -> request -> response and optinally it's args.\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 [\"/api\" {:middleware [#(wrap % :api)]}\n [\"/ping\" handler]\n [\"/admin\" {:middleware [[wrap :admin]]}\n [\"/db\" {:middleware [[wrap :db]]\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\nMiddleware Records\nReitit supports first-class data-driven middleware via reitit.middleware/Middleware records, created with reitit.middleware/create function. The following keys have special purpose:\n\n\n\nkey\ndescription\n\n\n\n\n:name\nName of the middleware as qualified keyword (optional,recommended for libs)\n\n\n:wrap\nThe actual middleware function of handler args? => request => response\n\n\n:gen\nMiddleware compile function, see compiling middleware.\n\n\n\nWhen routes are compiled, all middleware are expanded (and optionally compiled) into Middleware and stored in compilation results for later use (api-docs etc). For actual request processing, they are unwrapped into normal middleware functions producing zero runtime performance penalty. Middleware expansion is backed by reitit.middleware/IntoMiddleware protocol, enabling plain clojure(script) maps to be used.\nA Record:\n(require '[reitit.middleware :as middleware])\n\n(def wrap2\n (middleware/create\n {:name ::wrap2\n :description \"a nice little mw, takes 1 arg.\"\n :wrap wrap}))\n\nAs plain map:\n;; plain map\n(def wrap3\n {:name ::wrap3\n :description \"a nice little mw, :api as arg\"\n :wrap (fn [handler]\n (wrap handler :api))})\n\nAsync Ring\nAll built-in middleware provide both 2 and 3-arity and are compiled for both Clojure & ClojureScript, so they work with Async Ring and Node.js too.\nMeta-data based 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 dynamic extensions to the system.\nExample middleware to guard routes based on user roles:\n(require '[clojure.set :as set])\n\n(defn wrap-enforce-roles [handler]\n (fn [{:keys [::roles] :as request}]\n (let [required (some-> request (ring/get-match) :meta ::roles)]\n (if (and (seq required) (not (set/intersection required roles)))\n {:status 403, :body \"forbidden\"}\n (handler request)))))\n\nMounted to an app via router meta-data (effecting 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 {:meta {: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\", ::roles #{:admin}})\n; {:status 200, :body \"ok\"}\n\n"},"parameter_coercion.html":{"url":"parameter_coercion.html","title":"Parameter coercion","keywords":"","body":"Parameter coercion\nReitit provides pluggable parameter coercion via reitit.coercion.protocol/Coercion protocol, originally introduced in compojure-api. Reitit ships with reitit.coercion.spec/SpecCoercion providing implemenation for clojure.spec and data-specs.\nNOTE: Before Clojure 1.9.0 is shipped, to use the spec-coercion, one needs to add the following dependencies manually to the project:\n[org.clojure/clojure \"1.9.0-alpha20\"]\n[org.clojure/spec.alpha \"0.1.123\"]\n[metosin/spec-tools \"0.3.3\"]\n\nRing request and response coercion\nTo use Coercion with Ring, one needs to do the following:\n\nDefine parameters and responses as data into route meta-data, in format adopted from ring-swagger:\n:parameters map, with submaps for different parameters: :query, :body, :form, :header and :path. Parameters are defined in the format understood by the Coercion.\n:responses map, with response status codes as keys (or :default for \"everything else\") with maps with :schema and optionally :description as values.\n\n\nDefine a Coercion to route meta-data under :coercion\nMount request & response coercion middleware to the routes.\n\nIf the request coercion succeeds, the coerced parameters are injected into request under :parameters.\nIf either request or response coercion fails, an descriptive error is thrown.\nExample with data-specs\n(require '[reitit.ring :as ring])\n(require '[reitit.coercion :as coercion])\n(require '[reitit.coercion.spec :as spec])\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\"\n [\"/ping\" {:parameters {:body {:x int?, :y int?}}\n :responses {200 {:schema {:total pos-int?}}}\n :get {:handler (fn [{{{:keys [x y]} :body} :parameters}]\n {:status 200\n :body {:total (+ x y)}})}}]]\n {:meta {:middleware [coercion/gen-wrap-coerce-parameters\n coercion/gen-wrap-coerce-response]\n :coercion spec/coercion}})))\n\n(app\n {:request-method :get\n :uri \"/api/ping\"\n :body-params {:x 1, :y 2}})\n; {:status 200, :body {:total 3}}\n\nExample with specs\n(require '[reitit.ring :as ring])\n(require '[reitit.coercion :as coercion])\n(require '[reitit.coercion.spec :as spec])\n(require '[clojure.spec.alpha :as s])\n(require '[spec-tools.core :as st])\n\n(s/def ::x (st/spec int?))\n(s/def ::y (st/spec int?))\n(s/def ::total int?)\n(s/def ::request (s/keys :req-un [::x ::y]))\n(s/def ::response (s/keys :req-un [::total]))\n\n(def app\n (ring/ring-handler\n (ring/router\n [\"/api\"\n [\"/ping\" {:parameters {:body ::request}\n :responses {200 {:schema ::response}}\n :get {:handler (fn [{{{:keys [x y]} :body} :parameters}]\n {:status 200\n :body {:total (+ x y)}})}}]]\n {:meta {:middleware [coercion/gen-wrap-coerce-parameters\n coercion/gen-wrap-coerce-response]\n :coercion spec/coercion}})))\n\n(app\n {:request-method :get\n :uri \"/api/ping\"\n :body-params {:x 1, :y 2}})\n; {:status 200, :body {:total 3}}\n\n"},"compiling_middleware.html":{"url":"compiling_middleware.html","title":"Compiling middleware","keywords":"","body":"Compiling Middleware\nThe meta-data extensions are a easy way to extend the system. Routes meta-data can be transformed into any shape (records, functions etc.) in route compilation, enabling fast access at request-time.\nStill, we can do better. As we know the exact route that interceptor/middleware is linked to, we can pass the (compiled) route information into the interceptor/middleware at creation-time. It can extract and transform relevant data just for it and pass it into the actual request-handler via a closure - yielding faster runtime processing.\nTo do this we use middleware records :gen hook instead of the normal :wrap. :gen expects a function of route-meta router-opts => wrap. Middleware can also return nil, which effective unmounts the middleware. Why mount a wrap-enforce-roles middleware for a route if there are no roles required for it?\nTo demonstrate the two approaches, below are response coercion middleware written as normal ring middleware function and as middleware record with :gen. These are the actual codes are from reitit.coercion:\nNaive\n\nExtracts the compiled route information on every request.\n\n(defn wrap-coerce-response\n \"Pluggable response coercion middleware.\n Expects a :coercion of type `reitit.coercion.protocol/Coercion`\n and :responses from route meta, otherwise does not mount.\"\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 :meta :responses)\n coercion (-> match :meta :coercion)\n opts (-> match :meta :opts)]\n (if (and coercion responses)\n (let [coercers (response-coercers coercion responses opts)\n coerced (coerce-response coercers request response)]\n (coerce-response coercers request (handler request)))\n (handler request))))\n ([request respond raise]\n (let [response (handler request)\n method (:request-method request)\n match (ring/get-match request)\n responses (-> match :result method :meta :responses)\n coercion (-> match :meta :coercion)\n opts (-> match :meta :opts)]\n (if (and coercion responses)\n (let [coercers (response-coercers coercion responses opts)\n coerced (coerce-response coercers request response)]\n (handler request #(respond (coerce-response coercers request %))))\n (handler request respond raise))))))\n\nCompiled\n\nRoute information is provided via a closure\nPre-compiled coercers\nMounts only if :coercion and :responses are defined for the route\n\n(def gen-wrap-coerce-response\n \"Generator for pluggable response coercion middleware.\n Expects a :coercion of type `reitit.coercion.protocol/Coercion`\n and :responses from route meta, otherwise does not mount.\"\n (middleware/create\n {:name ::coerce-response\n :gen (fn [{:keys [responses coercion opts]} _]\n (if (and coercion responses)\n (let [coercers (response-coercers coercion responses opts)]\n (fn [handler]\n (fn\n ([request]\n (coerce-response coercers request (handler request)))\n ([request respond raise]\n (handler request #(respond (coerce-response coercers request %)) raise)))))))}))\n\nThe :gen -version has 50% less code, is easier to reason about and is 2-4x faster on basic perf tests.\n"},"validating.html":{"url":"validating.html","title":"Validating route-trees","keywords":"","body":"Validating route-trees\nNamespace reitit.spec contains specs for routes, router and router options.\nTo enable spec-validation of router inputs & outputs at development time, one can do the following:\n; add to dependencies:\n; [expound \"0.3.0\"]\n\n(require '[clojure.spec.test.alpha :as st])\n(require '[expound.alpha :as expound])\n(require '[clojure.spec.alpha :as s])\n(require '[reitit.spec])\n\n(st/instrument `reitit/router)\n(set! s/*explain-out* expound/printer)\n\n(reitit/router\n [\"/api\"\n [\"/publuc\"\n [\"/ping\"]\n [\"pong\"]]])\n; -- Spec failed --------------------\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/* (clojure.spec.alpha/and :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/* (clojure.spec.alpha/and :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; [... [... ... [\"pong\"]]]\n; ^^^^^^\n;\n; should satisfy\n;\n; (fn [%] (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 [%] (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/* (clojure.spec.alpha/and :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\nValidating meta-data\nTODO\n"},"configuring_routers.html":{"url":"configuring_routers.html","title":"Configuring routers","keywords":"","body":"Configuring Routers\nRouters can be configured via options. Options allow things like clojure.spec validation for meta-data and fast, compiled handlers. 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:meta\nInitial expanded route-meta vector (default [])\n\n\n:expand\nFunction of arg opts => meta to expand route arg to route meta-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:conflicts\nFunction of {route #{route}} => side-effect to handle conflicting routes (default reitit.core/throw-on-conflicts!)\n\n\n:router\nFunction of routes opts => router to override the actual router implementation\n\n\n\n"}}} \ No newline at end of file diff --git a/validating.html b/validating.html new file mode 100644 index 00000000..65135898 --- /dev/null +++ b/validating.html @@ -0,0 +1,498 @@ + + + + + + + Validating route-trees · GitBook + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  +
                  + + + + + + + + +
                  + +
                  + +
                  + + + + + + + + +
                  +
                  + +
                  +
                  + +
                  + +

                  Validating route-trees

                  +

                  Namespace reitit.spec contains specs for routes, router and router options.

                  +

                  To enable spec-validation of router inputs & outputs at development time, one can do the following:

                  +
                  ; add to dependencies:
                  +; [expound "0.3.0"]
                  +
                  +(require '[clojure.spec.test.alpha :as st])
                  +(require '[expound.alpha :as expound])
                  +(require '[clojure.spec.alpha :as s])
                  +(require '[reitit.spec])
                  +
                  +(st/instrument `reitit/router)
                  +(set! s/*explain-out* expound/printer)
                  +
                  +(reitit/router
                  +  ["/api"
                  +   ["/publuc"
                  +    ["/ping"]
                  +    ["pong"]]])
                  +; -- Spec failed --------------------
                  +;
                  +; ["/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 :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 :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 --------------------
                  +;
                  +; [... [... ... ["pong"]]]
                  +;                ^^^^^^
                  +;
                  +;     should satisfy
                  +;
                  +; (fn [%] (clojure.string/starts-with? % "/"))
                  +;
                  +; -- Relevant specs -------
                  +;
                  +; :reitit.spec/path:
                  +; (clojure.spec.alpha/and
                  +;   clojure.core/string?
                  +;   (clojure.core/fn [%] (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 :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
                  +
                  +

                  Validating meta-data

                  +

                  TODO

                  + + +
                  + +
                  +
                  +
                  + +

                  results matching ""

                  +
                    + +
                    +
                    + +

                    No results matching ""

                    + +
                    +
                    +
                    + +
                    +
                    + +
                    + + + + + + + + + + + + + + +
                    + + +
                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +