diff --git a/404.html b/404.html index fb30c2755..4376d9939 100644 --- a/404.html +++ b/404.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -105,7 +105,7 @@ @@ -272,7 +269,7 @@
@@ -1057,9 +1078,9 @@ - + - + diff --git a/assets/javascripts/application.30f6b8b1.js b/assets/javascripts/application.30f6b8b1.js deleted file mode 100644 index 17baeca5d..000000000 --- a/assets/javascripts/application.30f6b8b1.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){for(var n in t)e[n]=t[n]}(window,function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,n){"use strict";t.__esModule=!0,t.default={createElement:function(e,t){var n=document.createElement(e);t&&Array.prototype.forEach.call(Object.keys(t),function(e){n.setAttribute(e,t[e])});for(var r=arguments.length,i=Array(r>2?r-2:0),o=2;o pre, pre > code");Array.prototype.forEach.call(n,function(t,n){var r="__code_"+n,i=e.createElement("button",{class:"md-clipboard",title:h("clipboard.copy"),"data-clipboard-target":"#"+r+" pre, #"+r+" code"},e.createElement("span",{class:"md-clipboard__message"})),o=t.parentNode;o.id=r,o.insertBefore(i,t)});new c.default(".md-clipboard").on("success",function(e){var t=e.trigger.querySelector(".md-clipboard__message");if(!(t instanceof HTMLElement))throw new ReferenceError;e.clearSelection(),t.dataset.mdTimer&&clearTimeout(parseInt(t.dataset.mdTimer,10)),t.classList.add("md-clipboard__message--active"),t.innerHTML=h("clipboard.copied"),t.dataset.mdTimer=setTimeout(function(){t.classList.remove("md-clipboard__message--active"),t.dataset.mdTimer=""},2e3).toString()})}if(!Modernizr.details){var r=document.querySelectorAll("details > summary");Array.prototype.forEach.call(r,function(e){e.addEventListener("click",function(e){var t=e.target.parentNode;t.hasAttribute("open")?t.removeAttribute("open"):t.setAttribute("open","")})})}var i=function(){if(document.location.hash){var e=document.getElementById(document.location.hash.substring(1));if(!e)return;for(var t=e.parentNode;t&&!(t instanceof HTMLDetailsElement);)t=t.parentNode;if(t&&!t.open){t.open=!0;var n=location.hash;location.hash=" ",location.hash=n}}};if(window.addEventListener("hashchange",i),i(),Modernizr.ios){var o=document.querySelectorAll("[data-md-scrollfix]");Array.prototype.forEach.call(o,function(e){e.addEventListener("touchstart",function(){var t=e.scrollTop;0===t?e.scrollTop=1:t+e.offsetHeight===e.scrollHeight&&(e.scrollTop=t-1)})})}}).listen(),new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Header.Shadow("[data-md-component=container]","[data-md-component=header]")).listen(),new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Header.Title("[data-md-component=title]",".md-typeset h1")).listen(),document.querySelector("[data-md-component=hero]")&&new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Tabs.Toggle("[data-md-component=hero]")).listen(),document.querySelector("[data-md-component=tabs]")&&new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Tabs.Toggle("[data-md-component=tabs]")).listen(),new f.default.Event.MatchMedia("(min-width: 1220px)",new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Sidebar.Position("[data-md-component=navigation]","[data-md-component=header]"))),document.querySelector("[data-md-component=toc]")&&new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Sidebar.Position("[data-md-component=toc]","[data-md-component=header]"))),new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener(window,"scroll",new f.default.Nav.Blur("[data-md-component=toc] [href]")));var n=document.querySelectorAll("[data-md-component=collapsible]");Array.prototype.forEach.call(n,function(e){new f.default.Event.MatchMedia("(min-width: 1220px)",new f.default.Event.Listener(e.previousElementSibling,"click",new f.default.Nav.Collapse(e)))}),new f.default.Event.MatchMedia("(max-width: 1219px)",new f.default.Event.Listener("[data-md-component=navigation] [data-md-toggle]","change",new f.default.Nav.Scrolling("[data-md-component=navigation] nav"))),document.querySelector("[data-md-component=search]")&&(new f.default.Event.MatchMedia("(max-width: 959px)",new f.default.Event.Listener("[data-md-toggle=search]","change",new f.default.Search.Lock("[data-md-toggle=search]"))),new f.default.Event.Listener("[data-md-component=query]",["focus","keyup","change"],new f.default.Search.Result("[data-md-component=result]",function(){return fetch(t.url.base+"/"+(t.version<"0.17"?"mkdocs":"search")+"/search_index.json",{credentials:"same-origin"}).then(function(e){return e.json()}).then(function(e){return e.docs.map(function(e){return e.location=t.url.base+e.location,e})})})).listen(),new f.default.Event.Listener("[data-md-component=reset]","click",function(){setTimeout(function(){var e=document.querySelector("[data-md-component=query]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.focus()},10)}).listen(),new f.default.Event.Listener("[data-md-toggle=search]","change",function(e){setTimeout(function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.focus()}},400,e.target)}).listen(),new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener("[data-md-component=query]","focus",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked||(e.checked=!0,e.dispatchEvent(new CustomEvent("change")))})),new f.default.Event.Listener(window,"keydown",function(e){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;var n=document.querySelector("[data-md-component=query]");if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(!e.metaKey&&!e.ctrlKey)if(t.checked){if(13===e.keyCode){if(n===document.activeElement){e.preventDefault();var r=document.querySelector("[data-md-component=search] [href][data-md-state=active]");r instanceof HTMLLinkElement&&(window.location=r.getAttribute("href"),t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur())}}else if(9===e.keyCode||27===e.keyCode)t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur();else if(-1!==[8,37,39].indexOf(e.keyCode))n!==document.activeElement&&n.focus();else if(-1!==[38,40].indexOf(e.keyCode)){var i=e.keyCode,o=Array.prototype.slice.call(document.querySelectorAll("[data-md-component=query], [data-md-component=search] [href]")),a=o.find(function(e){if(!(e instanceof HTMLElement))throw new ReferenceError;return"active"===e.dataset.mdState});a&&(a.dataset.mdState="");var s=Math.max(0,(o.indexOf(a)+o.length+(38===i?-1:1))%o.length);return o[s]&&(o[s].dataset.mdState="active",o[s].focus()),e.preventDefault(),e.stopPropagation(),!1}}else document.activeElement&&!document.activeElement.form&&(70!==e.keyCode&&83!==e.keyCode||(n.focus(),e.preventDefault()))}).listen(),new f.default.Event.Listener(window,"keypress",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t!==document.activeElement&&t.focus()}}).listen()),new f.default.Event.Listener(document.body,"keydown",function(e){if(9===e.keyCode){var t=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])");Array.prototype.forEach.call(t,function(e){e.offsetHeight&&(e.tabIndex=0)})}}).listen(),new f.default.Event.Listener(document.body,"mousedown",function(){var e=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]");Array.prototype.forEach.call(e,function(e){e.removeAttribute("tabIndex")})}).listen(),document.body.addEventListener("click",function(){"tabbing"===document.body.dataset.mdState&&(document.body.dataset.mdState="")}),new f.default.Event.MatchMedia("(max-width: 959px)",new f.default.Event.Listener("[data-md-component=navigation] [href^='#']","click",function(){var e=document.querySelector("[data-md-toggle=drawer]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked&&(e.checked=!1,e.dispatchEvent(new CustomEvent("change")))})),function(){var e=document.querySelector("[data-md-source]");if(!e)return a.default.resolve([]);if(!(e instanceof HTMLAnchorElement))throw new ReferenceError;switch(e.dataset.mdSource){case"github":return new f.default.Source.Adapter.GitHub(e).fetch();default:return a.default.resolve([])}}().then(function(e){var t=document.querySelectorAll("[data-md-source]");Array.prototype.forEach.call(t,function(t){new f.default.Source.Repository(t).initialize(e)})})}t.__esModule=!0,t.app=void 0,n(7),n(8),n(9),n(10),n(11),n(12),n(13);var o=n(14),a=r(o),s=n(19),c=r(s),u=n(20),l=r(u),d=n(21),f=r(d);window.Promise=window.Promise||a.default;var h=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content},p={initialize:i};t.app=p}).call(t,n(0))},function(e,t,n){e.exports=n.p+"assets/images/icons/bitbucket.1b09e088.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/github.f0b8504a.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/gitlab.6dd19c00.svg"},function(e,t){},function(e,t){},function(e,t){!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=function(e,t){var n,r;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},n=document.createEvent("CustomEvent"),n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};t.prototype=window.Event.prototype,window.CustomEvent=t}}()},function(e,t,n){window.fetch||(window.fetch=n(2).default||n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){function r(){}function i(e,t){return function(){e.apply(t,arguments)}}function o(e){if(!(this instanceof o))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],d(e,this)}function a(e,t){for(;3===e._state;)e=e._value;if(0===e._state)return void e._deferreds.push(t);e._handled=!0,o._immediateFn(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null===n)return void(1===e._state?s:c)(t.promise,e._value);var r;try{r=n(e._value)}catch(e){return void c(t.promise,e)}s(t.promise,r)})}function s(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if(t instanceof o)return e._state=3,e._value=t,void u(e);if("function"==typeof n)return void d(i(n,t),e)}e._state=1,e._value=t,u(e)}catch(t){c(e,t)}}function c(e,t){e._state=2,e._value=t,u(e)}function u(e){2===e._state&&0===e._deferreds.length&&o._immediateFn(function(){e._handled||o._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;t=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(16),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(t,n(1))},function(e,t,n){(function(e,t){!function(e,n){"use strict";function r(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,r.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,r.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}();e.exports=a})},function(e,t,n){function r(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!s.string(t))throw new TypeError("Second argument must be a String");if(!s.fn(n))throw new TypeError("Third argument must be a Function");if(s.node(e))return i(e,t,n);if(s.nodeList(e))return o(e,t,n);if(s.string(e))return a(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}function o(e,t,n){return Array.prototype.forEach.call(e,function(e){e.addEventListener(t,n)}),{destroy:function(){Array.prototype.forEach.call(e,function(e){e.removeEventListener(t,n)})}}}function a(e,t,n){return c(document.body,e,t,n)}var s=n(6),c=n(5);e.exports=r},function(e,t){function n(){}n.prototype={on:function(e,t,n){var r=this.e||(this.e={});return(r[e]||(r[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){function r(){i.off(e,r),t.apply(n,arguments)}var i=this;return r._=t,this.on(e,r,n)},emit:function(e){var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),r=0,i=n.length;for(r;r0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===f(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=(0,d.default)(e,"click",function(e){return t.onClick(e)})}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new u.default({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return c("action",e)}},{key:"defaultTarget",value:function(e){var t=c("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return c("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach(function(e){n=n&&!!document.queryCommandSupported(e)}),n}}]),t}(l.default);e.exports=p})},function(e,t){function n(e,t){for(;e&&e.nodeType!==r;){if("function"==typeof e.matches&&e.matches(t))return e;e=e.parentNode}}var r=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}e.exports=n},function(e,t,n){function r(e,t,n,r,i){var a=o.apply(this,arguments);return e.addEventListener(n,a,i),{destroy:function(){e.removeEventListener(n,a,i)}}}function i(e,t,n,i,o){return"function"==typeof e.addEventListener?r.apply(null,arguments):"function"==typeof n?r.bind(null,document).apply(null,arguments):("string"==typeof e&&(e=document.querySelectorAll(e)),Array.prototype.map.call(e,function(e){return r(e,t,n,i,o)}))}function o(e,t,n,r){return function(n){n.delegateTarget=a(n.target,t),n.delegateTarget&&r.call(e,n)}}var a=n(4);e.exports=i},function(e,t){t.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},t.nodeList=function(e){var n=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in e&&(0===e.length||t.node(e[0]))},t.string=function(e){return"string"==typeof e||e instanceof String},t.fn=function(e){return"[object Function]"===Object.prototype.toString.call(e)}},function(e,t){function n(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var r=window.getSelection(),i=document.createRange();i.selectNodeContents(e),r.removeAllRanges(),r.addRange(i),t=r.toString()}return t}e.exports=n}])})},function(e,t,n){var r;!function(){"use strict";function i(e,t){var n;if(t=t||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=t.touchBoundary||10,this.layer=e,this.tapDelay=t.tapDelay||200,this.tapTimeout=t.tapTimeout||700,!i.notNeeded(e)){for(var r=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],o=this,s=0,c=r.length;s=0,a=navigator.userAgent.indexOf("Android")>0&&!o,s=/iP(ad|hone|od)/.test(navigator.userAgent)&&!o,c=s&&/OS 4_\d(_\d)?/.test(navigator.userAgent),u=s&&/OS [6-7]_\d/.test(navigator.userAgent),l=navigator.userAgent.indexOf("BB10")>0;i.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(s&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},i.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!a;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},i.prototype.sendClick=function(e,t){var n,r;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),r=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,r.screenX,r.screenY,r.clientX,r.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},i.prototype.determineEventType=function(e){return a&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},i.prototype.focus=function(e){var t;s&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},i.prototype.updateScrollParent=function(e){var t,n;if(!(t=e.fastClickScrollParent)||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},i.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},i.prototype.onTouchStart=function(e){var t,n,r;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],s){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!c){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTimen||Math.abs(t.pageY-this.touchStartY)>n},i.prototype.onTouchMove=function(e){return!this.trackingClick||((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0)},i.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},i.prototype.onTouchEnd=function(e){var t,n,r,i,o,l=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,u&&(o=e.changedTouches[0],l=document.elementFromPoint(o.pageX-window.pageXOffset,o.pageY-window.pageYOffset)||l,l.fastClickScrollParent=this.targetElement.fastClickScrollParent),"label"===(r=l.tagName.toLowerCase())){if(t=this.findControl(l)){if(this.focus(l),a)return!1;l=t}}else if(this.needsFocus(l))return e.timeStamp-n>100||s&&window.top!==window&&"input"===r?(this.targetElement=null,!1):(this.focus(l),this.sendClick(l,e),s&&"select"===r||(this.targetElement=null,e.preventDefault()),!1);return!(!s||c||!(i=l.fastClickScrollParent)||i.fastClickLastScrollTop===i.scrollTop)||(this.needsClick(l)||(e.preventDefault(),this.sendClick(l,e)),!1)},i.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},i.prototype.onMouse=function(e){return!this.targetElement||(!!e.forwardedTouchEvent||(!e.cancelable||(!(!this.needsClick(this.targetElement)||this.cancelNextClick)||(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1))))},i.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail||(t=this.onMouse(e),t||(this.targetElement=null),t)},i.prototype.destroy=function(){var e=this.layer;a&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},i.notNeeded=function(e){var t,n,r;if(void 0===window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!a)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(l&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction||(!!(+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]>=27&&(t=document.querySelector("meta[name=viewport]"))&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))||("none"===e.style.touchAction||"manipulation"===e.style.touchAction))},i.attach=function(e,t){return new i(e,t)},void 0!==(r=function(){return i}.call(t,n,t,e))&&(e.exports=r)}()},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(22),o=r(i),a=n(24),s=r(a),c=n(27),u=r(c),l=n(31),d=r(l),f=n(37),h=r(f),p=n(39),m=r(p),v=n(45),y=r(v);t.default={Event:o.default,Header:s.default,Nav:u.default,Search:d.default,Sidebar:h.default,Source:m.default,Tabs:y.default}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(3),o=r(i),a=n(23),s=r(a);t.default={Listener:o.default,MatchMedia:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(3),o=(function(e){e&&e.__esModule}(i),function e(t,n){r(this,e),this.handler_=function(e){e.matches?n.listen():n.unlisten()};var i=window.matchMedia(t);i.addListener(this.handler_),this.handler_(i)});t.default=o},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(25),o=r(i),a=n(26),s=r(a);t.default={Shadow:o.default,Title:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i.parentNode,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.active_=!1}return e.prototype.setup=function(){for(var e=this.el_;e=e.previousElementSibling;){if(!(e instanceof HTMLElement))throw new ReferenceError;this.height_+=e.offsetHeight}this.update()},e.prototype.update=function(e){if(!e||"resize"!==e.type&&"orientationchange"!==e.type){var t=window.pageYOffset>=this.height_;t!==this.active_&&(this.header_.dataset.mdState=(this.active_=t)?"shadow":"")}else this.height_=0,this.setup()},e.prototype.reset=function(){this.header_.dataset.mdState="",this.height_=0,this.active_=!1},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement))throw new ReferenceError;if(this.el_=i,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLHeadingElement))throw new ReferenceError;this.header_=i,this.active_=!1}return e.prototype.setup=function(){var e=this;Array.prototype.forEach.call(this.el_.children,function(t){t.style.width=e.el_.offsetWidth-20+"px"})},e.prototype.update=function(e){var t=this,n=window.pageYOffset>=this.header_.offsetTop;n!==this.active_&&(this.el_.dataset.mdState=(this.active_=n)?"active":""),"resize"!==e.type&&"orientationchange"!==e.type||Array.prototype.forEach.call(this.el_.children,function(e){e.style.width=t.el_.offsetWidth-20+"px"})},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.width="",this.active_=!1},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(28),o=r(i),a=n(29),s=r(a),c=n(30),u=r(c);t.default={Blur:o.default,Collapse:s.default,Scrolling:u.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e),this.els_="string"==typeof t?document.querySelectorAll(t):t,this.index_=0,this.offset_=window.pageYOffset,this.dir_=!1,this.anchors_=[].reduce.call(this.els_,function(e,t){return e.concat(document.getElementById(t.hash.substring(1))||[])},[])}return e.prototype.setup=function(){this.update()},e.prototype.update=function(){var e=window.pageYOffset,t=this.offset_-e<0;if(this.dir_!==t&&(this.index_=this.index_=t?0:this.els_.length-1),0!==this.anchors_.length){if(this.offset_<=e)for(var n=this.index_+1;n0&&(this.els_[n-1].dataset.mdState="blur"),this.index_=n;else for(var r=this.index_;r>=0;r--){if(!(this.anchors_[r].offsetTop-80>e)){this.index_=r;break}r>0&&(this.els_[r-1].dataset.mdState="")}this.offset_=e,this.dir_=t}},e.prototype.reset=function(){Array.prototype.forEach.call(this.els_,function(e){e.dataset.mdState=""}),this.index_=0,this.offset_=window.pageYOffset},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return e.prototype.setup=function(){var e=this.el_.getBoundingClientRect().height;this.el_.style.display=e?"block":"none",this.el_.style.overflow=e?"visible":"hidden"},e.prototype.update=function(){var e=this,t=this.el_.getBoundingClientRect().height;if(this.el_.style.display="block",this.el_.style.overflow="",t)this.el_.style.maxHeight=t+"px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight="0px"});else{this.el_.setAttribute("data-md-state","expand"),this.el_.style.maxHeight="";var n=this.el_.getBoundingClientRect().height;this.el_.removeAttribute("data-md-state"),this.el_.style.maxHeight="0px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight=n+"px"})}var r=function e(n){var r=n.target;if(!(r instanceof HTMLElement))throw new ReferenceError;r.removeAttribute("data-md-state"),r.style.maxHeight="",r.style.display=t?"none":"block",r.style.overflow=t?"hidden":"visible",r.removeEventListener("transitionend",e)};this.el_.addEventListener("transitionend",r,!1)},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.maxHeight="",this.el_.style.display="",this.el_.style.overflow=""},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return e.prototype.setup=function(){this.el_.children[this.el_.children.length-1].style.webkitOverflowScrolling="touch";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling="touch"}})},e.prototype.update=function(e){var t=e.target;if(!(t instanceof HTMLElement))throw new ReferenceError;var n=t.nextElementSibling;if(!(n instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==n.tagName&&n.nextElementSibling;)n=n.nextElementSibling;if(!(t.parentNode instanceof HTMLElement&&t.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var r=t.parentNode.parentNode,i=n.children[n.children.length-1];if(r.style.webkitOverflowScrolling="",i.style.webkitOverflowScrolling="",!t.checked){var o=function e(){n instanceof HTMLElement&&(r.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",o,!1)}if(t.checked){var a=function e(){n instanceof HTMLElement&&(i.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",a,!1)}},e.prototype.reset=function(){this.el_.children[1].style.webkitOverflowScrolling="";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling=""}})},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(32),o=r(i),a=n(33),s=r(a);t.default={Lock:o.default,Result:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(this.el_=n,!document.body)throw new ReferenceError;this.lock_=document.body}return e.prototype.setup=function(){this.update()},e.prototype.update=function(){var e=this;this.el_.checked?(this.offset_=window.pageYOffset,setTimeout(function(){window.scrollTo(0,0),e.el_.checked&&(e.lock_.dataset.mdState="lock")},400)):(this.lock_.dataset.mdState="",setTimeout(function(){void 0!==e.offset_&&window.scrollTo(0,e.offset_)},100))},e.prototype.reset=function(){"lock"===this.lock_.dataset.mdState&&window.scrollTo(0,this.offset_),this.lock_.dataset.mdState=""},e}();t.default=i},function(e,t,n){"use strict";(function(e){function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=n(34),a=r(o),s=n(35),c=r(s),u=function(e,t){var n=t;if(e.length>n){for(;" "!==e[n]&&--n>0;);return e.substring(0,n)+"..."}return e},l=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content},d=function(){function t(e,n){i(this,t);var r="string"==typeof e?document.querySelector(e):e;if(!(r instanceof HTMLElement))throw new ReferenceError;this.el_=r;var o=Array.prototype.slice.call(this.el_.children),a=o[0],s=o[1];this.data_=n,this.meta_=a,this.list_=s,this.message_={placeholder:this.meta_.textContent,none:l("search.result.none"),one:l("search.result.one"),other:l("search.result.other")};var u=l("search.tokenizer");u.length&&(c.default.tokenizer.separator=u),this.lang_=l("search.language").split(",").filter(Boolean).map(function(e){return e.trim()})}return t.prototype.update=function(t){var n=this;if("focus"!==t.type||this.index_){if("focus"===t.type||"keyup"===t.type){var r=t.target;if(!(r instanceof HTMLInputElement))throw new ReferenceError;if(!this.index_||r.value===this.value_)return;for(;this.list_.firstChild;)this.list_.removeChild(this.list_.firstChild);if(this.value_=r.value,0===this.value_.length)return void(this.meta_.textContent=this.message_.placeholder);var i=this.index_.query(function(e){n.value_.toLowerCase().split(" ").filter(Boolean).forEach(function(t){e.term(t,{wildcard:c.default.Query.wildcard.TRAILING})})}).reduce(function(e,t){var r=n.docs_.get(t.ref);if(r.parent){var i=r.parent.location;e.set(i,(e.get(i)||[]).concat(t))}else{var o=r.location;e.set(o,e.get(o)||[])}return e},new Map),o=(0,a.default)(this.value_.trim()).replace(new RegExp(c.default.tokenizer.separator,"img"),"|"),s=new RegExp("(^|"+c.default.tokenizer.separator+")("+o+")","img"),d=function(e,t,n){return t+""+n+""};this.stack_=[],i.forEach(function(t,r){var i,o=n.docs_.get(r),a=e.createElement("li",{class:"md-search-result__item"},e.createElement("a",{href:o.location,title:o.title,class:"md-search-result__link",tabindex:"-1"},e.createElement("article",{class:"md-search-result__article md-search-result__article--document"},e.createElement("h1",{class:"md-search-result__title"},{__html:o.title.replace(s,d)}),o.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:o.text.replace(s,d)}):{}))),c=t.map(function(t){return function(){var r=n.docs_.get(t.ref);a.appendChild(e.createElement("a",{href:r.location,title:r.title,class:"md-search-result__link","data-md-rel":"anchor",tabindex:"-1"},e.createElement("article",{class:"md-search-result__article"},e.createElement("h1",{class:"md-search-result__title"},{__html:r.title.replace(s,d)}),r.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:u(r.text.replace(s,d),400)}):{})))}});(i=n.stack_).push.apply(i,[function(){return n.list_.appendChild(a)}].concat(c))});var f=this.el_.parentNode;if(!(f instanceof HTMLElement))throw new ReferenceError;for(;this.stack_.length&&f.offsetHeight>=f.scrollHeight-16;)this.stack_.shift()();var h=this.list_.querySelectorAll("[data-md-rel=anchor]");switch(Array.prototype.forEach.call(h,function(e){["click","keydown"].forEach(function(t){e.addEventListener(t,function(n){if("keydown"!==t||13===n.keyCode){var r=document.querySelector("[data-md-toggle=search]");if(!(r instanceof HTMLInputElement))throw new ReferenceError;r.checked&&(r.checked=!1,r.dispatchEvent(new CustomEvent("change"))),n.preventDefault(),setTimeout(function(){document.location.href=e.href},100)}})})}),i.size){case 0:this.meta_.textContent=this.message_.none;break;case 1:this.meta_.textContent=this.message_.one;break;default:this.meta_.textContent=this.message_.other.replace("#",i.size)}}}else{var p=function(e){n.docs_=e.reduce(function(e,t){var n=t.location.split("#"),r=n[0];return n[1]&&(t.parent=e.get(r),t.parent&&!t.parent.done&&(t.parent.title=t.title,t.parent.text=t.text,t.parent.done=!0)),t.text=t.text.replace(/\n/g," ").replace(/\s+/g," ").replace(/\s+([,.:;!?])/g,function(e,t){return t}),t.parent&&t.parent.title===t.title||e.set(t.location,t),e},new Map);var t=n.docs_,r=n.lang_;n.stack_=[],n.index_=(0,c.default)(function(){var e,n=this,i={"search.pipeline.trimmer":c.default.trimmer,"search.pipeline.stopwords":c.default.stopWordFilter},o=Object.keys(i).reduce(function(e,t){return l(t).match(/^false$/i)||e.push(i[t]),e},[]);this.pipeline.reset(),o&&(e=this.pipeline).add.apply(e,o),1===r.length&&"en"!==r[0]&&c.default[r[0]]?this.use(c.default[r[0]]):r.length>1&&this.use(c.default.multiLanguage.apply(c.default,r)),this.field("title",{boost:10}),this.field("text"),this.ref("location"),t.forEach(function(e){return n.add(e)})});var i=n.el_.parentNode;if(!(i instanceof HTMLElement))throw new ReferenceError;i.addEventListener("scroll",function(){for(;n.stack_.length&&i.scrollTop+i.offsetHeight>=i.scrollHeight-16;)n.stack_.splice(0,10).forEach(function(e){return e()})})};setTimeout(function(){return"function"==typeof n.data_?n.data_().then(p):p(n.data_)},250)}},t}();t.default=d}).call(t,n(0))},function(e,t,n){"use strict";var r=/[|\\{}()[\]^$+*?.]/g;e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(r,"\\$&")}},function(e,t,n){(function(t){e.exports=t.lunr=n(36)}).call(t,n(1))},function(e,t,n){var r,i;!function(){var o=function(e){var t=new o.Builder;return t.pipeline.add(o.trimmer,o.stopWordFilter,o.stemmer),t.searchPipeline.add(o.stemmer),e.call(t,t),t.build()};o.version="2.1.5",o.utils={},o.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),o.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},o.FieldRef=function(e,t,n){this.docRef=e,this.fieldName=t,this._stringValue=n},o.FieldRef.joiner="/",o.FieldRef.fromString=function(e){var t=e.indexOf(o.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var n=e.slice(0,t),r=e.slice(t+1);return new o.FieldRef(r,n,e)},o.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+o.FieldRef.joiner+this.docRef),this._stringValue},o.idf=function(e,t){var n=0;for(var r in e)"_index"!=r&&(n+=Object.keys(e[r]).length);var i=(t-n+.5)/(n+.5);return Math.log(1+Math.abs(i))},o.Token=function(e,t){this.str=e||"",this.metadata=t||{}},o.Token.prototype.toString=function(){return this.str},o.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},o.Token.prototype.clone=function(e){return e=e||function(e){return e},new o.Token(e(this.str,this.metadata),this.metadata)},o.tokenizer=function(e){if(null==e||void 0==e)return[];if(Array.isArray(e))return e.map(function(e){return new o.Token(o.utils.asString(e).toLowerCase())});for(var t=e.toString().trim().toLowerCase(),n=t.length,r=[],i=0,a=0;i<=n;i++){var s=t.charAt(i),c=i-a;(s.match(o.tokenizer.separator)||i==n)&&(c>0&&r.push(new o.Token(t.slice(a,i),{position:[a,c],index:r.length})),a=i+1)}return r},o.tokenizer.separator=/[\s\-]+/,o.Pipeline=function(){this._stack=[]},o.Pipeline.registeredFunctions=Object.create(null),o.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&o.utils.warn("Overwriting existing registered function: "+t),e.label=t,o.Pipeline.registeredFunctions[e.label]=e},o.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||o.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},o.Pipeline.load=function(e){var t=new o.Pipeline;return e.forEach(function(e){var n=o.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)}),t},o.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){o.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},o.Pipeline.prototype.after=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},o.Pipeline.prototype.before=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},o.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},o.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=i),o!=e);)r=n-t,i=t+Math.floor(r/2),o=this.elements[2*i];return o==e?2*i:o>e?2*i:os?u+=2:a==s&&(t+=n[c+1]*r[u+1],c+=2,u+=2);return t},o.Vector.prototype.similarity=function(e){return this.dot(e)/(this.magnitude()*e.magnitude())},o.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,s=i.str.charAt(0);s in i.node.edges?a=i.node.edges[s]:(a=new o.TokenSet,i.node.edges[s]=a),1==i.str.length?a.final=!0:r.push({node:a,editsRemaining:i.editsRemaining,str:i.str.slice(1)})}if(i.editsRemaining>0&&i.str.length>1){var c,s=i.str.charAt(1);s in i.node.edges?c=i.node.edges[s]:(c=new o.TokenSet,i.node.edges[s]=c),i.str.length<=2?c.final=!0:r.push({node:c,editsRemaining:i.editsRemaining-1,str:i.str.slice(2)})}if(i.editsRemaining>0&&1==i.str.length&&(i.node.final=!0),i.editsRemaining>0&&i.str.length>=1){if("*"in i.node.edges)var u=i.node.edges["*"];else{var u=new o.TokenSet;i.node.edges["*"]=u}1==i.str.length?u.final=!0:r.push({node:u,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)})}if(i.editsRemaining>0){if("*"in i.node.edges)var l=i.node.edges["*"];else{var l=new o.TokenSet;i.node.edges["*"]=l}0==i.str.length?l.final=!0:r.push({node:l,editsRemaining:i.editsRemaining-1,str:i.str})}if(i.editsRemaining>0&&i.str.length>1){var d,f=i.str.charAt(0),h=i.str.charAt(1);h in i.node.edges?d=i.node.edges[h]:(d=new o.TokenSet,i.node.edges[h]=d),1==i.str.length?d.final=!0:r.push({node:d,editsRemaining:i.editsRemaining-1,str:f+i.str.slice(2)})}}return n},o.TokenSet.fromString=function(e){for(var t=new o.TokenSet,n=t,r=!1,i=0,a=e.length;i=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},o.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},o.Index.prototype.search=function(e){return this.query(function(t){new o.QueryParser(e,t).parse()})},o.Index.prototype.query=function(e){var t=new o.Query(this.fields),n=Object.create(null),r=Object.create(null),i=Object.create(null);e.call(t,t);for(var a=0;a1?1:e},o.Builder.prototype.k1=function(e){this._k1=e},o.Builder.prototype.add=function(e){var t=e[this._ref];this.documentCount+=1;for(var n=0;n=this.length)return o.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},o.QueryLexer.prototype.width=function(){return this.pos-this.start},o.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},o.QueryLexer.prototype.backup=function(){this.pos-=1},o.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{e=this.next(),t=e.charCodeAt(0)}while(t>47&&t<58);e!=o.QueryLexer.EOS&&this.backup()},o.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(o.QueryLexer.TERM)),e.ignore(),e.more())return o.QueryLexer.lexText},o.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.EDIT_DISTANCE),o.QueryLexer.lexText},o.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.BOOST),o.QueryLexer.lexText},o.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(o.QueryLexer.TERM)},o.QueryLexer.termSeparator=o.tokenizer.separator,o.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==o.QueryLexer.EOS)return o.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return o.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexBoost;if(t.match(o.QueryLexer.termSeparator))return o.QueryLexer.lexTerm}else e.escapeCharacter()}},o.QueryParser=function(e,t){this.lexer=new o.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},o.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=o.QueryParser.parseFieldOrTerm;e;)e=e(this);return this.query},o.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},o.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},o.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},o.QueryParser.parseFieldOrTerm=function(e){var t=e.peekLexeme();if(void 0!=t)switch(t.type){case o.QueryLexer.FIELD:return o.QueryParser.parseField;case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new o.QueryParseError(n,t.start,t.end)}},o.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(void 0!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var i=e.peekLexeme();if(void 0==i){var r="expecting term, found nothing";throw new o.QueryParseError(r,t.start,t.end)}switch(i.type){case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var r="expecting term, found '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(void 0!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(void 0==n)return void e.nextClause();switch(n.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+n.type+"'";throw new o.QueryParseError(r,n.start,n.end)}}},o.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},function(o,a){r=a,void 0!==(i="function"==typeof r?r.call(t,n,t,e):r)&&(e.exports=i)}(0,function(){return o})}()},function(e,t,n){"use strict";t.__esModule=!0;var r=n(38),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default={Position:i.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i,this.parent_=i.parentNode,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.pad_="fixed"===window.getComputedStyle(this.header_).position}return e.prototype.setup=function(){var e=Array.prototype.reduce.call(this.parent_.children,function(e,t){return Math.max(e,t.offsetTop)},0);this.offset_=e-(this.pad_?this.header_.offsetHeight:0),this.update()},e.prototype.update=function(e){var t=window.pageYOffset,n=window.innerHeight;e&&"resize"===e.type&&this.setup();var r={top:this.pad_?this.header_.offsetHeight:0,bottom:this.parent_.offsetTop+this.parent_.offsetHeight},i=n-r.top-Math.max(0,this.offset_-t)-Math.max(0,t+n-r.bottom);i!==this.height_&&(this.el_.style.height=(this.height_=i)+"px"),t>=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(40),o=r(i),a=n(44),s=r(a);t.default={Adapter:o.default,Repository:s.default}},function(e,t,n){"use strict";t.__esModule=!0;var r=n(41),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default={GitHub:i.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var a=n(42),s=function(e){return e&&e.__esModule?e:{default:e}}(a),c=function(e){function t(n){r(this,t);var o=i(this,e.call(this,n)),a=/^.+github\.com\/([^\/]+)\/?([^\/]+)?.*$/.exec(o.base_);if(a&&3===a.length){var s=a[1],c=a[2];o.base_="https://api.github.com/users/"+s+"/repos",o.name_=c}return o}return o(t,e),t.prototype.fetch_=function(){var e=this;return function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return fetch(e.base_+"?per_page=30&page="+n).then(function(e){return e.json()}).then(function(r){if(!(r instanceof Array))throw new TypeError;if(e.name_){var i=r.find(function(t){return t.name===e.name_});return i||30!==r.length?i?[e.format_(i.stargazers_count)+" Stars",e.format_(i.forks_count)+" Forks"]:[]:t(n+1)}return[r.length+" Repositories"]})}()},t}(s.default);t.default=c},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(43),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLAnchorElement))throw new ReferenceError;this.el_=n,this.base_=this.el_.href,this.salt_=this.hash_(this.base_)}return e.prototype.fetch=function(){var e=this;return new Promise(function(t){var n=o.default.getJSON(e.salt_+".cache-source");void 0!==n?t(n):e.fetch_().then(function(n){o.default.set(e.salt_+".cache-source",n,{expires:1/96}),t(n)})})},e.prototype.fetch_=function(){throw new Error("fetch_(): Not implemented")},e.prototype.format_=function(e){return e>1e4?(e/1e3).toFixed(0)+"k":e>1e3?(e/1e3).toFixed(1)+"k":""+e},e.prototype.hash_=function(e){var t=0;if(0===e.length)return t;for(var n=0,r=e.length;n1){if(o=e({path:"/"},r.defaults,o),"number"==typeof o.expires){var s=new Date;s.setMilliseconds(s.getMilliseconds()+864e5*o.expires),o.expires=s}o.expires=o.expires?o.expires.toUTCString():"";try{a=JSON.stringify(i),/^[\{\[]/.test(a)&&(i=a)}catch(e){}i=n.write?n.write(i,t):encodeURIComponent(String(i)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),t=encodeURIComponent(String(t)),t=t.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),t=t.replace(/[\(\)]/g,escape);var c="";for(var u in o)o[u]&&(c+="; "+u,!0!==o[u]&&(c+="="+o[u]));return document.cookie=t+"="+i+c}t||(a={});for(var l=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,f=0;f=this.el_.children[0].offsetTop+-43;e!==this.active_&&(this.el_.dataset.mdState=(this.active_=e)?"hidden":"")},e.prototype.reset=function(){this.el_.dataset.mdState="",this.active_=!1},e}();t.default=i}])); \ No newline at end of file diff --git a/assets/javascripts/application.583bbe55.js b/assets/javascripts/application.583bbe55.js new file mode 100644 index 000000000..7cc20810e --- /dev/null +++ b/assets/javascripts/application.583bbe55.js @@ -0,0 +1 @@ +!function(e,t){for(var n in t)e[n]=t[n]}(window,function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,n){"use strict";t.__esModule=!0,t.default={createElement:function(e,t){var n=document.createElement(e);t&&Array.prototype.forEach.call(Object.keys(t),function(e){n.setAttribute(e,t[e])});for(var r=arguments.length,i=Array(r>2?r-2:0),o=2;o pre, pre > code");Array.prototype.forEach.call(n,function(t,n){var r="__code_"+n,i=e.createElement("button",{class:"md-clipboard",title:h("clipboard.copy"),"data-clipboard-target":"#"+r+" pre, #"+r+" code"},e.createElement("span",{class:"md-clipboard__message"})),o=t.parentNode;o.id=r,o.insertBefore(i,t)});new c.default(".md-clipboard").on("success",function(e){var t=e.trigger.querySelector(".md-clipboard__message");if(!(t instanceof HTMLElement))throw new ReferenceError;e.clearSelection(),t.dataset.mdTimer&&clearTimeout(parseInt(t.dataset.mdTimer,10)),t.classList.add("md-clipboard__message--active"),t.innerHTML=h("clipboard.copied"),t.dataset.mdTimer=setTimeout(function(){t.classList.remove("md-clipboard__message--active"),t.dataset.mdTimer=""},2e3).toString()})}if(!Modernizr.details){var r=document.querySelectorAll("details > summary");Array.prototype.forEach.call(r,function(e){e.addEventListener("click",function(e){var t=e.target.parentNode;t.hasAttribute("open")?t.removeAttribute("open"):t.setAttribute("open","")})})}var i=function(){if(document.location.hash){var e=document.getElementById(document.location.hash.substring(1));if(!e)return;for(var t=e.parentNode;t&&!(t instanceof HTMLDetailsElement);)t=t.parentNode;if(t&&!t.open){t.open=!0;var n=location.hash;location.hash=" ",location.hash=n}}};if(window.addEventListener("hashchange",i),i(),Modernizr.ios){var o=document.querySelectorAll("[data-md-scrollfix]");Array.prototype.forEach.call(o,function(e){e.addEventListener("touchstart",function(){var t=e.scrollTop;0===t?e.scrollTop=1:t+e.offsetHeight===e.scrollHeight&&(e.scrollTop=t-1)})})}}).listen(),new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Header.Shadow("[data-md-component=container]","[data-md-component=header]")).listen(),new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Header.Title("[data-md-component=title]",".md-typeset h1")).listen(),document.querySelector("[data-md-component=hero]")&&new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Tabs.Toggle("[data-md-component=hero]")).listen(),document.querySelector("[data-md-component=tabs]")&&new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Tabs.Toggle("[data-md-component=tabs]")).listen(),new f.default.Event.MatchMedia("(min-width: 1220px)",new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Sidebar.Position("[data-md-component=navigation]","[data-md-component=header]"))),document.querySelector("[data-md-component=toc]")&&new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Sidebar.Position("[data-md-component=toc]","[data-md-component=header]"))),new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener(window,"scroll",new f.default.Nav.Blur("[data-md-component=toc] [href]")));var n=document.querySelectorAll("[data-md-component=collapsible]");Array.prototype.forEach.call(n,function(e){new f.default.Event.MatchMedia("(min-width: 1220px)",new f.default.Event.Listener(e.previousElementSibling,"click",new f.default.Nav.Collapse(e)))}),new f.default.Event.MatchMedia("(max-width: 1219px)",new f.default.Event.Listener("[data-md-component=navigation] [data-md-toggle]","change",new f.default.Nav.Scrolling("[data-md-component=navigation] nav"))),document.querySelector("[data-md-component=search]")&&(new f.default.Event.MatchMedia("(max-width: 959px)",new f.default.Event.Listener("[data-md-toggle=search]","change",new f.default.Search.Lock("[data-md-toggle=search]"))),new f.default.Event.Listener("[data-md-component=query]",["focus","keyup","change"],new f.default.Search.Result("[data-md-component=result]",function(){return fetch(t.url.base+"/"+(t.version<"0.17"?"mkdocs":"search")+"/search_index.json",{credentials:"same-origin"}).then(function(e){return e.json()}).then(function(e){return e.docs.map(function(e){return e.location=t.url.base+"/"+e.location,e})})})).listen(),new f.default.Event.Listener("[data-md-component=reset]","click",function(){setTimeout(function(){var e=document.querySelector("[data-md-component=query]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.focus()},10)}).listen(),new f.default.Event.Listener("[data-md-toggle=search]","change",function(e){setTimeout(function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.focus()}},400,e.target)}).listen(),new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener("[data-md-component=query]","focus",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked||(e.checked=!0,e.dispatchEvent(new CustomEvent("change")))})),new f.default.Event.Listener(window,"keydown",function(e){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;var n=document.querySelector("[data-md-component=query]");if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(!e.metaKey&&!e.ctrlKey)if(t.checked){if(13===e.keyCode){if(n===document.activeElement){e.preventDefault();var r=document.querySelector("[data-md-component=search] [href][data-md-state=active]");r instanceof HTMLLinkElement&&(window.location=r.getAttribute("href"),t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur())}}else if(9===e.keyCode||27===e.keyCode)t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur();else if(-1!==[8,37,39].indexOf(e.keyCode))n!==document.activeElement&&n.focus();else if(-1!==[38,40].indexOf(e.keyCode)){var i=e.keyCode,o=Array.prototype.slice.call(document.querySelectorAll("[data-md-component=query], [data-md-component=search] [href]")),a=o.find(function(e){if(!(e instanceof HTMLElement))throw new ReferenceError;return"active"===e.dataset.mdState});a&&(a.dataset.mdState="");var s=Math.max(0,(o.indexOf(a)+o.length+(38===i?-1:1))%o.length);return o[s]&&(o[s].dataset.mdState="active",o[s].focus()),e.preventDefault(),e.stopPropagation(),!1}}else document.activeElement&&!document.activeElement.form&&(70!==e.keyCode&&83!==e.keyCode||(n.focus(),e.preventDefault()))}).listen(),new f.default.Event.Listener(window,"keypress",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t!==document.activeElement&&t.focus()}}).listen()),new f.default.Event.Listener(document.body,"keydown",function(e){if(9===e.keyCode){var t=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])");Array.prototype.forEach.call(t,function(e){e.offsetHeight&&(e.tabIndex=0)})}}).listen(),new f.default.Event.Listener(document.body,"mousedown",function(){var e=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]");Array.prototype.forEach.call(e,function(e){e.removeAttribute("tabIndex")})}).listen(),document.body.addEventListener("click",function(){"tabbing"===document.body.dataset.mdState&&(document.body.dataset.mdState="")}),new f.default.Event.MatchMedia("(max-width: 959px)",new f.default.Event.Listener("[data-md-component=navigation] [href^='#']","click",function(){var e=document.querySelector("[data-md-toggle=drawer]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked&&(e.checked=!1,e.dispatchEvent(new CustomEvent("change")))})),function(){var e=document.querySelector("[data-md-source]");if(!e)return a.default.resolve([]);if(!(e instanceof HTMLAnchorElement))throw new ReferenceError;switch(e.dataset.mdSource){case"github":return new f.default.Source.Adapter.GitHub(e).fetch();default:return a.default.resolve([])}}().then(function(e){var t=document.querySelectorAll("[data-md-source]");Array.prototype.forEach.call(t,function(t){new f.default.Source.Repository(t).initialize(e)})})}t.__esModule=!0,t.app=void 0,n(7),n(8),n(9),n(10),n(11),n(12),n(13);var o=n(14),a=r(o),s=n(19),c=r(s),u=n(20),l=r(u),d=n(21),f=r(d);window.Promise=window.Promise||a.default;var h=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content},p={initialize:i};t.app=p}).call(t,n(0))},function(e,t,n){e.exports=n.p+"assets/images/icons/bitbucket.1b09e088.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/github.f0b8504a.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/gitlab.6dd19c00.svg"},function(e,t){},function(e,t){},function(e,t){!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=function(e,t){var n,r;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},n=document.createEvent("CustomEvent"),n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};t.prototype=window.Event.prototype,window.CustomEvent=t}}()},function(e,t,n){window.fetch||(window.fetch=n(2).default||n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){function r(){}function i(e,t){return function(){e.apply(t,arguments)}}function o(e){if(!(this instanceof o))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],d(e,this)}function a(e,t){for(;3===e._state;)e=e._value;if(0===e._state)return void e._deferreds.push(t);e._handled=!0,o._immediateFn(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null===n)return void(1===e._state?s:c)(t.promise,e._value);var r;try{r=n(e._value)}catch(e){return void c(t.promise,e)}s(t.promise,r)})}function s(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if(t instanceof o)return e._state=3,e._value=t,void u(e);if("function"==typeof n)return void d(i(n,t),e)}e._state=1,e._value=t,u(e)}catch(t){c(e,t)}}function c(e,t){e._state=2,e._value=t,u(e)}function u(e){2===e._state&&0===e._deferreds.length&&o._immediateFn(function(){e._handled||o._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;t=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(16),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(t,n(1))},function(e,t,n){(function(e,t){!function(e,n){"use strict";function r(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,r.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,r.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}();e.exports=a})},function(e,t,n){function r(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!s.string(t))throw new TypeError("Second argument must be a String");if(!s.fn(n))throw new TypeError("Third argument must be a Function");if(s.node(e))return i(e,t,n);if(s.nodeList(e))return o(e,t,n);if(s.string(e))return a(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}function o(e,t,n){return Array.prototype.forEach.call(e,function(e){e.addEventListener(t,n)}),{destroy:function(){Array.prototype.forEach.call(e,function(e){e.removeEventListener(t,n)})}}}function a(e,t,n){return c(document.body,e,t,n)}var s=n(6),c=n(5);e.exports=r},function(e,t){function n(){}n.prototype={on:function(e,t,n){var r=this.e||(this.e={});return(r[e]||(r[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){function r(){i.off(e,r),t.apply(n,arguments)}var i=this;return r._=t,this.on(e,r,n)},emit:function(e){var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),r=0,i=n.length;for(r;r0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===f(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=(0,d.default)(e,"click",function(e){return t.onClick(e)})}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new u.default({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return c("action",e)}},{key:"defaultTarget",value:function(e){var t=c("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return c("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach(function(e){n=n&&!!document.queryCommandSupported(e)}),n}}]),t}(l.default);e.exports=p})},function(e,t){function n(e,t){for(;e&&e.nodeType!==r;){if("function"==typeof e.matches&&e.matches(t))return e;e=e.parentNode}}var r=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}e.exports=n},function(e,t,n){function r(e,t,n,r,i){var a=o.apply(this,arguments);return e.addEventListener(n,a,i),{destroy:function(){e.removeEventListener(n,a,i)}}}function i(e,t,n,i,o){return"function"==typeof e.addEventListener?r.apply(null,arguments):"function"==typeof n?r.bind(null,document).apply(null,arguments):("string"==typeof e&&(e=document.querySelectorAll(e)),Array.prototype.map.call(e,function(e){return r(e,t,n,i,o)}))}function o(e,t,n,r){return function(n){n.delegateTarget=a(n.target,t),n.delegateTarget&&r.call(e,n)}}var a=n(4);e.exports=i},function(e,t){t.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},t.nodeList=function(e){var n=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in e&&(0===e.length||t.node(e[0]))},t.string=function(e){return"string"==typeof e||e instanceof String},t.fn=function(e){return"[object Function]"===Object.prototype.toString.call(e)}},function(e,t){function n(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var r=window.getSelection(),i=document.createRange();i.selectNodeContents(e),r.removeAllRanges(),r.addRange(i),t=r.toString()}return t}e.exports=n}])})},function(e,t,n){var r;!function(){"use strict";function i(e,t){var n;if(t=t||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=t.touchBoundary||10,this.layer=e,this.tapDelay=t.tapDelay||200,this.tapTimeout=t.tapTimeout||700,!i.notNeeded(e)){for(var r=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],o=this,s=0,c=r.length;s=0,a=navigator.userAgent.indexOf("Android")>0&&!o,s=/iP(ad|hone|od)/.test(navigator.userAgent)&&!o,c=s&&/OS 4_\d(_\d)?/.test(navigator.userAgent),u=s&&/OS [6-7]_\d/.test(navigator.userAgent),l=navigator.userAgent.indexOf("BB10")>0;i.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(s&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},i.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!a;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},i.prototype.sendClick=function(e,t){var n,r;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),r=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,r.screenX,r.screenY,r.clientX,r.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},i.prototype.determineEventType=function(e){return a&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},i.prototype.focus=function(e){var t;s&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},i.prototype.updateScrollParent=function(e){var t,n;if(!(t=e.fastClickScrollParent)||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},i.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},i.prototype.onTouchStart=function(e){var t,n,r;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],s){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!c){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTimen||Math.abs(t.pageY-this.touchStartY)>n},i.prototype.onTouchMove=function(e){return!this.trackingClick||((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0)},i.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},i.prototype.onTouchEnd=function(e){var t,n,r,i,o,l=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,u&&(o=e.changedTouches[0],l=document.elementFromPoint(o.pageX-window.pageXOffset,o.pageY-window.pageYOffset)||l,l.fastClickScrollParent=this.targetElement.fastClickScrollParent),"label"===(r=l.tagName.toLowerCase())){if(t=this.findControl(l)){if(this.focus(l),a)return!1;l=t}}else if(this.needsFocus(l))return e.timeStamp-n>100||s&&window.top!==window&&"input"===r?(this.targetElement=null,!1):(this.focus(l),this.sendClick(l,e),s&&"select"===r||(this.targetElement=null,e.preventDefault()),!1);return!(!s||c||!(i=l.fastClickScrollParent)||i.fastClickLastScrollTop===i.scrollTop)||(this.needsClick(l)||(e.preventDefault(),this.sendClick(l,e)),!1)},i.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},i.prototype.onMouse=function(e){return!this.targetElement||(!!e.forwardedTouchEvent||(!e.cancelable||(!(!this.needsClick(this.targetElement)||this.cancelNextClick)||(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1))))},i.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail||(t=this.onMouse(e),t||(this.targetElement=null),t)},i.prototype.destroy=function(){var e=this.layer;a&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},i.notNeeded=function(e){var t,n,r;if(void 0===window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!a)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(l&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction||(!!(+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]>=27&&(t=document.querySelector("meta[name=viewport]"))&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))||("none"===e.style.touchAction||"manipulation"===e.style.touchAction))},i.attach=function(e,t){return new i(e,t)},void 0!==(r=function(){return i}.call(t,n,t,e))&&(e.exports=r)}()},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(22),o=r(i),a=n(24),s=r(a),c=n(27),u=r(c),l=n(31),d=r(l),f=n(37),h=r(f),p=n(39),m=r(p),v=n(45),y=r(v);t.default={Event:o.default,Header:s.default,Nav:u.default,Search:d.default,Sidebar:h.default,Source:m.default,Tabs:y.default}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(3),o=r(i),a=n(23),s=r(a);t.default={Listener:o.default,MatchMedia:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(3),o=(function(e){e&&e.__esModule}(i),function e(t,n){r(this,e),this.handler_=function(e){e.matches?n.listen():n.unlisten()};var i=window.matchMedia(t);i.addListener(this.handler_),this.handler_(i)});t.default=o},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(25),o=r(i),a=n(26),s=r(a);t.default={Shadow:o.default,Title:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i.parentNode,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.active_=!1}return e.prototype.setup=function(){for(var e=this.el_;e=e.previousElementSibling;){if(!(e instanceof HTMLElement))throw new ReferenceError;this.height_+=e.offsetHeight}this.update()},e.prototype.update=function(e){if(!e||"resize"!==e.type&&"orientationchange"!==e.type){var t=window.pageYOffset>=this.height_;t!==this.active_&&(this.header_.dataset.mdState=(this.active_=t)?"shadow":"")}else this.height_=0,this.setup()},e.prototype.reset=function(){this.header_.dataset.mdState="",this.height_=0,this.active_=!1},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement))throw new ReferenceError;if(this.el_=i,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLHeadingElement))throw new ReferenceError;this.header_=i,this.active_=!1}return e.prototype.setup=function(){var e=this;Array.prototype.forEach.call(this.el_.children,function(t){t.style.width=e.el_.offsetWidth-20+"px"})},e.prototype.update=function(e){var t=this,n=window.pageYOffset>=this.header_.offsetTop;n!==this.active_&&(this.el_.dataset.mdState=(this.active_=n)?"active":""),"resize"!==e.type&&"orientationchange"!==e.type||Array.prototype.forEach.call(this.el_.children,function(e){e.style.width=t.el_.offsetWidth-20+"px"})},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.width="",this.active_=!1},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(28),o=r(i),a=n(29),s=r(a),c=n(30),u=r(c);t.default={Blur:o.default,Collapse:s.default,Scrolling:u.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e),this.els_="string"==typeof t?document.querySelectorAll(t):t,this.index_=0,this.offset_=window.pageYOffset,this.dir_=!1,this.anchors_=[].reduce.call(this.els_,function(e,t){return e.concat(document.getElementById(t.hash.substring(1))||[])},[])}return e.prototype.setup=function(){this.update()},e.prototype.update=function(){var e=window.pageYOffset,t=this.offset_-e<0;if(this.dir_!==t&&(this.index_=this.index_=t?0:this.els_.length-1),0!==this.anchors_.length){if(this.offset_<=e)for(var n=this.index_+1;n0&&(this.els_[n-1].dataset.mdState="blur"),this.index_=n;else for(var r=this.index_;r>=0;r--){if(!(this.anchors_[r].offsetTop-80>e)){this.index_=r;break}r>0&&(this.els_[r-1].dataset.mdState="")}this.offset_=e,this.dir_=t}},e.prototype.reset=function(){Array.prototype.forEach.call(this.els_,function(e){e.dataset.mdState=""}),this.index_=0,this.offset_=window.pageYOffset},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return e.prototype.setup=function(){var e=this.el_.getBoundingClientRect().height;this.el_.style.display=e?"block":"none",this.el_.style.overflow=e?"visible":"hidden"},e.prototype.update=function(){var e=this,t=this.el_.getBoundingClientRect().height;if(this.el_.style.display="block",this.el_.style.overflow="",t)this.el_.style.maxHeight=t+"px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight="0px"});else{this.el_.setAttribute("data-md-state","expand"),this.el_.style.maxHeight="";var n=this.el_.getBoundingClientRect().height;this.el_.removeAttribute("data-md-state"),this.el_.style.maxHeight="0px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight=n+"px"})}var r=function e(n){var r=n.target;if(!(r instanceof HTMLElement))throw new ReferenceError;r.removeAttribute("data-md-state"),r.style.maxHeight="",r.style.display=t?"none":"block",r.style.overflow=t?"hidden":"visible",r.removeEventListener("transitionend",e)};this.el_.addEventListener("transitionend",r,!1)},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.maxHeight="",this.el_.style.display="",this.el_.style.overflow=""},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return e.prototype.setup=function(){this.el_.children[this.el_.children.length-1].style.webkitOverflowScrolling="touch";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling="touch"}})},e.prototype.update=function(e){var t=e.target;if(!(t instanceof HTMLElement))throw new ReferenceError;var n=t.nextElementSibling;if(!(n instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==n.tagName&&n.nextElementSibling;)n=n.nextElementSibling;if(!(t.parentNode instanceof HTMLElement&&t.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var r=t.parentNode.parentNode,i=n.children[n.children.length-1];if(r.style.webkitOverflowScrolling="",i.style.webkitOverflowScrolling="",!t.checked){var o=function e(){n instanceof HTMLElement&&(r.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",o,!1)}if(t.checked){var a=function e(){n instanceof HTMLElement&&(i.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",a,!1)}},e.prototype.reset=function(){this.el_.children[1].style.webkitOverflowScrolling="";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling=""}})},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(32),o=r(i),a=n(33),s=r(a);t.default={Lock:o.default,Result:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(this.el_=n,!document.body)throw new ReferenceError;this.lock_=document.body}return e.prototype.setup=function(){this.update()},e.prototype.update=function(){var e=this;this.el_.checked?(this.offset_=window.pageYOffset,setTimeout(function(){window.scrollTo(0,0),e.el_.checked&&(e.lock_.dataset.mdState="lock")},400)):(this.lock_.dataset.mdState="",setTimeout(function(){void 0!==e.offset_&&window.scrollTo(0,e.offset_)},100))},e.prototype.reset=function(){"lock"===this.lock_.dataset.mdState&&window.scrollTo(0,this.offset_),this.lock_.dataset.mdState=""},e}();t.default=i},function(e,t,n){"use strict";(function(e){function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=n(34),a=r(o),s=n(35),c=r(s),u=function(e,t){var n=t;if(e.length>n){for(;" "!==e[n]&&--n>0;);return e.substring(0,n)+"..."}return e},l=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content},d=function(){function t(e,n){i(this,t);var r="string"==typeof e?document.querySelector(e):e;if(!(r instanceof HTMLElement))throw new ReferenceError;this.el_=r;var o=Array.prototype.slice.call(this.el_.children),a=o[0],s=o[1];this.data_=n,this.meta_=a,this.list_=s,this.message_={placeholder:this.meta_.textContent,none:l("search.result.none"),one:l("search.result.one"),other:l("search.result.other")};var u=l("search.tokenizer");u.length&&(c.default.tokenizer.separator=u),this.lang_=l("search.language").split(",").filter(Boolean).map(function(e){return e.trim()})}return t.prototype.update=function(t){var n=this;if("focus"!==t.type||this.index_){if("focus"===t.type||"keyup"===t.type){var r=t.target;if(!(r instanceof HTMLInputElement))throw new ReferenceError;if(!this.index_||r.value===this.value_)return;for(;this.list_.firstChild;)this.list_.removeChild(this.list_.firstChild);if(this.value_=r.value,0===this.value_.length)return void(this.meta_.textContent=this.message_.placeholder);var i=this.index_.query(function(e){n.value_.toLowerCase().split(" ").filter(Boolean).forEach(function(t){e.term(t,{wildcard:c.default.Query.wildcard.TRAILING})})}).reduce(function(e,t){var r=n.docs_.get(t.ref);if(r.parent){var i=r.parent.location;e.set(i,(e.get(i)||[]).concat(t))}else{var o=r.location;e.set(o,e.get(o)||[])}return e},new Map),o=(0,a.default)(this.value_.trim()).replace(new RegExp(c.default.tokenizer.separator,"img"),"|"),s=new RegExp("(^|"+c.default.tokenizer.separator+")("+o+")","img"),d=function(e,t,n){return t+""+n+""};this.stack_=[],i.forEach(function(t,r){var i,o=n.docs_.get(r),a=e.createElement("li",{class:"md-search-result__item"},e.createElement("a",{href:o.location,title:o.title,class:"md-search-result__link",tabindex:"-1"},e.createElement("article",{class:"md-search-result__article md-search-result__article--document"},e.createElement("h1",{class:"md-search-result__title"},{__html:o.title.replace(s,d)}),o.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:o.text.replace(s,d)}):{}))),c=t.map(function(t){return function(){var r=n.docs_.get(t.ref);a.appendChild(e.createElement("a",{href:r.location,title:r.title,class:"md-search-result__link","data-md-rel":"anchor",tabindex:"-1"},e.createElement("article",{class:"md-search-result__article"},e.createElement("h1",{class:"md-search-result__title"},{__html:r.title.replace(s,d)}),r.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:u(r.text.replace(s,d),400)}):{})))}});(i=n.stack_).push.apply(i,[function(){return n.list_.appendChild(a)}].concat(c))});var f=this.el_.parentNode;if(!(f instanceof HTMLElement))throw new ReferenceError;for(;this.stack_.length&&f.offsetHeight>=f.scrollHeight-16;)this.stack_.shift()();var h=this.list_.querySelectorAll("[data-md-rel=anchor]");switch(Array.prototype.forEach.call(h,function(e){["click","keydown"].forEach(function(t){e.addEventListener(t,function(n){if("keydown"!==t||13===n.keyCode){var r=document.querySelector("[data-md-toggle=search]");if(!(r instanceof HTMLInputElement))throw new ReferenceError;r.checked&&(r.checked=!1,r.dispatchEvent(new CustomEvent("change"))),n.preventDefault(),setTimeout(function(){document.location.href=e.href},100)}})})}),i.size){case 0:this.meta_.textContent=this.message_.none;break;case 1:this.meta_.textContent=this.message_.one;break;default:this.meta_.textContent=this.message_.other.replace("#",i.size)}}}else{var p=function(e){n.docs_=e.reduce(function(e,t){var n=t.location.split("#"),r=n[0];return n[1]&&(t.parent=e.get(r),t.parent&&!t.parent.done&&(t.parent.title=t.title,t.parent.text=t.text,t.parent.done=!0)),t.text=t.text.replace(/\n/g," ").replace(/\s+/g," ").replace(/\s+([,.:;!?])/g,function(e,t){return t}),t.parent&&t.parent.title===t.title||e.set(t.location,t),e},new Map);var t=n.docs_,r=n.lang_;n.stack_=[],n.index_=(0,c.default)(function(){var e,n=this,i={"search.pipeline.trimmer":c.default.trimmer,"search.pipeline.stopwords":c.default.stopWordFilter},o=Object.keys(i).reduce(function(e,t){return l(t).match(/^false$/i)||e.push(i[t]),e},[]);this.pipeline.reset(),o&&(e=this.pipeline).add.apply(e,o),1===r.length&&"en"!==r[0]&&c.default[r[0]]?this.use(c.default[r[0]]):r.length>1&&this.use(c.default.multiLanguage.apply(c.default,r)),this.field("title",{boost:10}),this.field("text"),this.ref("location"),t.forEach(function(e){return n.add(e)})});var i=n.el_.parentNode;if(!(i instanceof HTMLElement))throw new ReferenceError;i.addEventListener("scroll",function(){for(;n.stack_.length&&i.scrollTop+i.offsetHeight>=i.scrollHeight-16;)n.stack_.splice(0,10).forEach(function(e){return e()})})};setTimeout(function(){return"function"==typeof n.data_?n.data_().then(p):p(n.data_)},250)}},t}();t.default=d}).call(t,n(0))},function(e,t,n){"use strict";var r=/[|\\{}()[\]^$+*?.]/g;e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(r,"\\$&")}},function(e,t,n){(function(t){e.exports=t.lunr=n(36)}).call(t,n(1))},function(e,t,n){var r,i;!function(){var o=function(e){var t=new o.Builder;return t.pipeline.add(o.trimmer,o.stopWordFilter,o.stemmer),t.searchPipeline.add(o.stemmer),e.call(t,t),t.build()};o.version="2.1.5",o.utils={},o.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),o.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},o.FieldRef=function(e,t,n){this.docRef=e,this.fieldName=t,this._stringValue=n},o.FieldRef.joiner="/",o.FieldRef.fromString=function(e){var t=e.indexOf(o.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var n=e.slice(0,t),r=e.slice(t+1);return new o.FieldRef(r,n,e)},o.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+o.FieldRef.joiner+this.docRef),this._stringValue},o.idf=function(e,t){var n=0;for(var r in e)"_index"!=r&&(n+=Object.keys(e[r]).length);var i=(t-n+.5)/(n+.5);return Math.log(1+Math.abs(i))},o.Token=function(e,t){this.str=e||"",this.metadata=t||{}},o.Token.prototype.toString=function(){return this.str},o.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},o.Token.prototype.clone=function(e){return e=e||function(e){return e},new o.Token(e(this.str,this.metadata),this.metadata)},o.tokenizer=function(e){if(null==e||void 0==e)return[];if(Array.isArray(e))return e.map(function(e){return new o.Token(o.utils.asString(e).toLowerCase())});for(var t=e.toString().trim().toLowerCase(),n=t.length,r=[],i=0,a=0;i<=n;i++){var s=t.charAt(i),c=i-a;(s.match(o.tokenizer.separator)||i==n)&&(c>0&&r.push(new o.Token(t.slice(a,i),{position:[a,c],index:r.length})),a=i+1)}return r},o.tokenizer.separator=/[\s\-]+/,o.Pipeline=function(){this._stack=[]},o.Pipeline.registeredFunctions=Object.create(null),o.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&o.utils.warn("Overwriting existing registered function: "+t),e.label=t,o.Pipeline.registeredFunctions[e.label]=e},o.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||o.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},o.Pipeline.load=function(e){var t=new o.Pipeline;return e.forEach(function(e){var n=o.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)}),t},o.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){o.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},o.Pipeline.prototype.after=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},o.Pipeline.prototype.before=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},o.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},o.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=i),o!=e);)r=n-t,i=t+Math.floor(r/2),o=this.elements[2*i];return o==e?2*i:o>e?2*i:os?u+=2:a==s&&(t+=n[c+1]*r[u+1],c+=2,u+=2);return t},o.Vector.prototype.similarity=function(e){return this.dot(e)/(this.magnitude()*e.magnitude())},o.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,s=i.str.charAt(0);s in i.node.edges?a=i.node.edges[s]:(a=new o.TokenSet,i.node.edges[s]=a),1==i.str.length?a.final=!0:r.push({node:a,editsRemaining:i.editsRemaining,str:i.str.slice(1)})}if(i.editsRemaining>0&&i.str.length>1){var c,s=i.str.charAt(1);s in i.node.edges?c=i.node.edges[s]:(c=new o.TokenSet,i.node.edges[s]=c),i.str.length<=2?c.final=!0:r.push({node:c,editsRemaining:i.editsRemaining-1,str:i.str.slice(2)})}if(i.editsRemaining>0&&1==i.str.length&&(i.node.final=!0),i.editsRemaining>0&&i.str.length>=1){if("*"in i.node.edges)var u=i.node.edges["*"];else{var u=new o.TokenSet;i.node.edges["*"]=u}1==i.str.length?u.final=!0:r.push({node:u,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)})}if(i.editsRemaining>0){if("*"in i.node.edges)var l=i.node.edges["*"];else{var l=new o.TokenSet;i.node.edges["*"]=l}0==i.str.length?l.final=!0:r.push({node:l,editsRemaining:i.editsRemaining-1,str:i.str})}if(i.editsRemaining>0&&i.str.length>1){var d,f=i.str.charAt(0),h=i.str.charAt(1);h in i.node.edges?d=i.node.edges[h]:(d=new o.TokenSet,i.node.edges[h]=d),1==i.str.length?d.final=!0:r.push({node:d,editsRemaining:i.editsRemaining-1,str:f+i.str.slice(2)})}}return n},o.TokenSet.fromString=function(e){for(var t=new o.TokenSet,n=t,r=!1,i=0,a=e.length;i=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},o.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},o.Index.prototype.search=function(e){return this.query(function(t){new o.QueryParser(e,t).parse()})},o.Index.prototype.query=function(e){var t=new o.Query(this.fields),n=Object.create(null),r=Object.create(null),i=Object.create(null);e.call(t,t);for(var a=0;a1?1:e},o.Builder.prototype.k1=function(e){this._k1=e},o.Builder.prototype.add=function(e){var t=e[this._ref];this.documentCount+=1;for(var n=0;n=this.length)return o.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},o.QueryLexer.prototype.width=function(){return this.pos-this.start},o.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},o.QueryLexer.prototype.backup=function(){this.pos-=1},o.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{e=this.next(),t=e.charCodeAt(0)}while(t>47&&t<58);e!=o.QueryLexer.EOS&&this.backup()},o.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(o.QueryLexer.TERM)),e.ignore(),e.more())return o.QueryLexer.lexText},o.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.EDIT_DISTANCE),o.QueryLexer.lexText},o.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.BOOST),o.QueryLexer.lexText},o.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(o.QueryLexer.TERM)},o.QueryLexer.termSeparator=o.tokenizer.separator,o.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==o.QueryLexer.EOS)return o.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return o.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexBoost;if(t.match(o.QueryLexer.termSeparator))return o.QueryLexer.lexTerm}else e.escapeCharacter()}},o.QueryParser=function(e,t){this.lexer=new o.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},o.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=o.QueryParser.parseFieldOrTerm;e;)e=e(this);return this.query},o.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},o.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},o.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},o.QueryParser.parseFieldOrTerm=function(e){var t=e.peekLexeme();if(void 0!=t)switch(t.type){case o.QueryLexer.FIELD:return o.QueryParser.parseField;case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new o.QueryParseError(n,t.start,t.end)}},o.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(void 0!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var i=e.peekLexeme();if(void 0==i){var r="expecting term, found nothing";throw new o.QueryParseError(r,t.start,t.end)}switch(i.type){case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var r="expecting term, found '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(void 0!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(void 0==n)return void e.nextClause();switch(n.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+n.type+"'";throw new o.QueryParseError(r,n.start,n.end)}}},o.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},function(o,a){r=a,void 0!==(i="function"==typeof r?r.call(t,n,t,e):r)&&(e.exports=i)}(0,function(){return o})}()},function(e,t,n){"use strict";t.__esModule=!0;var r=n(38),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default={Position:i.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i,this.parent_=i.parentNode,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.pad_="fixed"===window.getComputedStyle(this.header_).position}return e.prototype.setup=function(){var e=Array.prototype.reduce.call(this.parent_.children,function(e,t){return Math.max(e,t.offsetTop)},0);this.offset_=e-(this.pad_?this.header_.offsetHeight:0),this.update()},e.prototype.update=function(e){var t=window.pageYOffset,n=window.innerHeight;e&&"resize"===e.type&&this.setup();var r={top:this.pad_?this.header_.offsetHeight:0,bottom:this.parent_.offsetTop+this.parent_.offsetHeight},i=n-r.top-Math.max(0,this.offset_-t)-Math.max(0,t+n-r.bottom);i!==this.height_&&(this.el_.style.height=(this.height_=i)+"px"),t>=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(40),o=r(i),a=n(44),s=r(a);t.default={Adapter:o.default,Repository:s.default}},function(e,t,n){"use strict";t.__esModule=!0;var r=n(41),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default={GitHub:i.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var a=n(42),s=function(e){return e&&e.__esModule?e:{default:e}}(a),c=function(e){function t(n){r(this,t);var o=i(this,e.call(this,n)),a=/^.+github\.com\/([^\/]+)\/?([^\/]+)?.*$/.exec(o.base_);if(a&&3===a.length){var s=a[1],c=a[2];o.base_="https://api.github.com/users/"+s+"/repos",o.name_=c}return o}return o(t,e),t.prototype.fetch_=function(){var e=this;return function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return fetch(e.base_+"?per_page=30&page="+n).then(function(e){return e.json()}).then(function(r){if(!(r instanceof Array))throw new TypeError;if(e.name_){var i=r.find(function(t){return t.name===e.name_});return i||30!==r.length?i?[e.format_(i.stargazers_count)+" Stars",e.format_(i.forks_count)+" Forks"]:[]:t(n+1)}return[r.length+" Repositories"]})}()},t}(s.default);t.default=c},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(43),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLAnchorElement))throw new ReferenceError;this.el_=n,this.base_=this.el_.href,this.salt_=this.hash_(this.base_)}return e.prototype.fetch=function(){var e=this;return new Promise(function(t){var n=o.default.getJSON(e.salt_+".cache-source");void 0!==n?t(n):e.fetch_().then(function(n){o.default.set(e.salt_+".cache-source",n,{expires:1/96}),t(n)})})},e.prototype.fetch_=function(){throw new Error("fetch_(): Not implemented")},e.prototype.format_=function(e){return e>1e4?(e/1e3).toFixed(0)+"k":e>1e3?(e/1e3).toFixed(1)+"k":""+e},e.prototype.hash_=function(e){var t=0;if(0===e.length)return t;for(var n=0,r=e.length;n1){if(o=e({path:"/"},r.defaults,o),"number"==typeof o.expires){var s=new Date;s.setMilliseconds(s.getMilliseconds()+864e5*o.expires),o.expires=s}o.expires=o.expires?o.expires.toUTCString():"";try{a=JSON.stringify(i),/^[\{\[]/.test(a)&&(i=a)}catch(e){}i=n.write?n.write(i,t):encodeURIComponent(String(i)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),t=encodeURIComponent(String(t)),t=t.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),t=t.replace(/[\(\)]/g,escape);var c="";for(var u in o)o[u]&&(c+="; "+u,!0!==o[u]&&(c+="="+o[u]));return document.cookie=t+"="+i+c}t||(a={});for(var l=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,f=0;f=this.el_.children[0].offsetTop+-43;e!==this.active_&&(this.el_.dataset.mdState=(this.active_=e)?"hidden":"")},e.prototype.reset=function(){this.el_.dataset.mdState="",this.active_=!1},e}();t.default=i}])); \ No newline at end of file diff --git a/deploy/baremetal/index.html b/deploy/baremetal/index.html index b74eaf6e8..fe68e29e7 100644 --- a/deploy/baremetal/index.html +++ b/deploy/baremetal/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -451,8 +508,8 @@
  • - - Upgrading + + Upgrade
  • @@ -506,8 +563,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -530,8 +587,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -751,8 +808,8 @@
  • - - Ingress examples + + Introduction
  • @@ -775,8 +832,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -806,7 +863,7 @@
  • - + Basic Authentication
  • @@ -818,7 +875,7 @@
  • - + Client Certificate Authentication
  • @@ -830,7 +887,7 @@
  • - + External Basic Authentication
  • @@ -842,7 +899,7 @@
  • - + External OAUTH Authentication
  • @@ -878,7 +935,7 @@
  • - + Configuration Snippets
  • @@ -890,7 +947,7 @@
  • - + Custom Configuration
  • @@ -902,7 +959,7 @@
  • - + Custom Errors
  • @@ -914,7 +971,7 @@
  • - + Custom Headers
  • @@ -926,7 +983,7 @@
  • - + Custom Upstream server checks
  • @@ -938,8 +995,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -950,7 +1007,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -962,7 +1019,7 @@
  • - + Sysctl tuning
  • @@ -979,7 +1036,7 @@
  • - + Docker registry
  • @@ -991,7 +1048,7 @@
  • - + gRPC
  • @@ -1003,7 +1060,7 @@
  • - + Multi TLS certificate termination
  • @@ -1015,7 +1072,7 @@
  • - + Rewrite
  • @@ -1027,7 +1084,7 @@
  • - + Static IPs
  • @@ -1039,7 +1096,7 @@
  • - + TLS termination
  • @@ -1050,42 +1107,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1165,8 +1186,8 @@ suffices to provide a single point of contact to the NGINX Ingress controller to external clients and, indirectly, to any application running inside the cluster. Bare-metal environments lack this commodity, requiring a slightly different setup to offer the same kind of access to external consumers.

    -

    Cloud environment -Bare-metal environment

    +

    Cloud environment +Bare-metal environment

    The rest of this document describes a few recommended approaches to deploying the NGINX Ingress controller inside a Kubernetes cluster running on bare-metal.

    A pure software solution: MetalLB

    @@ -1175,7 +1196,7 @@ supported cloud provider, effectively allowing the usage of LoadBalancer Service

    This section demonstrates how to use the Layer 2 configuration mode of MetalLB together with the NGINX Ingress controller in a Kubernetes cluster that has publicly accessible nodes. In this mode, one node attracts all the traffic for the ingress-nginx Service IP. See Traffic policies for more details.

    -

    MetalLB in L2 mode

    +

    MetalLB in L2 mode

    Note

    The description of other supported configuration modes is off-scope for this document.

    @@ -1241,7 +1262,7 @@ well as in the next section.

    Over a NodePort Service

    Due to its simplicity, this is the setup a user will deploy by default when following the steps described in the -installation guide.

    +installation guide.

    Info

    A Service of type NodePort exposes, via the kube-proxy component, the same unprivileged port (default: @@ -1252,7 +1273,7 @@ any port, including the standard HTTP ports 80 and 443. However, due to the cont located outside the cluster network (e.g. on the public internet) is not able to access Ingress hosts directly on ports 80 and 443. Instead, the external client must append the NodePort allocated to the ingress-nginx Service to HTTP requests.

    -

    NodePort request flow

    +

    NodePort request flow

    Example

    Given the NodePort 30100 allocated to the ingress-nginx Service

    @@ -1433,7 +1454,7 @@ of a traditional Deployment.

    Because most properties of DaemonSet objects are identical to Deployment objects, this documentation page leaves the configuration of the corresponding manifest at the user's discretion.

    -

    DaemonSet with hostNetwork flow

    +

    DaemonSet with hostNetwork flow

    Like with NodePorts, this approach has a few quirks it is important to be aware of.

    • DNS resolution
    • @@ -1453,7 +1474,7 @@ blank.

    Instead, and because bare-metal nodes usually don't have an ExternalIP, one has to enable the ---report-node-internal-ip-address flag, which sets the status of all Ingress objects to the internal IP +--report-node-internal-ip-address flag, which sets the status of all Ingress objects to the internal IP address of all nodes running the NGINX Ingress controller.

    Example

    @@ -1475,7 +1496,7 @@ address of all nodes running the NGINX Ingress controller.

    Note

    Alternatively, it is possible to override the address written to Ingress objects using the ---publish-status-address flag. See Command line arguments.

    +--publish-status-address flag. See Command line arguments.

    Using a self-provisioned edge

    Similarly to cloud environments, this deployment approach requires an edge network component providing a public @@ -1487,7 +1508,7 @@ This is particularly suitable for private Kubernetes clusters where none of the

    On the edge side, the only prerequisite is to dedicate a public IP address that forwards all HTTP traffic to Kubernetes nodes and/or masters. Incoming traffic on TCP ports 80 and 443 is forwarded to the corresponding HTTP and HTTPS NodePort on the target nodes as shown in the diagram below:

    -

    User edge

    +

    User edge

    External IPs

    Source IP address

    @@ -1605,9 +1626,9 @@ and the Service port:

    - + - + diff --git a/deploy/index.html b/deploy/index.html index 0ce5aae3b..e05b582b3 100644 --- a/deploy/index.html +++ b/deploy/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@
    @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -546,8 +603,8 @@
  • - - Upgrading + + Upgrade
  • @@ -601,8 +658,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -625,8 +682,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -846,8 +903,8 @@
  • - - Ingress examples + + Introduction
  • @@ -870,8 +927,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -901,7 +958,7 @@
  • - + Basic Authentication
  • @@ -913,7 +970,7 @@
  • - + Client Certificate Authentication
  • @@ -925,7 +982,7 @@
  • - + External Basic Authentication
  • @@ -937,7 +994,7 @@
  • - + External OAUTH Authentication
  • @@ -973,7 +1030,7 @@
  • - + Configuration Snippets
  • @@ -985,7 +1042,7 @@
  • - + Custom Configuration
  • @@ -997,7 +1054,7 @@
  • - + Custom Errors
  • @@ -1009,7 +1066,7 @@
  • - + Custom Headers
  • @@ -1021,7 +1078,7 @@
  • - + Custom Upstream server checks
  • @@ -1033,8 +1090,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -1045,7 +1102,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -1057,7 +1114,7 @@
  • - + Sysctl tuning
  • @@ -1074,7 +1131,7 @@
  • - + Docker registry
  • @@ -1086,7 +1143,7 @@
  • - + gRPC
  • @@ -1098,7 +1155,7 @@
  • - + Multi TLS certificate termination
  • @@ -1110,7 +1167,7 @@
  • - + Rewrite
  • @@ -1122,7 +1179,7 @@
  • - + Static IPs
  • @@ -1134,7 +1191,7 @@
  • - + TLS termination
  • @@ -1145,42 +1202,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1439,7 +1460,7 @@ Please check the

    +

    Listeners

    ELB Idle Timeouts

    In some scenarios users will need to modify the value of the ELB idle timeout. Users need to ensure the idle timeout is less than the keepalive_timeout that is configured for NGINX. By default NGINX keepalive_timeout is set to 75s.

    The default ELB idle timeout will work for most scenarios, unless the NGINX keepalive_timeout has been modified, in which case service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout will need to be modified to ensure it is less than the keepalive_timeout the user has configured.

    @@ -1516,7 +1537,7 @@ To install the chart with the release name my-nginx @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -464,8 +521,8 @@
  • - - Upgrading + + Upgrade
  • @@ -519,8 +576,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -543,8 +600,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -764,8 +821,8 @@
  • - - Ingress examples + + Introduction
  • @@ -788,8 +845,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -819,7 +876,7 @@
  • - + Basic Authentication
  • @@ -831,7 +888,7 @@
  • - + Client Certificate Authentication
  • @@ -843,7 +900,7 @@
  • - + External Basic Authentication
  • @@ -855,7 +912,7 @@
  • - + External OAUTH Authentication
  • @@ -891,7 +948,7 @@
  • - + Configuration Snippets
  • @@ -903,7 +960,7 @@
  • - + Custom Configuration
  • @@ -915,7 +972,7 @@
  • - + Custom Errors
  • @@ -927,7 +984,7 @@
  • - + Custom Headers
  • @@ -939,7 +996,7 @@
  • - + Custom Upstream server checks
  • @@ -951,8 +1008,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -963,7 +1020,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -975,7 +1032,7 @@
  • - + Sysctl tuning
  • @@ -992,7 +1049,7 @@
  • - + Docker registry
  • @@ -1004,7 +1061,7 @@
  • - + gRPC
  • @@ -1016,7 +1073,7 @@
  • - + Multi TLS certificate termination
  • @@ -1028,7 +1085,7 @@
  • - + Rewrite
  • @@ -1040,7 +1097,7 @@
  • - + Static IPs
  • @@ -1052,7 +1109,7 @@
  • - + TLS termination
  • @@ -1063,42 +1120,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1285,13 +1306,13 @@ container arguments, and POD_NAMESPACE should be in the nginx-ingress namespace. - + Skip to content @@ -126,7 +126,7 @@ NGINX Ingress Controller - Upgrading + Upgrade @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -394,11 +451,11 @@ - - Upgrading + + Upgrade @@ -485,8 +542,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -509,8 +566,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -730,8 +787,8 @@
  • - - Ingress examples + + Introduction
  • @@ -754,8 +811,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -785,7 +842,7 @@
  • - + Basic Authentication
  • @@ -797,7 +854,7 @@
  • - + Client Certificate Authentication
  • @@ -809,7 +866,7 @@
  • - + External Basic Authentication
  • @@ -821,7 +878,7 @@
  • - + External OAUTH Authentication
  • @@ -857,7 +914,7 @@
  • - + Configuration Snippets
  • @@ -869,7 +926,7 @@
  • - + Custom Configuration
  • @@ -881,7 +938,7 @@
  • - + Custom Errors
  • @@ -893,7 +950,7 @@
  • - + Custom Headers
  • @@ -905,7 +962,7 @@
  • - + Custom Upstream server checks
  • @@ -917,8 +974,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -929,7 +986,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -941,7 +998,7 @@
  • - + Sysctl tuning
  • @@ -958,7 +1015,7 @@
  • - + Docker registry
  • @@ -970,7 +1027,7 @@
  • - + gRPC
  • @@ -982,7 +1039,7 @@
  • - + Multi TLS certificate termination
  • @@ -994,7 +1051,7 @@
  • - + Rewrite
  • @@ -1006,7 +1063,7 @@
  • - + Static IPs
  • @@ -1018,7 +1075,7 @@
  • - + TLS termination
  • @@ -1029,42 +1086,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1191,13 +1212,13 @@ you should be able to upgrade using

    - + Skip to content @@ -126,7 +126,7 @@ NGINX Ingress Controller - Developing for NGINX Ingress Controller + Development @@ -198,18 +198,23 @@ - @@ -1335,7 +1360,7 @@ or push an image to a remote repository.

    Deploying

    There are several ways to deploy the ingress controller onto a cluster. -Please check the deployment guide

    +Please check the deployment guide

    Testing

    To run unit-tests, just run

    @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -438,8 +495,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -462,8 +519,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -685,8 +742,8 @@
  • - - Ingress examples + + Introduction
  • @@ -788,8 +845,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -819,7 +876,7 @@
  • - + Basic Authentication
  • @@ -831,7 +888,7 @@
  • - + Client Certificate Authentication
  • @@ -843,7 +900,7 @@
  • - + External Basic Authentication
  • @@ -855,7 +912,7 @@
  • - + External OAUTH Authentication
  • @@ -891,7 +948,7 @@
  • - + Configuration Snippets
  • @@ -903,7 +960,7 @@
  • - + Custom Configuration
  • @@ -915,7 +972,7 @@
  • - + Custom Errors
  • @@ -927,7 +984,7 @@
  • - + Custom Headers
  • @@ -939,7 +996,7 @@
  • - + Custom Upstream server checks
  • @@ -951,8 +1008,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -963,7 +1020,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -975,7 +1032,7 @@
  • - + Sysctl tuning
  • @@ -992,7 +1049,7 @@
  • - + Docker registry
  • @@ -1004,7 +1061,7 @@
  • - + gRPC
  • @@ -1016,7 +1073,7 @@
  • - + Multi TLS certificate termination
  • @@ -1028,7 +1085,7 @@
  • - + Rewrite
  • @@ -1040,7 +1097,7 @@
  • - + Static IPs
  • @@ -1052,7 +1109,7 @@
  • - + TLS termination
  • @@ -1063,42 +1120,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1362,7 +1383,7 @@ which you can deploy as follows

    - + Skip to content @@ -109,7 +109,7 @@ @@ -278,7 +275,7 @@
    @@ -1121,7 +1142,7 @@

    Sticky Session

    This example demonstrates how to achieve session affinity using cookies

    Deployment

    -

    Session stickiness is achieved through 3 annotations on the Ingress, as shown in the example.

    +

    Session stickiness is achieved through 3 annotations on the Ingress, as shown in the example.

    @@ -1213,7 +1234,7 @@ This means that you can face the situation that you've configured Session Affini - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1253,9 +1274,9 @@ Please review the prerequisites before trying them. - + - + diff --git a/examples/multi-tls/README/index.html b/examples/multi-tls/index.html similarity index 79% rename from examples/multi-tls/README/index.html rename to examples/multi-tls/index.html index 2a510c6c0..ef75cdc28 100644 --- a/examples/multi-tls/README/index.html +++ b/examples/multi-tls/index.html @@ -31,8 +31,8 @@ - - + + @@ -40,9 +40,9 @@ - + - + @@ -51,18 +51,18 @@ - + - + - + - + @@ -100,7 +100,7 @@ - + Skip to content @@ -109,7 +109,7 @@ @@ -278,7 +275,7 @@
    @@ -1169,7 +1190,7 @@
    AppsDocker RegistryDocker Registry TODO TODO
    AuthBasic authenticationBasic authentication password protect your website Intermediate
    AuthClient certificate authenticationClient certificate authentication secure your website with client certificate authentication Intermediate
    AuthExternal authentication pluginExternal authentication plugin defer to an external authentication service Intermediate
    AuthOAuth external authOAuth external auth TODO TODO
    CustomizationConfiguration snippetsConfiguration snippets customize nginx location configuration using annotations Advanced
    CustomizationCustom configurationCustom configuration TODO TODO
    CustomizationCustom DH parameters for perfect forward secrecyCustom DH parameters for perfect forward secrecy TODO TODO
    CustomizationCustom errorsCustom errors serve custom error pages from the default backend Intermediate
    CustomizationCustom headersCustom headers set custom headers before sending traffic to backends Advanced
    CustomizationCustom upstream checkCustom upstream check TODO TODO
    CustomizationExternal authentication with response header propagationExternal authentication with response header propagation TODO TODO
    CustomizationSysctl tuningSysctl tuning TODO TODO
    FeaturesRewriteRewrite TODO TODO
    FeaturesSession stickinessSession stickiness route requests consistently to the same endpoint Advanced
    ScalingStatic IPStatic IP a single ingress gets a single static IP Intermediate
    TLSMulti TLS certificate terminationMulti TLS certificate termination TODO TODO
    TLSTLS terminationTLS termination TODO TODO
    @@ -1337,7 +1358,7 @@ Connection: keep-alive @@ -1187,12 +1212,12 @@

    NGINX configuration

    The goal of this Ingress controller is the assembly of a configuration file (nginx.conf). The main implication of this requirement is the need to reload NGINX after any change in the configuration file. Though it is important to note that we don't reload Nginx on changes that impact only an upstream configuration (i.e Endpoints change when you deploy your app). We use https://github.com/openresty/lua-nginx-module to achieve this. Check below to learn more about how it's done.

    NGINX model

    -

    Usually, a Kubernetes Controller utilizes the synchronization loop pattern to check if the desired state in the controller is updated or a change is required. To this purpose, we need to build a model using different objects from the cluster, in particular (in no special order) Ingresses, Services, Endpoints, Secrets, and Configmaps to generate a point in time configuration file that reflects the state of the cluster.

    -

    To get this object from the cluster, we use Kubernetes Informers, in particular, FilteredSharedInformer. This informers allows reacting to changes in using callbacks to individual changes when a new object is added, modified or removed. Unfortunately, there is no way to know if a particular change is going to affect the final configuration file. Therefore on every change, we have to rebuild a new model from scratch based on the state of cluster and compare it to the current model. If the new model equals to the current one, then we avoid generating a new NGINX configuration and triggering a reload. Otherwise, we check if the difference is only about Endpoints. If so we then send the new list of Endpoints to a Lua handler running inside Nginx using HTTP POST request and again avoid generating a new NGINX configuration and triggering a reload. If the difference between running and new model is about more than just Endpoints we create a new NGINX configuration based on the new model, replace the current model and trigger a reload.

    +

    Usually, a Kubernetes Controller utilizes the synchronization loop pattern to check if the desired state in the controller is updated or a change is required. To this purpose, we need to build a model using different objects from the cluster, in particular (in no special order) Ingresses, Services, Endpoints, Secrets, and Configmaps to generate a point in time configuration file that reflects the state of the cluster.

    +

    To get this object from the cluster, we use Kubernetes Informers, in particular, FilteredSharedInformer. This informers allows reacting to changes in using callbacks to individual changes when a new object is added, modified or removed. Unfortunately, there is no way to know if a particular change is going to affect the final configuration file. Therefore on every change, we have to rebuild a new model from scratch based on the state of cluster and compare it to the current model. If the new model equals to the current one, then we avoid generating a new NGINX configuration and triggering a reload. Otherwise, we check if the difference is only about Endpoints. If so we then send the new list of Endpoints to a Lua handler running inside Nginx using HTTP POST request and again avoid generating a new NGINX configuration and triggering a reload. If the difference between running and new model is about more than just Endpoints we create a new NGINX configuration based on the new model, replace the current model and trigger a reload.

    One of the uses of the model is to avoid unnecessary reloads when there's no change in the state and to detect conflicts in definitions.

    -

    The final representation of the NGINX configuration is generated from a Go template using the new model as input for the variables required by the template.

    +

    The final representation of the NGINX configuration is generated from a Go template using the new model as input for the variables required by the template.

    Building the NGINX model

    -

    Building a model is an expensive operation, for this reason, the use of the synchronization loop is a must. By using a work queue it is possible to not lose changes and remove the use of sync.Mutex to force a single execution of the sync loop and additionally it is possible to create a time window between the start and end of the sync loop that allows us to discard unnecessary updates. It is important to understand that any change in the cluster could generate events that the informer will send to the controller and one of the reasons for the work queue.

    +

    Building a model is an expensive operation, for this reason, the use of the synchronization loop is a must. By using a work queue it is possible to not lose changes and remove the use of sync.Mutex to force a single execution of the sync loop and additionally it is possible to create a time window between the start and end of the sync loop that allows us to discard unnecessary updates. It is important to understand that any change in the cluster could generate events that the informer will send to the controller and one of the reasons for the work queue.

    Operations to build the model:

    @@ -1127,13 +1152,13 @@ @@ -1561,9 +1600,9 @@ dump. This allows us to see which configuration is being used, as well as older - + - + diff --git a/user-guide/cli-arguments/index.html b/user-guide/cli-arguments/index.html index e82a78788..d90e66fe2 100644 --- a/user-guide/cli-arguments/index.html +++ b/user-guide/cli-arguments/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -694,8 +751,8 @@
  • - - Ingress examples + + Introduction
  • @@ -718,8 +775,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -749,7 +806,7 @@
  • - + Basic Authentication
  • @@ -761,7 +818,7 @@
  • - + Client Certificate Authentication
  • @@ -773,7 +830,7 @@
  • - + External Basic Authentication
  • @@ -785,7 +842,7 @@
  • - + External OAUTH Authentication
  • @@ -821,7 +878,7 @@
  • - + Configuration Snippets
  • @@ -833,7 +890,7 @@
  • - + Custom Configuration
  • @@ -845,7 +902,7 @@
  • - + Custom Errors
  • @@ -857,7 +914,7 @@
  • - + Custom Headers
  • @@ -869,7 +926,7 @@
  • - + Custom Upstream server checks
  • @@ -881,8 +938,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -893,7 +950,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -905,7 +962,7 @@
  • - + Sysctl tuning
  • @@ -922,7 +979,7 @@
  • - + Docker registry
  • @@ -934,7 +991,7 @@
  • - + gRPC
  • @@ -946,7 +1003,7 @@
  • - + Multi TLS certificate termination
  • @@ -958,7 +1015,7 @@
  • - + Rewrite
  • @@ -970,7 +1027,7 @@
  • - + Static IPs
  • @@ -982,7 +1039,7 @@
  • - + TLS termination
  • @@ -993,42 +1050,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1061,7 +1082,7 @@

    Command line arguments

    The following command line arguments are accepted by the Ingress controller executable.

    -

    They are set in the container spec of the nginx-ingress-controller Deployment manifest (see deploy/with-rbac.yaml or deploy/without-rbac.yaml).

    +

    They are set in the container spec of the nginx-ingress-controller Deployment manifest

    @@ -1071,163 +1092,163 @@ - + - + - + - + - + - + - + - + - - - - - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + @@ -1303,9 +1324,9 @@ - + - + diff --git a/user-guide/custom-errors/index.html b/user-guide/custom-errors/index.html index 0aecb6c11..e19eaee63 100644 --- a/user-guide/custom-errors/index.html +++ b/user-guide/custom-errors/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -694,8 +751,8 @@
  • - - Ingress examples + + Introduction
  • @@ -718,8 +775,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -749,7 +806,7 @@
  • - + Basic Authentication
  • @@ -761,7 +818,7 @@
  • - + Client Certificate Authentication
  • @@ -773,7 +830,7 @@
  • - + External Basic Authentication
  • @@ -785,7 +842,7 @@
  • - + External OAUTH Authentication
  • @@ -821,7 +878,7 @@
  • - + Configuration Snippets
  • @@ -833,7 +890,7 @@
  • - + Custom Configuration
  • @@ -845,7 +902,7 @@
  • - + Custom Errors
  • @@ -857,7 +914,7 @@
  • - + Custom Headers
  • @@ -869,7 +926,7 @@
  • - + Custom Upstream server checks
  • @@ -881,8 +938,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -893,7 +950,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -905,7 +962,7 @@
  • - + Sysctl tuning
  • @@ -922,7 +979,7 @@
  • - + Docker registry
  • @@ -934,7 +991,7 @@
  • - + gRPC
  • @@ -946,7 +1003,7 @@
  • - + Multi TLS certificate termination
  • @@ -958,7 +1015,7 @@
  • - + Rewrite
  • @@ -970,7 +1027,7 @@
  • - + Static IPs
  • @@ -982,7 +1039,7 @@
  • - + TLS termination
  • @@ -993,42 +1050,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1109,7 +1130,7 @@ could decide to return the error payload as a JSON document instead of HTML.

    NGINX does not change the response from the custom default backend.

    An example of such custom backend is available inside the source repository at images/custom-error-pages.

    -

    See also the Custom errors example.

    +

    See also the Custom errors example.

    @@ -1181,9 +1202,9 @@ NGINX does not change the response from the custom default backend.

    - + - + diff --git a/user-guide/default-backend/index.html b/user-guide/default-backend/index.html index 60cbd97d6..a6d6d743d 100644 --- a/user-guide/default-backend/index.html +++ b/user-guide/default-backend/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -694,8 +751,8 @@
  • - - Ingress examples + + Introduction
  • @@ -718,8 +775,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -749,7 +806,7 @@
  • - + Basic Authentication
  • @@ -761,7 +818,7 @@
  • - + Client Certificate Authentication
  • @@ -773,7 +830,7 @@
  • - + External Basic Authentication
  • @@ -785,7 +842,7 @@
  • - + External OAUTH Authentication
  • @@ -821,7 +878,7 @@
  • - + Configuration Snippets
  • @@ -833,7 +890,7 @@
  • - + Custom Configuration
  • @@ -845,7 +902,7 @@
  • - + Custom Errors
  • @@ -857,7 +914,7 @@
  • - + Custom Headers
  • @@ -869,7 +926,7 @@
  • - + Custom Upstream server checks
  • @@ -881,8 +938,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -893,7 +950,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -905,7 +962,7 @@
  • - + Sysctl tuning
  • @@ -922,7 +979,7 @@
  • - + Docker registry
  • @@ -934,7 +991,7 @@
  • - + gRPC
  • @@ -946,7 +1003,7 @@
  • - + Multi TLS certificate termination
  • @@ -958,7 +1015,7 @@
  • - + Rewrite
  • @@ -970,7 +1027,7 @@
  • - + Static IPs
  • @@ -982,7 +1039,7 @@
  • - + TLS termination
  • @@ -993,42 +1050,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1148,9 +1169,9 @@ provides an additional service for the purpose of customizing the error pages se - + - + diff --git a/user-guide/exposing-tcp-udp-services/index.html b/user-guide/exposing-tcp-udp-services/index.html index 940a1cbc4..c2de29408 100644 --- a/user-guide/exposing-tcp-udp-services/index.html +++ b/user-guide/exposing-tcp-udp-services/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -694,8 +751,8 @@
  • - - Ingress examples + + Introduction
  • @@ -718,8 +775,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -749,7 +806,7 @@
  • - + Basic Authentication
  • @@ -761,7 +818,7 @@
  • - + Client Certificate Authentication
  • @@ -773,7 +830,7 @@
  • - + External Basic Authentication
  • @@ -785,7 +842,7 @@
  • - + External OAUTH Authentication
  • @@ -821,7 +878,7 @@
  • - + Configuration Snippets
  • @@ -833,7 +890,7 @@
  • - + Custom Configuration
  • @@ -845,7 +902,7 @@
  • - + Custom Errors
  • @@ -857,7 +914,7 @@
  • - + Custom Headers
  • @@ -869,7 +926,7 @@
  • - + Custom Upstream server checks
  • @@ -881,8 +938,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -893,7 +950,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -905,7 +962,7 @@
  • - + Sysctl tuning
  • @@ -922,7 +979,7 @@
  • - + Docker registry
  • @@ -934,7 +991,7 @@
  • - + gRPC
  • @@ -946,7 +1003,7 @@
  • - + Multi TLS certificate termination
  • @@ -958,7 +1015,7 @@
  • - + Rewrite
  • @@ -970,7 +1027,7 @@
  • - + Static IPs
  • @@ -982,7 +1039,7 @@
  • - + TLS termination
  • @@ -993,42 +1050,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1155,9 +1176,9 @@ The next example shows how to expose the service kube-d - + - + diff --git a/user-guide/external-articles/index.html b/user-guide/external-articles/index.html index 0270c1dcf..ed63fb576 100644 --- a/user-guide/external-articles/index.html +++ b/user-guide/external-articles/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -694,8 +751,8 @@
  • - - Ingress examples + + Introduction
  • @@ -718,8 +775,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -749,7 +806,7 @@
  • - + Basic Authentication
  • @@ -761,7 +818,7 @@
  • - + Client Certificate Authentication
  • @@ -773,7 +830,7 @@
  • - + External Basic Authentication
  • @@ -785,7 +842,7 @@
  • - + External OAUTH Authentication
  • @@ -821,7 +878,7 @@
  • - + Configuration Snippets
  • @@ -833,7 +890,7 @@
  • - + Custom Configuration
  • @@ -845,7 +902,7 @@
  • - + Custom Errors
  • @@ -857,7 +914,7 @@
  • - + Custom Headers
  • @@ -869,7 +926,7 @@
  • - + Custom Upstream server checks
  • @@ -881,8 +938,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -893,7 +950,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -905,7 +962,7 @@
  • - + Sysctl tuning
  • @@ -922,7 +979,7 @@
  • - + Docker registry
  • @@ -934,7 +991,7 @@
  • - + gRPC
  • @@ -946,7 +1003,7 @@
  • - + Multi TLS certificate termination
  • @@ -958,7 +1015,7 @@
  • - + Rewrite
  • @@ -970,7 +1027,7 @@
  • - + Static IPs
  • @@ -982,7 +1039,7 @@
  • - + TLS termination
  • @@ -993,42 +1050,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1137,9 +1158,9 @@ - + - + diff --git a/user-guide/miscellaneous/index.html b/user-guide/miscellaneous/index.html index c7bf9abc8..e2fe45445 100644 --- a/user-guide/miscellaneous/index.html +++ b/user-guide/miscellaneous/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -765,8 +822,8 @@
  • - - Ingress examples + + Introduction
  • @@ -789,8 +846,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -820,7 +877,7 @@
  • - + Basic Authentication
  • @@ -832,7 +889,7 @@
  • - + Client Certificate Authentication
  • @@ -844,7 +901,7 @@
  • - + External Basic Authentication
  • @@ -856,7 +913,7 @@
  • - + External OAUTH Authentication
  • @@ -892,7 +949,7 @@
  • - + Configuration Snippets
  • @@ -904,7 +961,7 @@
  • - + Custom Configuration
  • @@ -916,7 +973,7 @@
  • - + Custom Errors
  • @@ -928,7 +985,7 @@
  • - + Custom Headers
  • @@ -940,7 +997,7 @@
  • - + Custom Upstream server checks
  • @@ -952,8 +1009,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -964,7 +1021,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -976,7 +1033,7 @@
  • - + Sysctl tuning
  • @@ -993,7 +1050,7 @@
  • - + Docker registry
  • @@ -1005,7 +1062,7 @@
  • - + gRPC
  • @@ -1017,7 +1074,7 @@
  • - + Multi TLS certificate termination
  • @@ -1029,7 +1086,7 @@
  • - + Rewrite
  • @@ -1041,7 +1098,7 @@
  • - + Static IPs
  • @@ -1053,7 +1110,7 @@
  • - + TLS termination
  • @@ -1064,42 +1121,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1290,9 +1311,9 @@ The previous behavior can be restored using retry-non-i - + - + diff --git a/user-guide/monitoring/index.html b/user-guide/monitoring/index.html index 217bdedf0..79d12e58b 100644 --- a/user-guide/monitoring/index.html +++ b/user-guide/monitoring/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -750,8 +807,8 @@
  • - - Ingress examples + + Introduction
  • @@ -774,8 +831,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -805,7 +862,7 @@
  • - + Basic Authentication
  • @@ -817,7 +874,7 @@
  • - + Client Certificate Authentication
  • @@ -829,7 +886,7 @@
  • - + External Basic Authentication
  • @@ -841,7 +898,7 @@
  • - + External OAUTH Authentication
  • @@ -877,7 +934,7 @@
  • - + Configuration Snippets
  • @@ -889,7 +946,7 @@
  • - + Custom Configuration
  • @@ -901,7 +958,7 @@
  • - + Custom Errors
  • @@ -913,7 +970,7 @@
  • - + Custom Headers
  • @@ -925,7 +982,7 @@
  • - + Custom Upstream server checks
  • @@ -937,8 +994,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -949,7 +1006,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -961,7 +1018,7 @@
  • - + Sysctl tuning
  • @@ -978,7 +1035,7 @@
  • - + Docker registry
  • @@ -990,7 +1047,7 @@
  • - + gRPC
  • @@ -1002,7 +1059,7 @@
  • - + Multi TLS certificate termination
  • @@ -1014,7 +1071,7 @@
  • - + Rewrite
  • @@ -1026,7 +1083,7 @@
  • - + Static IPs
  • @@ -1038,7 +1095,7 @@
  • - + TLS termination
  • @@ -1049,42 +1106,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1293,9 +1314,9 @@ According to the above example, this URL will be http://10.192.0.3:31086

    - + - + diff --git a/user-guide/multiple-ingress/index.html b/user-guide/multiple-ingress/index.html index 4ed0dc333..1b807e653 100644 --- a/user-guide/multiple-ingress/index.html +++ b/user-guide/multiple-ingress/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -723,8 +780,8 @@
  • - - Ingress examples + + Introduction
  • @@ -747,8 +804,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -778,7 +835,7 @@
  • - + Basic Authentication
  • @@ -790,7 +847,7 @@
  • - + Client Certificate Authentication
  • @@ -802,7 +859,7 @@
  • - + External Basic Authentication
  • @@ -814,7 +871,7 @@
  • - + External OAUTH Authentication
  • @@ -850,7 +907,7 @@
  • - + Configuration Snippets
  • @@ -862,7 +919,7 @@
  • - + Custom Configuration
  • @@ -874,7 +931,7 @@
  • - + Custom Errors
  • @@ -886,7 +943,7 @@
  • - + Custom Headers
  • @@ -898,7 +955,7 @@
  • - + Custom Upstream server checks
  • @@ -910,8 +967,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -922,7 +979,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -934,7 +991,7 @@
  • - + Sysctl tuning
  • @@ -951,7 +1008,7 @@
  • - + Docker registry
  • @@ -963,7 +1020,7 @@
  • - + gRPC
  • @@ -975,7 +1032,7 @@
  • - + Multi TLS certificate termination
  • @@ -987,7 +1044,7 @@
  • - + Rewrite
  • @@ -999,7 +1056,7 @@
  • - + Static IPs
  • @@ -1011,7 +1068,7 @@
  • - + TLS termination
  • @@ -1022,42 +1079,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1220,9 +1241,9 @@ result in both or all controllers fighting to satisfy the Ingress, and all of th - + - + diff --git a/user-guide/nginx-configuration/annotations/index.html b/user-guide/nginx-configuration/annotations/index.html index b623def6d..122be39d5 100644 --- a/user-guide/nginx-configuration/annotations/index.html +++ b/user-guide/nginx-configuration/annotations/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -442,8 +499,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -789,8 +846,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -1010,8 +1067,8 @@
  • - - Ingress examples + + Introduction
  • @@ -1034,8 +1091,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -1065,7 +1122,7 @@
  • - + Basic Authentication
  • @@ -1077,7 +1134,7 @@
  • - + Client Certificate Authentication
  • @@ -1089,7 +1146,7 @@
  • - + External Basic Authentication
  • @@ -1101,7 +1158,7 @@
  • - + External OAUTH Authentication
  • @@ -1137,7 +1194,7 @@
  • - + Configuration Snippets
  • @@ -1149,7 +1206,7 @@
  • - + Custom Configuration
  • @@ -1161,7 +1218,7 @@
  • - + Custom Errors
  • @@ -1173,7 +1230,7 @@
  • - + Custom Headers
  • @@ -1185,7 +1242,7 @@
  • - + Custom Upstream server checks
  • @@ -1197,8 +1254,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -1209,7 +1266,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -1221,7 +1278,7 @@
  • - + Sysctl tuning
  • @@ -1238,7 +1295,7 @@
  • - + Docker registry
  • @@ -1250,7 +1307,7 @@
  • - + gRPC
  • @@ -1262,7 +1319,7 @@
  • - + Multi TLS certificate termination
  • @@ -1274,7 +1331,7 @@
  • - + Rewrite
  • @@ -1286,7 +1343,7 @@
  • - + Static IPs
  • @@ -1298,7 +1355,7 @@
  • - + TLS termination
  • @@ -1309,42 +1366,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1993,14 +2014,14 @@ Set the annotation nginx.ingress.kubernetes.io/rewrite-

    If the Application Root is exposed in a different path and needs to be redirected, set the annotation nginx.ingress.kubernetes.io/app-root to redirect requests for /.

    Example

    -

    Please check the rewrite example.

    +

    Please check the rewrite example.

    Session Affinity

    The annotation nginx.ingress.kubernetes.io/affinity enables and sets the affinity type in all Upstreams of an Ingress. This way, a request will always be directed to the same upstream server. The only affinity type available for NGINX is cookie.

    Example

    -

    Please check the affinity example.

    +

    Please check the affinity example.

    If you use the cookie affinity type you can also specify the name of the cookie that will be used to route the requests with the annotation nginx.ingress.kubernetes.io/session-cookie-name. The default is to create a cookie named 'INGRESSCOOKIE'.

    @@ -2029,7 +2050,7 @@ This annotation also accepts the alternative form "namespace/secretName", in whi

    Example

    -

    Please check the auth example.

    +

    Please check the auth example.

    Custom NGINX upstream checks

    NGINX exposes some flags in the upstream configuration that enable the configuration of each server in the upstream. The Ingress controller allows custom max_fails and fail_timeout parameters in a global context using upstream-max-fails and upstream-fail-timeout in the NGINX ConfigMap or in a particular Ingress rule. upstream-max-fails defaults to 0. This means NGINX will respect the container's readinessProbe if it is defined. If there is no probe and no values for upstream-max-fails NGINX will continue to send traffic to the container.

    @@ -2048,7 +2069,7 @@ Only one of the Ingress rules should define annotations to configure the upstrea

    Example

    -

    Please check the custom upstream check example.

    +

    Please check the custom upstream check example.

    Custom NGINX upstream hashing

    NGINX supports load balancing by client-server mapping based on consistent hashing for a given key. The key can contain text, variables or any combination thereof. This feature allows for request stickiness other than client IP or cookies. The ketama consistent hashing method will be used which ensures only a few keys would be remapped to different servers on upstream group changes.

    @@ -2079,7 +2100,7 @@ Only one of the Ingress rules should define annotations to configure the upstrea

    Example

    -

    Please check the client-certs example.

    +

    Please check the client-certs example.

    Attention

    @@ -2217,7 +2238,7 @@ applied to each location provided in the ingress rule.

    Example

    -

    Please check the external-auth example.

    +

    Please check the external-auth example.

    Rate limiting

    These annotations define a limit on the connections that can be opened by a single client IP address. @@ -2239,12 +2260,12 @@ This can be used to mitigate nginx.ingress.kubernetes.io/permanent-redirect-code: '308' would return your permanent-redirect with a 308.

    SSL Passthrough

    The annotation nginx.ingress.kubernetes.io/ssl-passthrough instructs the controller to send TLS connections directly -to the backend instead of letting NGINX decrypt the communication. See also TLS/HTTPS in +to the backend instead of letting NGINX decrypt the communication. See also TLS/HTTPS in the User guide.

    Note

    SSL Passthrough is disabled by default and requires starting the controller with the ---enable-ssl-passthrough flag.

    +--enable-ssl-passthrough flag.

    @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -442,8 +499,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -475,11 +532,11 @@ - - ConfigMaps + + ConfigMap @@ -1530,8 +1587,8 @@
  • - - Ingress examples + + Introduction
  • @@ -1554,8 +1611,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -1585,7 +1642,7 @@
  • - + Basic Authentication
  • @@ -1597,7 +1654,7 @@
  • - + Client Certificate Authentication
  • @@ -1609,7 +1666,7 @@
  • - + External Basic Authentication
  • @@ -1621,7 +1678,7 @@
  • - + External OAUTH Authentication
  • @@ -1657,7 +1714,7 @@
  • - + Configuration Snippets
  • @@ -1669,7 +1726,7 @@
  • - + Custom Configuration
  • @@ -1681,7 +1738,7 @@
  • - + Custom Errors
  • @@ -1693,7 +1750,7 @@
  • - + Custom Headers
  • @@ -1705,7 +1762,7 @@
  • - + Custom Upstream server checks
  • @@ -1717,8 +1774,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -1729,7 +1786,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -1741,7 +1798,7 @@
  • - + Sysctl tuning
  • @@ -1758,7 +1815,7 @@
  • - + Docker registry
  • @@ -1770,7 +1827,7 @@
  • - + gRPC
  • @@ -1782,7 +1839,7 @@
  • - + Multi TLS certificate termination
  • @@ -1794,7 +1851,7 @@
  • - + Rewrite
  • @@ -1806,7 +1863,7 @@
  • - + Static IPs
  • @@ -1818,7 +1875,7 @@
  • - + TLS termination
  • @@ -1829,42 +1886,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - -
    @@ -2719,7 +2740,7 @@

    ConfigMaps

    ConfigMaps allow you to decouple configuration artifacts from image content to keep containerized applications portable.

    The ConfigMap API resource stores configuration data as key-value pairs. The data provides the configurations for system -components for the nginx-controller. Before you can begin using a config-map it must be deployed.

    +components for the nginx-controller.

    In order to overwrite nginx-controller configuration values as seen in config.go, you can add key-value pairs to the data section of the config-map. For Example:

    @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -442,8 +499,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -466,8 +523,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -696,8 +753,8 @@
  • - - Ingress examples + + Introduction
  • @@ -720,8 +777,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -751,7 +808,7 @@
  • - + Basic Authentication
  • @@ -763,7 +820,7 @@
  • - + Client Certificate Authentication
  • @@ -775,7 +832,7 @@
  • - + External Basic Authentication
  • @@ -787,7 +844,7 @@
  • - + External OAUTH Authentication
  • @@ -823,7 +880,7 @@
  • - + Configuration Snippets
  • @@ -835,7 +892,7 @@
  • - + Custom Configuration
  • @@ -847,7 +904,7 @@
  • - + Custom Errors
  • @@ -859,7 +916,7 @@
  • - + Custom Headers
  • @@ -871,7 +928,7 @@
  • - + Custom Upstream server checks
  • @@ -883,8 +940,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -895,7 +952,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -907,7 +964,7 @@
  • - + Sysctl tuning
  • @@ -924,7 +981,7 @@
  • - + Docker registry
  • @@ -936,7 +993,7 @@
  • - + gRPC
  • @@ -948,7 +1005,7 @@
  • - + Multi TLS certificate termination
  • @@ -960,7 +1017,7 @@
  • - + Rewrite
  • @@ -972,7 +1029,7 @@
  • - + Static IPs
  • @@ -984,7 +1041,7 @@
  • - + TLS termination
  • @@ -995,42 +1052,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1131,7 +1152,7 @@ In addition to the built-in functions provided by the Go package the following f @@ -1182,9 +1203,9 @@ In addition to the built-in functions provided by the Go package the following f - + - + diff --git a/user-guide/nginx-configuration/index.html b/user-guide/nginx-configuration/index.html index 0dbbf9898..449ab3fda 100644 --- a/user-guide/nginx-configuration/index.html +++ b/user-guide/nginx-configuration/index.html @@ -32,11 +32,11 @@ - + - NGINX Configuration - NGINX Ingress Controller + Introduction - NGINX Ingress Controller @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -126,7 +126,7 @@ NGINX Ingress Controller - NGINX Configuration + Introduction @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -450,8 +507,8 @@ - - NGINX Configuration + + Introduction @@ -475,8 +532,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -696,8 +753,8 @@
  • - - Ingress examples + + Introduction
  • @@ -720,8 +777,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -751,7 +808,7 @@
  • - + Basic Authentication
  • @@ -763,7 +820,7 @@
  • - + Client Certificate Authentication
  • @@ -775,7 +832,7 @@
  • - + External Basic Authentication
  • @@ -787,7 +844,7 @@
  • - + External OAUTH Authentication
  • @@ -823,7 +880,7 @@
  • - + Configuration Snippets
  • @@ -835,7 +892,7 @@
  • - + Custom Configuration
  • @@ -847,7 +904,7 @@
  • - + Custom Errors
  • @@ -859,7 +916,7 @@
  • - + Custom Headers
  • @@ -871,7 +928,7 @@
  • - + Custom Upstream server checks
  • @@ -883,8 +940,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -895,7 +952,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -907,7 +964,7 @@
  • - + Sysctl tuning
  • @@ -924,7 +981,7 @@
  • - + Docker registry
  • @@ -936,7 +993,7 @@
  • - + gRPC
  • @@ -948,7 +1005,7 @@
  • - + Multi TLS certificate termination
  • @@ -960,7 +1017,7 @@
  • - + Rewrite
  • @@ -972,7 +1029,7 @@
  • - + Static IPs
  • @@ -984,7 +1041,7 @@
  • - + TLS termination
  • @@ -995,42 +1052,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1088,7 +1109,7 @@ @@ -1139,9 +1160,9 @@ - + - + diff --git a/user-guide/nginx-configuration/log-format/index.html b/user-guide/nginx-configuration/log-format/index.html index dbe6f2386..b7fb306d1 100644 --- a/user-guide/nginx-configuration/log-format/index.html +++ b/user-guide/nginx-configuration/log-format/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -442,8 +499,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -466,8 +523,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -696,8 +753,8 @@
  • - - Ingress examples + + Introduction
  • @@ -720,8 +777,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -751,7 +808,7 @@
  • - + Basic Authentication
  • @@ -763,7 +820,7 @@
  • - + Client Certificate Authentication
  • @@ -775,7 +832,7 @@
  • - + External Basic Authentication
  • @@ -787,7 +844,7 @@
  • - + External OAUTH Authentication
  • @@ -823,7 +880,7 @@
  • - + Configuration Snippets
  • @@ -835,7 +892,7 @@
  • - + Custom Configuration
  • @@ -847,7 +904,7 @@
  • - + Custom Errors
  • @@ -859,7 +916,7 @@
  • - + Custom Headers
  • @@ -871,7 +928,7 @@
  • - + Custom Upstream server checks
  • @@ -883,8 +940,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -895,7 +952,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -907,7 +964,7 @@
  • - + Sysctl tuning
  • @@ -924,7 +981,7 @@
  • - + Docker registry
  • @@ -936,7 +993,7 @@
  • - + gRPC
  • @@ -948,7 +1005,7 @@
  • - + Multi TLS certificate termination
  • @@ -960,7 +1017,7 @@
  • - + Rewrite
  • @@ -972,7 +1029,7 @@
  • - + Static IPs
  • @@ -984,7 +1041,7 @@
  • - + TLS termination
  • @@ -995,42 +1052,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1252,9 +1273,9 @@ - + - + diff --git a/user-guide/third-party-addons/modsecurity/index.html b/user-guide/third-party-addons/modsecurity/index.html index c7d9efd43..824919224 100644 --- a/user-guide/third-party-addons/modsecurity/index.html +++ b/user-guide/third-party-addons/modsecurity/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -696,8 +753,8 @@
  • - - Ingress examples + + Introduction
  • @@ -720,8 +777,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -751,7 +808,7 @@
  • - + Basic Authentication
  • @@ -763,7 +820,7 @@
  • - + Client Certificate Authentication
  • @@ -775,7 +832,7 @@
  • - + External Basic Authentication
  • @@ -787,7 +844,7 @@
  • - + External OAUTH Authentication
  • @@ -823,7 +880,7 @@
  • - + Configuration Snippets
  • @@ -835,7 +892,7 @@
  • - + Custom Configuration
  • @@ -847,7 +904,7 @@
  • - + Custom Errors
  • @@ -859,7 +916,7 @@
  • - + Custom Headers
  • @@ -871,7 +928,7 @@
  • - + Custom Upstream server checks
  • @@ -883,8 +940,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -895,7 +952,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -907,7 +964,7 @@
  • - + Sysctl tuning
  • @@ -924,7 +981,7 @@
  • - + Docker registry
  • @@ -936,7 +993,7 @@
  • - + gRPC
  • @@ -948,7 +1005,7 @@
  • - + Multi TLS certificate termination
  • @@ -960,7 +1017,7 @@
  • - + Rewrite
  • @@ -972,7 +1029,7 @@
  • - + Static IPs
  • @@ -984,7 +1041,7 @@
  • - + TLS termination
  • @@ -995,42 +1052,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1144,9 +1165,9 @@ Using enable-owasp-modsecurity-crs: "true" - + - + diff --git a/user-guide/third-party-addons/opentracing/index.html b/user-guide/third-party-addons/opentracing/index.html index 37e89f626..64489492c 100644 --- a/user-guide/third-party-addons/opentracing/index.html +++ b/user-guide/third-party-addons/opentracing/index.html @@ -32,7 +32,7 @@ - + @@ -54,8 +54,8 @@ - + @@ -100,7 +100,7 @@ - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -752,8 +809,8 @@
  • - - Ingress examples + + Introduction
  • @@ -776,8 +833,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -807,7 +864,7 @@
  • - + Basic Authentication
  • @@ -819,7 +876,7 @@
  • - + Client Certificate Authentication
  • @@ -831,7 +888,7 @@
  • - + External Basic Authentication
  • @@ -843,7 +900,7 @@
  • - + External OAUTH Authentication
  • @@ -879,7 +936,7 @@
  • - + Configuration Snippets
  • @@ -891,7 +948,7 @@
  • - + Custom Configuration
  • @@ -903,7 +960,7 @@
  • - + Custom Errors
  • @@ -915,7 +972,7 @@
  • - + Custom Headers
  • @@ -927,7 +984,7 @@
  • - + Custom Upstream server checks
  • @@ -939,8 +996,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -951,7 +1008,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -963,7 +1020,7 @@
  • - + Sysctl tuning
  • @@ -980,7 +1037,7 @@
  • - + Docker registry
  • @@ -992,7 +1049,7 @@
  • - + gRPC
  • @@ -1004,7 +1061,7 @@
  • - + Multi TLS certificate termination
  • @@ -1016,7 +1073,7 @@
  • - + Rewrite
  • @@ -1028,7 +1085,7 @@
  • - + Static IPs
  • @@ -1040,7 +1097,7 @@
  • - + TLS termination
  • @@ -1051,42 +1108,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1360,13 +1381,13 @@ http://192.168.99.100:30183 - + Skip to content @@ -205,13 +205,16 @@ @@ -315,12 +312,72 @@ +
  • + + + + + +
  • + @@ -383,8 +440,8 @@
  • - - Upgrading + + Upgrade
  • @@ -440,8 +497,8 @@
  • - - NGINX Configuration + + Introduction
  • @@ -464,8 +521,8 @@
  • - - ConfigMaps + + ConfigMap
  • @@ -778,8 +835,8 @@
  • - - Ingress examples + + Introduction
  • @@ -802,8 +859,8 @@
  • - - Sticky Session + + Sticky Sessions
  • @@ -833,7 +890,7 @@
  • - + Basic Authentication
  • @@ -845,7 +902,7 @@
  • - + Client Certificate Authentication
  • @@ -857,7 +914,7 @@
  • - + External Basic Authentication
  • @@ -869,7 +926,7 @@
  • - + External OAUTH Authentication
  • @@ -905,7 +962,7 @@
  • - + Configuration Snippets
  • @@ -917,7 +974,7 @@
  • - + Custom Configuration
  • @@ -929,7 +986,7 @@
  • - + Custom Errors
  • @@ -941,7 +998,7 @@
  • - + Custom Headers
  • @@ -953,7 +1010,7 @@
  • - + Custom Upstream server checks
  • @@ -965,8 +1022,8 @@
  • - - External authentication, authentication service response headers propagation + + External authentication
  • @@ -977,7 +1034,7 @@
  • - + Custom DH parameters for perfect forward secrecy
  • @@ -989,7 +1046,7 @@
  • - + Sysctl tuning
  • @@ -1006,7 +1063,7 @@
  • - + Docker registry
  • @@ -1018,7 +1075,7 @@
  • - + gRPC
  • @@ -1030,7 +1087,7 @@
  • - + Multi TLS certificate termination
  • @@ -1042,7 +1099,7 @@
  • - + Rewrite
  • @@ -1054,7 +1111,7 @@
  • - + Static IPs
  • @@ -1066,7 +1123,7 @@
  • - + TLS termination
  • @@ -1077,42 +1134,6 @@ - - - - - -
  • - - Developing for NGINX Ingress Controller - -
  • - - - - - - - -
  • - - How it works - -
  • - - - - - - - -
  • - - Troubleshooting - -
  • - - @@ -1239,7 +1260,7 @@ If this flag is not provided NGINX will use a self-signed certificate.

    For instance, if you have a TLS secret foo-tls in the default namespace, add --default-ssl-certificate=default/foo-tls in the nginx-controller deployment.

    SSL Passthrough

    -

    The --enable-ssl-passthrough flag enables the SSL Passthrough feature, which is disabled by +

    The --enable-ssl-passthrough flag enables the SSL Passthrough feature, which is disabled by default. This is required to enable passthrough backends in Ingress objects.

    Warning

    @@ -1379,9 +1400,9 @@ are not compatible with nginx-ingress's default configuration.

    - + - +
    --alsologtostderr--alsologtostderr log to standard error as well as files
    --annotations-prefix string--annotations-prefix string Prefix of the Ingress annotations specific to the NGINX controller. (default "nginx.ingress.kubernetes.io")
    --apiserver-host string--apiserver-host string Address of the Kubernetes API server. Takes the form "protocol://address:port". If not specified, it is assumed the program runs inside a Kubernetes cluster and local discovery is attempted.
    --configmap string--configmap string Name of the ConfigMap containing custom global configurations for the controller.
    --default-backend-service string--default-backend-service string Service used to serve HTTP requests not matching any known server name (catch-all). Takes the form "namespace/name". The controller configures NGINX to forward requests to the first port of this Service.
    --default-server-port int--default-server-port int Port to use for exposing the default server (catch-all). (default 8181)
    --default-ssl-certificate string--default-ssl-certificate string Secret containing a SSL certificate to be used by the default HTTPS server (catch-all). Takes the form "namespace/name".
    --election-id string--election-id string Election id to use for Ingress status updates. (default "ingress-controller-leader")
    --enable-dynamic-configurationDynamically refresh backends on topology changes instead of reloading NGINX. Feature backed by OpenResty Lua libraries. (enabled by default)
    --enable-dynamic-certificates--enable-dynamic-certificates Dynamically serves certificates instead of reloading NGINX when certificates are created, updated, or deleted. Currently does not support OCSP stapling, so --enable-ssl-chain-completion must be turned off. Assuming the certificate is generated with a 2048 bit RSA key/cert pair, this feature can store roughly 5000 certificates. This is an experiemental feature that currently is not ready for production use. Feature backed by OpenResty Lua libraries. (disabled by default)
    --enable-ssl-chain-completion--enable-dynamic-configurationDynamically refresh backends on topology changes instead of reloading NGINX. Feature backed by OpenResty Lua libraries. (default true)
    --enable-ssl-chain-completion Autocomplete SSL certificate chains with missing intermediate CA certificates. A valid certificate chain is required to enable OCSP stapling. Certificates uploaded to Kubernetes must have the "Authority Information Access" X.509 v3 extension for this to succeed. (default true)
    --enable-ssl-passthrough--enable-ssl-passthrough Enable SSL Passthrough.
    --force-namespace-isolation--force-namespace-isolation Force namespace isolation. Prevents Ingress objects from referencing Secrets and ConfigMaps located in a different namespace than their own. May be used together with watch-namespace.
    --health-check-path string--health-check-path string URL path of the health check endpoint. Configured inside the NGINX status server. All requests received on the port defined by the healthz-port parameter are forwarded internally to this path. (default "/healthz")
    --healthz-port int--healthz-port int Port to use for the healthz endpoint. (default 10254)
    --http-port int--http-port int Port to use for servicing HTTP traffic. (default 80)
    --https-port int--https-port int Port to use for servicing HTTPS traffic. (default 443)
    --ingress-class string--ingress-class string Name of the ingress class this controller satisfies. The class of an Ingress object is set using the annotation "kubernetes.io/ingress.class". All ingress classes are satisfied if this parameter is left empty.
    --kubeconfig string--kubeconfig string Path to a kubeconfig file containing authorization and API server information.
    --log_backtrace_at traceLocation--log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0)
    --log_dir string--log_dir string If non-empty, write log files in this directory
    --logtostderr--logtostderr log to standard error instead of files (default true)
    --profiling--profiling Enable profiling via web interface host:port/debug/pprof/ (default true)
    --publish-service string--publish-service string Service fronting the Ingress controller. Takes the form "namespace/name". When used together with update-status, the controller mirrors the address of this service's endpoints to the load-balancer status of all Ingress objects it satisfies.
    --publish-status-address string--publish-status-address string Customized address to set as the load-balancer status of Ingress objects this controller satisfies. Requires the update-status parameter.
    --report-node-internal-ip-address--report-node-internal-ip-address Set the load-balancer status of Ingress objects to internal Node addresses instead of external. Requires the update-status parameter.
    --sort-backends--sort-backends Sort servers inside NGINX upstreams.
    --ssl-passthrough-proxy-port int--ssl-passthrough-proxy-port int Port to use internally for SSL Passthrough. (default 442)
    --status-port int--status-port int Port to use for exposing NGINX status pages. (default 18080)
    --stderrthreshold severity--stderrthreshold severity logs at or above this threshold go to stderr (default 2)
    --sync-period durationPeriod at which the controller forces the repopulation of its local object stores. (default is 0)--sync-period durationPeriod at which the controller forces the repopulation of its local object stores. Disabled by default.
    --sync-rate-limit float32--sync-rate-limit float32 Define the sync frequency upper limit (default 0.3)
    --tcp-services-configmap string--tcp-services-configmap string Name of the ConfigMap containing the definition of the TCP services to expose. The key in the map indicates the external port to be used. The value is a reference to a Service in the form "namespace/name:port", where "port" can either be a port number or name. TCP ports 80 and 443 are reserved by the controller for servicing HTTP traffic.
    --udp-services-configmap string--udp-services-configmap string Name of the ConfigMap containing the definition of the UDP services to expose. The key in the map indicates the external port to be used. The value is a reference to a Service in the form "namespace/name:port", where "port" can either be a port name or number.
    --update-status--update-status Update the load-balancer status of Ingress objects this controller satisfies. Requires setting the publish-service parameter to a valid Service reference. (default true)
    --update-status-on-shutdown--update-status-on-shutdown Update the load-balancer status of Ingress objects when the controller shuts down. Requires the update-status parameter. (default true)
    --v Level-v, --v Level log level for V logs
    --version--version Show release information about the NGINX Ingress controller and exit.
    --vmodule moduleSpec--vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging
    --watch-namespace string--watch-namespace string Namespace the controller watches for updates to Kubernetes objects. This includes Ingresses, Services and all configuration resources. All namespaces are watched if this parameter is left empty.