From 9873393f1595a0a25ffb7315983024f851f79d99 Mon Sep 17 00:00:00 2001
From: Hieromon Ikasamo
Date: Sun, 14 Apr 2019 13:34:57 +0900
Subject: [PATCH] Deployment v0.9.8 documentation
---
docs/404.html | 135 +-
docs/acelements.html | 385 +++--
docs/achandling.html | 173 +--
docs/acintro.html | 137 +-
docs/acjson.html | 293 ++--
docs/acupload.html | 1322 +++++++++++++++++
docs/advancedusage.html | 177 ++-
docs/api.html | 163 +-
docs/apiaux.html | 206 +--
docs/apiconfig.html | 137 +-
docs/apielements.html | 650 +++++---
docs/apiextra.html | 137 +-
...on.b806dc00.js => application.dc02f8ce.js} | 8 +-
docs/assets/javascripts/lunr/lunr.du.js | 2 +-
docs/assets/javascripts/lunr/lunr.ja.js | 1 +
docs/assets/javascripts/lunr/lunr.jp.js | 2 +-
docs/assets/javascripts/lunr/lunr.nl.js | 1 +
docs/assets/javascripts/lunr/lunr.th.js | 1 +
docs/assets/javascripts/lunr/wordcut.js | 1 +
docs/assets/javascripts/modernizr.01ccdecf.js | 1 +
docs/assets/javascripts/modernizr.1f0bcf2b.js | 1 -
.../stylesheets/application.3020aac5.css | 1 +
.../stylesheets/application.982221ab.css | 1 -
docs/basicusage.html | 135 +-
docs/changelog.html | 164 +-
docs/credit.html | 1185 +++++++++++++++
docs/datatips.html | 159 +-
docs/faq.html | 332 +----
docs/gettingstarted.html | 135 +-
docs/howtoembed.html | 137 +-
docs/images/ac_upload_flow.svg | 973 ++++++++++++
docs/images/acfile.png | Bin 0 -> 4870 bytes
docs/images/upload.gif | Bin 0 -> 183630 bytes
docs/index.html | 145 +-
docs/license.html | 135 +-
docs/lsbegin.html | 157 +-
docs/menu.html | 135 +-
docs/menuize.html | 137 +-
docs/search/search_index.json | 2 +-
docs/sitemap.xml | 54 +-
docs/sitemap.xml.gz | Bin 363 -> 377 bytes
docs/wojson.html | 141 +-
42 files changed, 5748 insertions(+), 2313 deletions(-)
create mode 100644 docs/acupload.html
rename docs/assets/javascripts/{application.b806dc00.js => application.dc02f8ce.js} (50%)
create mode 100644 docs/assets/javascripts/lunr/lunr.ja.js
create mode 100644 docs/assets/javascripts/lunr/lunr.nl.js
create mode 100644 docs/assets/javascripts/lunr/lunr.th.js
create mode 100644 docs/assets/javascripts/lunr/wordcut.js
create mode 100644 docs/assets/javascripts/modernizr.01ccdecf.js
delete mode 100644 docs/assets/javascripts/modernizr.1f0bcf2b.js
create mode 100644 docs/assets/stylesheets/application.3020aac5.css
delete mode 100644 docs/assets/stylesheets/application.982221ab.css
create mode 100644 docs/credit.html
create mode 100644 docs/images/ac_upload_flow.svg
create mode 100644 docs/images/acfile.png
create mode 100644 docs/images/upload.gif
diff --git a/docs/404.html b/docs/404.html
index 261529a..7a87358 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -36,7 +36,7 @@
-
+
@@ -44,7 +44,7 @@
-
+
@@ -55,7 +55,7 @@
-
+
@@ -223,81 +223,6 @@
-
-
-
-
-
-
-
+
diff --git a/docs/acelements.html b/docs/acelements.html
index 4e88f0d..3ad756d 100644
--- a/docs/acelements.html
+++ b/docs/acelements.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
@@ -618,8 +541,8 @@
-
- AutoConnectInput
+
+ AutoConnectFile
@@ -651,6 +574,54 @@
label
+
+
+
+
+ store
+
+
+
+
+
+
+
+
+
+
+
+ AutoConnectInput
+
+
+
+
+
+
+
+
+
+ AutoConnectInput
+
+
+
+
+
+
+
+ Constructor
+
+
+
+
+
+
+ name
+
+
+
+
+
+
+ value
+
+
+
+
+
+
+ label
+
+
@@ -1354,14 +1428,14 @@
-
+
Constructor
-
+
name
@@ -1375,7 +1449,7 @@
-
+
label
@@ -1409,14 +1483,14 @@
-
+
Constructor
-
+
name
@@ -1430,7 +1504,7 @@
-
+
label
@@ -1450,21 +1524,21 @@
-Furthermore, to convert an entity that is not an AutoConnectElement to its native type, you must re-interpret that type with c++.
+Furthermore, to convert an entity that is not an AutoConnectElement to its native type, you must re-interpret that type with c++. Or, you can be coding the sketch more easily with using the as<T> function.
+AutoConnectAux customPage;
+
+AutoConnectElementVT & elements = customPage.getElements();
+for (AutoConnectElement & elm : elements) {
+ if (elm.type() == AC_Text) {
+ AutoConnectText & text = customPage[elm.name].as < AutoConnectText > ();
+ text.style = "color:gray;" ;
+ // Or, it is also possible to write the code further reduced as follows.
+ // customPage[elm.name].as<AutoConnectText>().style = "color:gray;";
+ }
+}
+
+
AutoConnectButton generates an HTML < button type = "button" >
tag and locates a clickable button to a custom Web page. Currently AutoConnectButton corresponds only to name, value, an onclick attribute of HTML button tag. An onclick attribute is generated from an action
member variable of the AutoConnectButton, which is mostly used with a JavaScript to activate a script.
Sample
@@ -1670,20 +1766,46 @@
Only will be displayed if a label is not specified.
checked
A checked is a Boolean value and indicates the checked status of the checkbox. The value of the checked checkbox element is packed in the query string and sent.
+AutoConnectFile
+AutoConnectFile generates asn HTML < input type = "file" >
tag and a < label >
tag. AutoConnectFile enables file upload from the client through the web browser to ESP8266/ESP32 module. You can select the flash in the module, external SD device or any output destination as the storage of the uploaded file.
+ Sample
+AutoConnectFile file("file", "", "Upload:", AC_File_FS)
+On the page:
+ Constructor
+AutoConnectFile( const char * name, const char * value, const char * label, const ACFile_t store)
+
+
+ name
+It is the name
of the AutoConnectFile element and matches the name attribute of the input tag. It also becomes the parameter name of the query string when submitted.
+ value
+File name to be upload. The value contains the value entered by the client browser to the < input type = "file" >
tag and is read-only. Even If you give a value to the constructor, it does not affect as an initial value like a default file name.
+ label
+A label
is an optional string. A label is always arranged on the left side of the input box. Specification of a label will generate an HTML < label >
tag with an id attribute. The input box and the label are connected by the id attribute.
+ store
+Specifies the destination to save the uploaded file. The destination can be specified the following values in the ACFile_t enumeration type.
+
+AC_File_FS
: Save as the SPIFFS file in flash of ESP8266/ESP32 module.
+AC_File_SD
: Save to an external SD device connected to ESP8266/ESP32 module.
+AC_File_Extern
: Pass the content of the uploaded file to the uploader which is declared by the sketch individually. Its uploader must inherit AutoConnectUploadHandler class and implements _open , _write and _close function.
+
+
+
Built-in uploader is ready.
+
AutoConnect already equips the built-in uploader for saving to the SPIFFS as AC_File_FS and the external SD as AC_File_SD. It is already implemented inside AutoConnect and will store uploaded file automatically.
+
AutoConnectInput generates an HTML < input type = "text" >
tag and a < label >
tag. It can also have a placeholder. The value of the input box is passed to the destination in the query string and can be retrieved programmatically. You can also update from the sketches.
Sample
AutoConnectInput input("input", "", "Server", "MQTT broker server");
On the page:
- Constructor
+ Constructor
AutoConnectInput( const char * name, const char * value, const char * label, const char * pattern, const char * placeholder)
- name
+ name
It is the name
of the AutoConnectInput element and matches the name attribute, the id attribute of the input tag. It also becomes the parameter name of the query string when submitted.
- value
+ value
It becomes a string value of the value
attribute of an HTML < input type = "text" >
tag. The text entered from the custom Web page will be grouped in the query string of the form submission and the string set before accessing the page will be displayed as the initial value.
- label
+ label
A label
is an optional string. A label is always arranged on the left side of the input box. Specification of a label will generate an HTML < label >
tag with an id attribute. The input box and the label are connected by the id attribute.
pattern
A pattern
specifies a regular expression that the AutoConnectInput element's value is checked against on form submission. If it is invalid, the background color will change, but it will be sent even if the data format does not match. To check whether the entered value matches the pattern, use the isValid function.
@@ -1712,15 +1834,15 @@ Only will be displayed if a label is not specified
Sample
AutoConnectRadio radio("radio", { "30 sec.", "60 sec.", "180 sec." }, "Update period", AC_Vertical, 1);
On the page:
- Constructor
+ Constructor
AutoConnectRadio( const char * name, std :: vector < String > const & values, const char * label, const ACArrange_t order, const uint8_t checked)
- name
+ name
It is the name
of the AutoConnectRadio element and matches the name attribute of the input tags. It also becomes the parameter name of the query string when submitted.
values
A values
is an array of String type for the radio button options which as actually std::vector . It is an initialization list can be used. The input tags will be generated from each entry in the values, the amount of which is the same as the number of items in values
.
- label
+ label
A label is an optional string. A label will be arranged in the left or top of the radio buttons according to the order . Specification of a label will generate an HTML < label >
tag with an id
attribute. The radio buttons and the label are connected by the id attribute.
order
A order
specifies the direction to arrange the radio buttons. It is a value of type ACArrange_t
and accepts one of the following:
@@ -1736,28 +1858,28 @@ Only will be displayed if a label is not specified
Sample
AutoConnectSelect select("select", { String("Europe/London"), String("Europe/Berlin"), String("Europe/Helsinki"), String("Europe/Moscow"), String("Asia/Dubai") }, "Select TZ name");
On the page:
- Constructor
+ Constructor
AutoConnectSelect( const char * name, std :: vector < String > const & options, const char * label)
- name
+ name
It is the name
of the AutoConnectSelect element and matches the name attribute of the select tags.
options
An options
is an array of String type for the options which as actually std::vector for an HTML < option >
tag. It is an initialization list can be used. The option tags will be generated from each entry in the options, the amount of which is the same as the number of items in an options
.
- label
+ label
A label
is an optional string. A label is always arranged on the left side of the drop-down list. Specification of a label will generate an HTML < label >
tag with an id attribute. The select tag and the label are connected by the id attribute.
AutoConnectSubmit
AutoConnectSubmit generates an HTML < input type = "button" >
tag attached onclick
attribute. The native code of the onclick
attribute is the submission of the form with the POST method.
Sample
AutoConnectSubmit submit("submit", "Save", "/mqtt_save");
On the page:
- Constructor
+ Constructor
AutoConnectSubmit( const char * name, const char * value, const char * uri)
- name
+ name
It is the name
of the AutoConnectSubmit element and matches the name attribute of the input tag.
- value
+ value
It becomes a string of the value
attribute of an HTML < input type = "button" >
tag. The value
will be displayed as a label of the button.
uri
A uri
specifies the URI to send form data when the button declared by AutoConnectSubmit is clicked.
@@ -1768,27 +1890,30 @@ Only will be displayed if a label is not specified
Sample
AutoConnectText text("text", "Publishing the WiFi signal strength to MQTT channel. RSSI value of ESP8266 to the channel created on ThingSpeak", "font-family:serif;color:#4682b4;");
On the page:
- Constructor
-AutoConnectText( const char * name, const char * value, const char * style)
+ Constructor
+AutoConnectText( const char * name, const char * value, const char * style, const char * format)
- name
+ name
A name
does not exist in the generated HTML. It provides only a means of accessing elements with the sketches.
- value
+ value
It becomes content and also can contain the native HTML code, but remember that your written code is enclosed by the div tag.
style
A style
specifies the qualification style to give to the content and can use the style attribute format as it is.
+
+A format
is a pointer to a null-terminated multibyte string specifying how to interpret the value. It specifies the conversion format when outputting values. The format string conforms to C-style printf library functions, but depends on the espressif sdk implementation. The conversion specification is valid only in %s format. (Left and Right justification, width are also valid.)
How to coding for the elements
Declaration for the elements in Sketches
Variables of each AutoConnetElement can be declared with macros. By using the macros, you can treat element name that is String type as variable in sketches.
ACElement ( name [ , value ] )
ACButton ( name [ , value ] [ , action ] )
ACCheckbox ( name [ , value ] [ , label ] [ , true | false ] )
+ACFile ( name [ , value ] [ , label ] [ , AC_File_FS | AC_File_SD | AC_File_Extern ] )
ACInput ( name [ , value ] [ , label ] [ , pattern ] [ , placeholder ] )
ACRadio ( name [ , values ] [ , label ] [ , AC_Horizontal | AC_Vertical ] [ , checked ] )
ACSelect ( name [ , options ] [ , label ] )
ACSubmit ( name [ , value ] [ , uri ] )
-ACText ( name [ , value ] [ , style ] )
+ACText ( name [ , value ] [ , style ] [ , format ] )
Declaration macro usage
For example, AutoConnectText can be declared using macros.
@@ -1900,7 +2025,7 @@ equals by using ACText macro.
-
+
diff --git a/docs/achandling.html b/docs/achandling.html
index bead60b..fd9f332 100644
--- a/docs/achandling.html
+++ b/docs/achandling.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
@@ -824,12 +747,60 @@
-
-
+
+
+
+
+
Appendix
+
+
+
+ Appendix
+
+
+
+
+
@@ -1118,7 +1089,19 @@ AutoConnectElements contained in AutoConnectAux object are uniquely identified b
AutoConnectElementVT * AutoConnectAux :: getElements( void )
-The getElement function returns an AutoConnectElement with the specified name as a key. When you use this function, you need to know the type of AutoConnectElement in advance. To retrieve an AutoConnectElement by specifying its type, use the following method.
+The getElement function returns an AutoConnectElement with the specified name as a key. When you use this function, you need to know the type of AutoConnectElement in advance and specify its type <T> to an argument of the getElement. A type of <T> can be specified as follows.
+AutoConnectButton & AutoConnectAux :: getElement < AutoConnectButton > ( const String & name)
+AutoConnectCheckbox & AutoConnectAux :: getElement < AutoConnectCheckbox > ( const String & name)
+AutoConnectElement & AutoConnectAux :: getElement < AutoConnectElement > ( const String & name)
+AutoConnectFile & AutoConnectAux :: getElement < AutoConnectFile > ( const String & name)
+AutoConnectInput & AutoConnectAux :: getElement < AutoConnectInput > ( const String & name)
+AutoConnectRadio & AutoConnectAux :: getElement < AutoConnectRadio > ( const String & name)
+AutoConnectSelect & AutoConnectAux :: getElement < AutoConnectSelect > ( const String & name)
+AutoConnectSubmit & AutoConnectAux :: getElement < AutoConnectSubmit > ( const String & name)
+AutoConnectText & AutoConnectAux :: getElement < AutoConnectText > ( const String & name)
+
+
+To retrieve an AutoConnectElement by specifying its type, use the following method.
AutoConnectAux aux;
aux.load( "SOME_JSON_DOCUMENT" );
@@ -1138,6 +1121,28 @@ AutoConnectElements contained in AutoConnectAux object are uniquely identified b
Serial.println(text.value);
+You can also use the operator []
of AutoConnectAux as another way to get the desired element. An operator []
is a shortcut for getElement function with the reference casting and makes simplify the sketch code and treats like an array with the elements placed on a custom Web page. Its argument is the name of the element to be acquired similarly to getElement function. In the sketch, by combining the AutoConnectElement::as<T> function with the operator []
, you can access the AutoConnectElements reference according to its actual type. For example, the following sketch code returns the same as a reference of AutoConnectText element as the caption
.
+AutoConnect portal;
+portal.load(auxJson);
+AutoConnectAux & aux = * portal.aux( "/page1" );
+AutoConnectText & text1 = aux.getElement < AutoConnectElement > ( "caption" );
+AutoConnectText & text2 = aux[ "caption" ].as < AutoConnectText > ();
+
+
+
+
Need cast to convert to the actual type
+
An operator []
returns a referene of an AutoConnectElement. It is necessary to convert the type according to the actual element type with AutoConnectElement::as<T> functon.
+
AutoConnectButton & AutoConnectElement :: as < AutoConnectButton > ()
+AutoConnectCheckbox & AutoConnectElement :: as < AutoConnectCheckbox > ()
+AutoConnectElement & AutoConnectElement :: as < AutoConnectElement > ()
+AutoConnectFile & AutoConnectElement :: as < AutoConnectFile > ()
+AutoConnectInput & AutoConnectElement :: as < AutoConnectInput > ()
+AutoConnectRadio & AutoConnectElement :: as < AutoConnectRadio > ()
+AutoConnectSelect & AutoConnectElement :: as < AutoConnectSelect > ()
+AutoConnectSubmit & AutoConnectElement :: as < AutoConnectSubmit > ()
+AutoConnectText & AutoConnectElement :: as < AutoConnectText > ()
+
+
To get all the AutoConnectElements in an AutoConnectAux object use the getElements function. This function returns the vector of the reference wrapper as AutoConnectElementVT to all AutoConnectElements registered in the AutoConnectAux.
AutoConnectElementVT & AutoConnectAux :: getElements( void )
@@ -1722,7 +1727,7 @@ ESP8266WebServer class will parse the query string and rebuilds its arguments wh
-
+
diff --git a/docs/acintro.html b/docs/acintro.html
index 198d98a..b9660b8 100644
--- a/docs/acintro.html
+++ b/docs/acintro.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
-
+
diff --git a/docs/acjson.html b/docs/acjson.html
index e54311b..4530f01 100644
--- a/docs/acjson.html
+++ b/docs/acjson.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
@@ -582,6 +505,13 @@
ACElement
+
+
+
+
+ ACFile
+
+
@@ -634,6 +564,53 @@
Loading JSON document
+
+
+
+
@@ -832,12 +809,60 @@
-
-
+
+
+
+
+
Appendix
+
+
+
+ Appendix
+
+
+
+
+
@@ -997,6 +1022,13 @@
ACElement
+
+
+
+
+ ACFile
+
+
@@ -1049,6 +1081,53 @@
Loading JSON document
+
+
+
+
@@ -1204,6 +1283,11 @@
+
+
+
@@ -1269,6 +1353,27 @@
+ ACFile
+
+
+
+value : The file name of the upload file will be stored. The value
is read-only and will be ignored if specified.
+
+
+
+
+label : Specifies a label of the file selection box. Its placement is always to the left of the file selection box.
+
+
+
+
+store : Specifies the destination to save the uploaded file. Its value accepts one of the following:
+fs : Save as the SPIFFS file in flash of ESP8266/ESP32 module.
+sd : Save to an external SD device connected to ESP8266/ESP32 module.
+extern : Pass the content of the uploaded file to the uploader which is declared by the sketch individually. Its uploader must inherit AutoConnectUploadHandler class and implements _open , _write and _close function.
+
+
+
@@ -1350,12 +1455,18 @@
style : Specifies the qualification style to give to the content and can use the style attribute format as it is.
+
+
+format : Specifies how to interpret the value. It specifies the conversion format when outputting values. The format string conforms to the C-style printf library functions, but depends on the espressif sdk implementation. The conversion specification is valid only for %s format. (Left and Right justification, width are also valid.)
+
+
AutoConnect's JSON parsing process is not perfect
-
It is based on ArduinoJson, but the process is simplified to save memory. As a result, even if there is an unnecessary key, it will not be an error. It is ignored.
+
It is based on analysis by ArduinoJson, but the semantic analysis is simplified to save memory. Consequently, it is not an error that a custom Web page JSON document to have unnecessary keys. It will be ignored.
Loading JSON document
+ Loading from the streamed file
AutoConnect supports loading of JSON document from the following instances:
String
@@ -1399,6 +1510,20 @@ An example of using each function is as follows.
aux.close();
AutoConnect passes the given JSON document directly to the parseObject() function of the ArduinoJson library for parsing. Therefore, the constraint of the parseObject() function is applied as it is in the parsing of the JSON document for the AutoConnect. That is, if the JSON string is read-only, duplicating the input string occurs and consumes more memory.
+ Adjust the JSON document buffer size
+AutoConnect uses ArduinoJson library's dynamic buffer to parse JSON documents. Its dynamic buffer allocation scheme depends on the version 5 or version 6 of ArduinoJson library. Either version must have enough buffer to parse the custom web page's JSON document successfully. AutoConnect has the following three constants internally to complete the parsing as much as possible in both ArduinoJson version. These constants are macro defined in AutoConnectDefs.h .
+If memory insufficiency occurs during JSON document parsing, you can adjust these constants to avoid insufficiency by using the JsonAssistant with deriving the required buffer size in advance.
+#define AUTOCONNECT_JSONBUFFER_SIZE 256
+#define AUTOCONNECT_JSONDOCUMENT_SIZE (8 * 1024)
+#define AUTOCONNECT_JSONPSRAM_SIZE (16* 1024)
+
+
+AUTOCONNECT_JSONBUFFER_SIZE
+This is a unit size constant of DynamicJsonBuffer and works when the library used is ArduinoJson version 5. A buffer size of the JSON document increases with this unit. This value relates to the impact of the fragmented heap area. If it is too large, may occur run-out of memory.
+AUTOCONNECT_JSONDOCUMENT_SIZE
+This is a size of DynamicJsonDocument for ArduinoJson version 6. This buffer is not automatically expanding, and the size determines the limit.
+AUTOCONNECT_JSONPSRAM_SIZE
+For ESP32 module equips with PSRAM, you can allocate the JSON document buffer to PSRAM. Buffer allocation to PSRAM will enable when PSRAM:Enabled option selected in the Arduino IDE's Board Manager menu. It is available since ArduinoJson 6.10.0.
Saving JSON document
The sketch can persist AutoConnectElements as a JSON document and also uses this function to save the values entered on the custom Web page. And you can reload the saved JSON document into AutoConnectElements as the field in a custom Web page using the load function .
-
+
diff --git a/docs/acupload.html b/docs/acupload.html
new file mode 100644
index 0000000..db04b41
--- /dev/null
+++ b/docs/acupload.html
@@ -0,0 +1,1322 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ File upload handler - AutoConnect for ESP8266/ESP32
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ File upload handler
+
+ Uploading file from Web Browser
+If you have to write some data individually to the ESP8266/ESP32 module for the sketch behavior, the AutoConnectFile element will assist with your wants implementation. The AutoConnectFile element produces an HTML <input type="file">
tag and can save uploaded file to the flash or external SD of the ESP8266/ESP32 module. The handler for saving is built into AutoConnect. You can use it to inject any sketch data such as the initial values for the custom Web page into the ESP module via OTA without using the sketch data upload tool of Arduino-IDE.
+
+Basic steps of the file upload sketch
+Here is the basic procedure of the sketch which can upload files from the client browser using AutoConnectFile:
+
+Place AutoConnectFile on a custom Web page by writing JSON or constructor code directly with the sketch.
+Place other AutoConnectElements as needed.
+Place AutoConnectSubmit on the same custom Web page.
+Perform the following process in the on-handler of submitting destination:
+Retrieve the AutoConnectFile instance from the custom Web page where you placed the AutoConnectFile element using the AutoConnectAux::getElement function or the operator [] .
+Start access to the device specified as the upload destination. In usually, it depends on the file system's begin function. For example, if you specified Flash's SPIFFS as the upload destination, invokes SPIFFS.begin() .
+The value member of AutoConnectFile contains the file name of the upload file. Use its file name to access the uploaded file on the device.
+Invokes the end function associated with the begin to close the device. It is the SPIFFS.end()* if the flash on the ESP module has been begun for SPIFFS.
+
+
+
+The following sketch is an example that implements the above basic steps. The postUpload function is the on-handler and retrieves the AutoConnectFile as named upload_file
. You should note that this handler is not for a custom Web page placed with its AutoConnectFile element. The uploaded file should be processed by the handler for the transition destination page from the AutoConnectFile element placed page. AutoConnect built-in upload handler will save the uploaded file to the specified device before invoking the postUpload function.
+However, If you use uploaded files in different situations, it may be more appropriate to place the actual handling process outside the handler. It applies for the parameter file, etc. The important thing is that you do not have to sketch file reception and storing logic by using the AutoConnectFile element and the upload handler built into the AutoConnect.
+#include <ESP8266WiFi.h>
+#include <ESP8266WebServer.h>
+#include <FS.h>
+#include <AutoConnect.h>
+
+// Upload request custom Web page
+static const char PAGE_UPLOAD[] PROGMEM = R"(
+{
+ "uri": "/",
+ "title": "Upload",
+ "menu": true,
+ "element": [
+ { "name":"caption", "type":"ACText", "value":"<h2>File uploading platform<h2>" },
+ { "name":"upload_file", "type":"ACFile", "label":"Select file: ", "store":"fs" },
+ { "name":"upload", "type":"ACSubmit", "value":"UPLOAD", "uri":"/upload" }
+ ]
+}
+)" ;
+
+// Upload result display
+static const char PAGE_BROWSE[] PROGMEM = R"(
+{
+ "uri": "/upload",
+ "title": "Upload",
+ "menu": false,
+ "element": [
+ { "name":"caption", "type":"ACText", "value":"<h2>Uploading ended<h2>" },
+ { "name":"filename", "type":"ACText" },
+ { "name":"size", "type":"ACText", "format":"%s bytes uploaded" },
+ { "name":"content_type", "type":"ACText", "format":"Content: %s" }
+ ]
+}
+)" ;
+
+ESP8266WebServer server;
+AutoConnect portal (server);
+// Declare AutoConnectAux separately as a custom web page to access
+// easily for each page in the post-upload handler.
+AutoConnectAux auxUpload;
+AutoConnectAux auxBrowse;
+
+/**
+ * Post uploading, AutoConnectFile's built-in upload handler reads the
+ * file saved in SPIFFS and displays the file contents on /upload custom
+ * web page. However, only files with mime type uploaded as text are
+ * displayed. A custom web page handler is called after upload.
+ * @param aux AutoConnectAux(/upload)
+ * @param args PageArgument
+ * @return Uploaded text content
+ */
+String postUpload (AutoConnectAux & aux, PageArgument & args) {
+ String content;
+ AutoConnectFile & upload = auxUpload[ "upload_file" ].as < AutoConnectFile > ();
+ AutoConnectText & aux_filename = aux[ "filename" ].as < AutoConnectText > ();
+ AutoConnectText & aux_size = aux[ "size" ].as < AutoConnectText > ();
+ AutoConnectText & aux_contentType = aux[ "content_type" ].as < AutoConnectText > ();
+ // Assignment operator can be used for the element attribute.
+ aux_filename.value = upload.value;
+ aux_size.value = String(upload.size);
+ aux_contentType.value = upload.mimeType;
+ // The file saved by the AutoConnect upload handler is read from
+ // the EEPROM and echoed to a custom web page.
+ SPIFFS.begin();
+ File uploadFile = SPIFFS.open(String( "/" + upload.value).c_str(), "r" );
+ if (uploadFile) {
+ while (uploadFile.available()) {
+ char c = uploadFile.read();
+ Serial.print(c);
+ }
+ uploadFile.close();
+ }
+ else
+ content = "Not saved" ;
+ SPIFFS.end();
+ return String();
+}
+
+void setup () {
+ delay( 1000 );
+ Serial.begin( 115200 );
+ Serial.println();
+
+ auxUpload.load(PAGE_UPLOAD);
+ auxBrowse.load(PAGE_BROWSE);
+ portal.join({ auxUpload, auxBrowse });
+ auxBrowse.on(postUpload);
+ portal.begin();
+}
+
+void loop () {
+ portal.handleClient();
+}
+
+
+Where will the file upload
+The AutoConnect built-in upload handler can save the upload file to three locations:
+
+Flash memory embedded in the ESP8266/ESP32 module
+SD device externally connected to the ESP8266/ESP32 module
+Other character devices
+
+You can specify the device type to save with the store attribute of AutoConenctFile, and it accepts the following values:
+
+Flash : AC_File_FS
for the API parameter or fs
for the JSON document
+SD : AC_File_SD
for the API parameter or sd
for the JSON document
+Other : AC_File_Extern
for the API parameter or extern
for the JSON document
+
+The substance of AC_File_FS (fs) is a SPIFFS file system implemented by the ESP8266/ESP32 core, and then AutoConnect uses the Global Instance SPIFFS to access SPIFFS.
+Also, the substance of AC_File_SD (sd) is a FAT file of Arduino SD library ported to the ESP8266/ESP32 core, and then AutoConnect uses the Global Instance SD to access SD. When saving to an external SD device, there are additional required parameters for the connection interface and is defined as the macro in AutoConnectDefs.h.
+#define AUTOCONNECT_SD_CS SS
+#define AUTOCONNECT_SD_SPEED 4000000
+
+
+AUTOCONNECT_SD_CS
defines which GPIO for the CS (Chip Select, or SS as Slave Select) pin. This definition is derived from pins_arduino.h, which is included in the Arduino core distribution. If you want to assign the CS pin to another GPIO, you need to change the macro definition of AutoConnectDefs.h.
+AUTOCONNECT_SD_SPEED
defines SPI clock speed depending on the connected device.
+
+
Involves both the begin() and the end()
+
The built-in uploader executes the begin and end functions regardless of the sketch whence the file system of the device will terminate with the uploader termination. Therefore, to use the device in the sketch after uploading, you need to restart it with the begin function.
+
+When it will be uploaded
+Upload handler will be launched by ESP8266WebServer/WebServer(as ESP32) library which is triggered by receiving an HTTP stream of POST BODY including file content. Its launching occurs before invoking the page handler.
+The following diagram illustrates the file uploading sequence:
+
+At the time of the page handler behaves, the uploaded file already saved to the device, and the member variables of AutoConnectFile reflects the file name and transfer size.
+The file name for the uploaded file
+AutoConnetFile saves the uploaded file with the file name you selected by <input type="file">
tag on the browser. The file name used for uploading is stored in the AutoConnetFile's value member, which you can access after uploading. (i.e. In the handler of the destination page by the AutoConnectSubmit element.) You can not save it with a different name. It can be renamed after upload if you need to change the name.
+Upload to a device other than Flash or SD
+You can output the file to any device using a custom uploader by specifying extern with the store attribute of [AutoConnectFile (or specifying AC_File_Extern for the store member variable) and can customize the uploader according to the need to upload files to other than Flash or SD. Implements your own uploader with inheriting the AutoConnectUploadHandler class which is the base class of the upload handler.
+
+
It's not so difficult
+
Implementing the custom uploader requires a little knowledge of the c++ language. If you are less attuned to programming c++, you may find it difficult. But don't worry. You can make it in various situations by just modifying the sketch skeleton that appears at the end of this page.
+
+ Upload handler base class
+AutoConnectUploadHandler is a base class of upload handler and It has one public member function and three protected functions.
+ Constructor
+AutoConnectUploadHandler()
+
+
+ Member functions
+The upload public function is an entry point, the ESP8266WebServer (WebServer as ESP32) library will invoke the upload with each time of uploading content divided into chunks.
+Also, the _open , _write and _close protected functions are actually responsible for saving files and are declared as pure virtual functions. A custom uploader class that inherits from the AutoConnectUploadHandler class need to implement these functions.
+The actual upload process is handled by the three private functions above, and then upload only invokes three functions according to the upload situation. In usually, there is no need to override the upload function in an inherited class.
+
public virtual void upload( const String & requestUri, const HTTPUpload & upload)
+
+
+ Parameters
+ requestUri URI of upload request source.
+ upload A data structure of the upload file as HTTPUpload . It is defined in the ESP8266WebServer (WebServer as ESP32) library as follows:
+
typedef struct {
+ HTTPUploadStatus status;
+ String filename;
+ String name;
+ String type;
+ size_t totalSize;
+ size_t currentSize;
+ size_t contentLength;
+ uint8_t buf[HTTP_UPLOAD_BUFLEN];
+} HTTPUpload;
+
+
+
+The upload handler needs to implement processing based on the enumeration value of HTTPUpload.status as HTTPUploadStatus enum type. HTTPUploadStatus enumeration is as follows:
+
+UPLOAD_FILE_START
: Invokes to the _open.
+UPLOAD_FILE_WRITE
: Invokes to the _write.
+UPLOAD_FILE_END
: Invokes to the _close.
+UPLOAD_FILE_ABORTED
: Invokes to the _close.
+
+The _open function will be invoked when HTTPUploadStatus is UPLOAD_FILE_START . Usually, the implementation of an inherited class will open the file.
+
protected virtual bool _open( const char * filename, const char * mode) = 0
+
+
+ Parameters
+ filename Uploading file name.
+ mode An indicator for the file access mode, a "w" for writing.
+ Return value
+ true File open successful.
+ false Failed to open.
+
+The _write function will be invoked when HTTPUploadStatus is UPLOAD_FILE_WRITE . The content of the upload file is divided and the _write will be invoked in multiple times. Usually, the implementation of an inherited class will write data.
+
protected virtual size_t _write( const uint8_t * buf, const size_t size)) = 0
+
+
+ Parameters
+ buf File content block.
+ size File block size to write.
+ Return value
+ Size written.
+
+The _close function will be invoked when HTTPUploadStatus is UPLOAD_FILE_END or UPLOAD_FILE_ABORTED . Usually, the implementation of an inherited class will close the file.
+protected virtual void _close( void ) = 0
+
+
+For reference, the following AutoConnectUploadFS class is an implementation of AutoConnect built-in uploader and inherits from AutoConnectUploadHandler.
+class AutoConnectUploadFS : public AutoConnectUploadHandler {
+ public :
+ explicit AutoConnectUploadFS(SPIFFST & media) : _media( & media) {}
+ ~ AutoConnectUploadFS() { _close(); }
+
+ protected :
+ bool _open( const char * filename, const char * mode) override {
+ if (_media -> begin()) {
+ _file = _media -> open(filename, mode);
+ return _file != false;
+ }
+ return false;
+ }
+
+ size_t _write( const uint8_t * buf, const size_t size) override {
+ if (_file)
+ return _file.write(buf, size);
+ else
+ return - 1 ;
+ }
+
+ void _close( void ) override {
+ if (_file)
+ _file.close();
+ _media -> end();
+ }
+
+ private :
+ SPIFFST * _media;
+ SPIFileT _file;
+};
+
+
+ Register custom upload handler
+In order to upload a file by the custom uploader, it is necessary to register it to the custom Web page beforehand. To register a custom uploader, specify the custom uploader class name in the template argument of the AutoConnectAux::onUpload function and invokes it.
+
void AutoConnectAux :: onUpload < T > (T & uploadClass)
+
+
+ Parameters
+ T Specifies a class name of the custom uploader. This class name is a class that you implemented by inheriting AutoConnectUploadHandler for custom upload.
+ uploadClass Specifies the custom upload class instance.
+
+The rough structure of the sketches that completed these implementations will be as follows:
+#include <ESP8266WiFi.h>
+#include <ESP8266WebServer.h>
+#include <AutoConnect.h>
+
+static const char PAGE_UPLOAD[] PROGMEM = R"(
+{
+ "uri": "/",
+ "title": "Upload",
+ "menu": true,
+ "element": [
+ { "name":"caption", "type":"ACText", "value":"<h2>File uploading platform<h2>" },
+ { "name":"upload_file", "type":"ACFile", "label":"Select file: ", "store":"extern" },
+ { "name":"upload", "type":"ACSubmit", "value":"UPLOAD", "uri":"/upload" }
+ ]
+}
+)" ;
+
+static const char PAGE_RECEIVED[] PROGMEM = R"(
+{
+ "uri": "/upload",
+ "title": "Upload ended",
+ "menu": false,
+ "element": [
+ { "name":"caption", "type":"ACText", "value":"<h2>File uploading ended<h2>" }
+ ]
+}
+)" ;
+
+// Custom upload handler class
+class CustomUploader : public AutoConnectUploadHandler {
+public :
+ CustomUploader() {}
+ ~ CustomUploader() {}
+
+protected :
+ bool _open( const char * filename, const char * mode) override ;
+ size_t _write ( const uint8_t * buf, const size_t size) override ;
+ void _close ( void ) override ;
+};
+
+// _open for custom open
+bool CustomUploader :: _open( const char * filename, const char * mode) {
+ // Here, an implementation for the open file.
+}
+
+// _open for custom write
+size_t CustomUploader :: _write( const uint8_t * buf, const size_t size) {
+ // Here, an implementation for the writing the file data.
+}
+
+// _open for custom close
+void CustomUploader :: _close( void ) {
+ // Here, an implementation for the close file.
+}
+
+AutoConnect portal;
+AutoConnectAux uploadPage;
+AutoConnectAux receivePage;
+CustomUploader uploader; // Declare the custom uploader
+
+void setup () {
+ uploadPage.load(PAGE_UPLOAD);
+ receivePage.load(PAGE_RECEIVED);
+ portal.join({ uploadPage, receivePage });
+ receivePage.onUpload < CustomUploader > (uploader); // Register the custom uploader
+ portal.begin();
+}
+
+void loop () {
+ portal.handleClient();
+}
+
+
+
+
Don't forget to specify the store
+
When using a custom uploader, remember to specify the extern for the store attribute of AutoConnectFile.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/advancedusage.html b/docs/advancedusage.html
index a70b26d..e026ec9 100644
--- a/docs/advancedusage.html
+++ b/docs/advancedusage.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,81 +229,6 @@
-
-
-
-
-
-
@@ -432,6 +357,13 @@
404 handler
+
+
+
+
+ Access to saved credentials
+
+
@@ -474,6 +406,13 @@
Change menu title
+
+
+
+
+ Change the menu labels
+
+
@@ -843,12 +782,60 @@
-
-
+
+
+
+
+
Appendix
+
+
+
+ Appendix
+
+
+
+
+
@@ -917,6 +904,13 @@
404 handler
+
+
+
+
+ Access to saved credentials
+
+
@@ -959,6 +953,13 @@
Change menu title
+
+
+
+
+ Change the menu labels
+
+
@@ -1105,7 +1106,9 @@
Advanced usage
404 handler
-Registering the "not found" handler is a different way than ESP8266WebServer/WebServer. The onNotFound of ESP8266WebServer/WebServer does not work with AutoConnect. AutoConnect overrides ESP8266WebServer::onNotFound /WebServer::onNotFound to handle a captive portal. To register "not found" handler, use AutoConnect::onNotFound .
+Registering the "not found" handler is a different way than ESP8266WebServer (WebServer as ESP32). The onNotFound of ESP8266WebServer/WebServer does not work with AutoConnect. AutoConnect overrides ESP8266WebServer::onNotFound /WebServer::onNotFound to handle a captive portal. To register "not found" handler, use AutoConnect::onNotFound .
+ Access to saved credentials
+AutoConnect stores the established WiFi connection in the EEPROM of the ESP8266/ESP32 module and equips the class to access it from the sketch. You can read, write or erase the credentials using this class individually. It's AutoConnectCredential class which provides the access method to the saved credentials in EEPROM. Refer to section Saved credentail access for details.
Automatic reconnect
When the captive portal is started, SoftAP starts and the STA is disconnected. The current SSID setting memorized in ESP8266 will be lost but then the reconnect behavior of ESP32 is somewhat different from this.
The WiFiSTAClass::disconnect function implemented in the arduino-esp32 has extended parameters than the ESP8266's arduino-core. The second parameter of WiFi.disconnect on the arduino-esp32 core that does not exist in the ESP8266WiFiSTAClass has the effect of deleting the currently connected WiFi configuration and its default value is "false". On the ESP32 platform, even if WiFi.disconnect is executed, WiFi.begin() without the parameters in the next turn will try to connect to that AP. That is, automatic reconnection is implemented in arduino-esp32 already. Although this behavior appears seemingly competent, it is rather a disadvantage in scenes where you want to change the access point each time. When explicitly disconnecting WiFi from the Disconnect menu, AutoConnect will erase the AP connection settings saved by arduino-esp32 core. AutoConnect's automatic reconnection is a mechanism independent from the automatic reconnection of the arduino-esp32 core.
@@ -1267,6 +1270,16 @@ Also, if you want to stop AutoConnect completely when the captive portal is time
+
+You can change the label of the AutoConnect menu item by rewriting the default label letter in AutoConnectLabels.h macros. However, changing menu items letter influences all the sketch's build scenes.
+#define AUTOCONNECT_MENULABEL_CONFIGNEW "Configure new AP"
+#define AUTOCONNECT_MENULABEL_OPENSSIDS "Open SSIDs"
+#define AUTOCONNECT_MENULABEL_DISCONNECT "Disconnect"
+#define AUTOCONNECT_MENULABEL_RESET "Reset..."
+#define AUTOCONNECT_MENULABEL_HOME "HOME"
+#define AUTOCONNECT_BUTTONLABEL_RESET "RESET"
+
+
Combination with mDNS
With mDNS library , you can access to ESP8266 by name instead of IP address after connection. The sketch can start the MDNS responder after AutoConnect::begin .
#include <ESP8266WiFi.h>
@@ -1596,7 +1609,7 @@ The above example does not connect to WiFi until TRIGGER_PIN goes LOW. When TRIG
-
+
diff --git a/docs/api.html b/docs/api.html
index 8269d0d..ec7574f 100644
--- a/docs/api.html
+++ b/docs/api.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
Returns a pointer to AutoConnectAux with the URI specified by uri . If AutoConnectAux with that URI is not bound, it returns nullptr .
- Parameters
+ Parameter
uri A string of the URI.
Return value
A Pointer of the AutoConnectAux instance.
@@ -1160,7 +1131,7 @@ The captive portal will not be started if the connection has been established wi
false Configuration parameter is invalid, some values out of range.
end
-void end()
+
Stops AutoConnect captive portal service. Release ESP8266WebServer/WebServer and DNSServer.
@@ -1169,12 +1140,12 @@ The captive portal will not be started if the connection has been established wi
The end function releases the instance of ESP8266WebServer/WebServer and DNSServer. It can not process them after the end function.
handleClient
-void handleClient()
+
Process the AutoConnect menu interface. The handleClient() function of the ESP8266WebServer/WebServer hosted by AutoConnect is also called from within AutoConnect, and the client request handlers contained in the user sketch are also handled.
handleRequest
-void handleRequest()
+
Handling for the AutoConnect menu request.
@@ -1188,20 +1159,20 @@ The captive portal will not be started if the connection has been established wi
Put a user site's home URI. The URI specified by home is linked from "HOME" in the AutoConnect menu.
- Parameters
+ Parameter
uri A URI string of user site's home path.
host
-
ESP8266WebServer & host()
+ESP8266WebServer & host( void )
-
WebServer & host()
+
Returns the reference of the ESP8266WebServer/WebServer which is allocated in AutoConnect automatically.
@@ -1226,7 +1197,7 @@ or
Join the AutoConnectAux object to AutoConnect. AutoConnectAux objects can be joined one by one, or joined altogether. The AutoConnectAux object joined by the join function can be handled from the AutoConnect menu.
- Parameters
+ Parameter
aux Reference to AutoConnectAux. It can be std::vector of std::reference_wrapper of AutoConnectAux with list initialization .
load
@@ -1238,7 +1209,7 @@ Join the AutoConnectAux object to AutoConnect. AutoConnectAux objects can be joi
Load JSON document of AutoConnectAux which contains AutoConnectElements. If there is a syntax error in the JSON document, false is returned.
- Parameters
+ Parameter
aux The input string to be loaded.
Return value
true The JSON document as AutoConnectAux successfully loaded.
@@ -1284,7 +1255,7 @@ Called even before generating HTML and after generated.
Register the function which will call from AutoConnect at the start of the captive portal.
- Parameters
+ Parameter
fn Function called at the captive portal start.
@@ -1292,7 +1263,7 @@ Register the function which will call from AutoConnect at the start of the capti
typedef std :: function < bool (IPAddress softapIP) > DetectExit_ft
- Parameters
+ Parameter
softapIP An IP address of SoftAP for the captive portal.
Return value
true Continues captive portal handling.
@@ -1312,7 +1283,7 @@ Register the function which will call from AutoConnect at the start of the capti
Register the handler function for undefined URL request detected.
- Parameters
+ Parameter
fn A function of the "not found" handler.
where
@@ -1408,7 +1379,7 @@ This function is provided to access the fields (ie. the AutoConnectElements) wit
-
+
diff --git a/docs/apiaux.html b/docs/apiaux.html
index 0af2880..45f414e 100644
--- a/docs/apiaux.html
+++ b/docs/apiaux.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
@@ -566,6 +489,13 @@
+
+
+ operator [ ]
+
+
+
+
add
@@ -613,6 +543,13 @@
on
+
+
+
+
+ onUpload
+
+
@@ -777,12 +714,60 @@
-
-
+
+
+
+
+
Appendix
+
+
+
+ Appendix
+
+
+
+
+
@@ -866,6 +851,13 @@
+
+
+ operator [ ]
+
+
+
+
add
@@ -913,6 +905,13 @@
on
+
+
+
+
+ onUpload
+
+
@@ -979,6 +978,15 @@
addons Reference to AutoConnectElement collection.
Public member functions
+ operator [ ]
+
AutoConnectElement & operator []( const String & name)
+
+Returns a reference to the element specified by name . An operator []
is a shortcut for getElement function with the reference casting. Unlike getElement, which returns a pointer to that element, an operator []
returns a reference to that element. You also need to cast the return value to the actual type, just like the getElement function.
+
+ Parameter
+ name Name of the AutoConnectElements to be retrieved.
+ Return value A reference to AutoConnectElement. It is different from the actual element type.
+
add
void add(AutoConnectElement & addon)
@@ -998,7 +1006,7 @@ Add an element to the AutoConnectAux. An added element is displayed on the custo
Get a registered AutoConnectElement as specified name. If T is specified as an actual type of AutoConnectElements, it returns a reference to that instance.
Parameters
- T Actual type name of AutoConnectElements as AutoConnectButton , AutoConnectCheckbox , AutoConnectElement , AutoConnectInput , AutoConnectRadio , AutoConnectSelect , AutoConnectSubmit , AutoConnectText .
+ T Actual type name of AutoConnectElements as AutoConnectButton , AutoConnectCheckbox , AutoConnectElement , AutoConnectFile , AutoConnectInput , AutoConnectRadio , AutoConnectSelect , AutoConnectSubmit , AutoConnectText .
name Name of the AutoConnectElements to be retrieved.
Return value A reference of the AutoConnectElements. If a type is not specified returns a pointer.
@@ -1029,7 +1037,7 @@ Get vector of reference of all elements.
Load all AutoConnectElements elements from JSON document into AutoConnectAux as custom Web pages. The JSON document specified by the load function must be the document structure of AutoConnectAux. Its JSON document can describe multiple pages as an array.
- Parameters
+ Parameter
in Specifies the JSON document to be load. The load function can input the following objects.
String : Read-only String
@@ -1088,7 +1096,7 @@ The outermost [
, ]
is missing.
Set or reset the display as menu item for this AutoConnectAux. This function programmatically manipulates the menu parameter of the AutoConenctAux constructor .
- Parameters
+ Parameter
true Show on the menu.
false Hidden on the menu.
@@ -1122,12 +1130,36 @@ Called even before generating HTML and after generated.
+ onUpload
+
void onUpload < T &> (T handler)
+
+void onUpload(PageBuilder :: UploadFuncT uploadFunc)
+
+Register the upload handler of the AutoConnectAux.
+
+ Parameters
+ T Specifies a class name of the custom uploader inherited from AutoConnectUploadHandler class. Refer to the appendix for details.
+ handler Specifies the custom uploader inherited from AutoConnectUploadHandler class. Refer to the appendix for details.
+ uploadFunc A function that behaves when request to upload with the AutoConnectAux page. UploadFuncT type is defined by the following declaration.void(const String&, const HTTPUpload&)
A data structure of the upload file as HTTPUpload. It is defined in the ESP8266WebServer (the WebServer for ESP32) library as follows:
+
typedef struct {
+ HTTPUploadStatus status;
+ String filename;
+ String name;
+ String type;
+ size_t totalSize;
+ size_t currentSize;
+ size_t contentLength;
+ uint8_t buf[HTTP_UPLOAD_BUFLEN];
+} HTTPUpload;
+
+Refer to 'To upload to a device other than Flash or SD ' in section appendix for details.
+
release
bool release( const String & name)
Release a specified AutoConnectElement from AutoConenctAux. The release function is provided to dynamically change the structure of the custom Web pages with the sketch. By combining the release function and the add function or the loadElement function, the sketch can change the style of the custom Web page according to its behavior.
- Parameters
+ Parameter
name Specifies the name of AutoConnectElements to be released.
Return value
true The AutoConnectElement successfully released.
@@ -1271,7 +1303,7 @@ Set the title string of the custom Web page. This title will be displayed as the
-
+
diff --git a/docs/apiconfig.html b/docs/apiconfig.html
index d9798e7..15c2c94 100644
--- a/docs/apiconfig.html
+++ b/docs/apiconfig.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
-
+
diff --git a/docs/apielements.html b/docs/apielements.html
index ee9ae60..74134a6 100644
--- a/docs/apielements.html
+++ b/docs/apielements.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
@@ -772,6 +695,13 @@
typeOf
+
+
+
+
+ as<T>
+
+
@@ -785,8 +715,8 @@
-
- AutoConnectInput
+
+ AutoConnectFile
@@ -826,6 +756,101 @@
label
+
+
+
+
+ store
+
+
+
+
+
+
+ mimeType
+
+
+
+
+
+
+ size
+
+
+
+
+
+
+
+
+
+
+
+ Public member functions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AutoConnectInput
+
+
+
+
+
+
+
+ Constructor
+
+
+
+
+
+
+ Public member variables
+
+
+
+
+
+
+
+ name
+
+
+
+
+
+
+ value
+
+
+
+
+
+
+ label
+
+
@@ -848,7 +873,7 @@
-
+
Public member functions
@@ -856,7 +881,7 @@
-
+
typeOf
@@ -888,14 +913,14 @@
-
+
Constructor
-
+
Public member variables
@@ -903,7 +928,7 @@
-
+
name
@@ -917,7 +942,7 @@
-
+
label
@@ -943,7 +968,7 @@
-
+
Public member functions
@@ -951,7 +976,7 @@
-
+
typeOf
@@ -986,14 +1011,14 @@
-
+
size
-
+
value
@@ -1018,14 +1043,14 @@
-
+
Constructor
-
+
Public member variables
@@ -1033,7 +1058,7 @@
-
+
name
@@ -1047,7 +1072,7 @@
-
+
label
@@ -1059,7 +1084,7 @@
-
+
Public member functions
@@ -1067,7 +1092,7 @@
-
+
typeOf
@@ -1095,7 +1120,7 @@
-
+
size
@@ -1120,14 +1145,14 @@
-
+
+
+ as<T>
+
+
+
+
+
+
+
@@ -1648,8 +1735,8 @@
-
- AutoConnectInput
+
+ AutoConnectFile
@@ -1689,6 +1776,101 @@
label
+
+
+
+
+ store
+
+
+
+
+
+
+ mimeType
+
+
+
+
+
+
+ size
+
+
+
+
+
+
+
+
+
+
+
+ Public member functions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AutoConnectInput
+
+
+
+
+
+
+
+ Constructor
+
+
+
+
+
+
+ Public member variables
+
+
+
+
+
+
+
+ name
+
+
+
+
+
+
+ value
+
+
+
+
+
+
+ label
+
+
@@ -1711,7 +1893,7 @@
-
+
Public member functions
@@ -1719,7 +1901,7 @@
-
+
typeOf
@@ -1751,14 +1933,14 @@
-
+
Constructor
-
+
Public member variables
@@ -1766,7 +1948,7 @@
-
+
name
@@ -1780,7 +1962,7 @@
-
+
label
@@ -1806,7 +1988,7 @@
-
+
Public member functions
@@ -1814,7 +1996,7 @@
-
+
typeOf
@@ -1849,14 +2031,14 @@
-
+
size
-
+
value
@@ -1881,14 +2063,14 @@
-
+
Constructor
-
+
Public member variables
@@ -1896,7 +2078,7 @@
-
+
name
@@ -1910,7 +2092,7 @@
-
+
label
@@ -1922,7 +2104,7 @@
-
+
Public member functions
@@ -1930,7 +2112,7 @@
-
+
typeOf
@@ -1958,7 +2140,7 @@
-
+
size
@@ -1983,14 +2165,14 @@
-
+
Constructor
-
+
Public member variables
@@ -1998,14 +2180,14 @@
-
+
name
-
+
value
@@ -2024,7 +2206,7 @@
-
+
Public member functions
@@ -2032,7 +2214,7 @@
-
+
typeOf
@@ -2057,14 +2239,14 @@
-
+
Constructor
-
+
Public member variables
@@ -2072,14 +2254,14 @@
@@ -2098,7 +2287,7 @@
-
+
Public member functions
@@ -2106,7 +2295,7 @@
-
+
typeOf
@@ -2255,8 +2444,82 @@ Returns type of AutoConnectElement.
Return value
AC_Element
-
+ as<T>
+
AutoConnectElement & as < T > ( void )
+
+Casts the reference to the AutoConnectElement the specified type.
+
+ Parameter
+ T The element type. AutoConnectElements type such as AutoConnectButton , AutoConnectCheckbox , AutoConnectFile , AutoConnectInput , AutoConnectRadio , AutoConnectSelect , AutoConnectSubmit , AutoConnectText .
+ Return value
+ A reference to the AutoConnectElement with actual type.
+
+AutoConnectFile
Constructor
+
AutoConnectFile( const char * name = "" , const char * value = "" , const char * label = "" , const ACFile_t store = AC_File_FS)
+
+
+ Parameters
+ name The element name.
+ value File name to be upload.
+ label Label string.
+ store The ACFile_t enumerator that represents the media to save the uploaded file.
+
+
+ Public member variables
+ name
+The element name.
+
+ Type
+ String
+
+ value
+File name to be upload. The value contains the value entered by the client browser to the < input type = "file" >
tag and is read-only.
+
+ Type
+ String
+
+ label
+A label is an optional string. A label is always arranged on the left side of the file input box. Specification of a label will generate an HTML < label >
tag with an id attribute. The file input box and the label are connected by the id attribute.
+
+ Type
+ String
+
+ store
+Specifies the save destination of the uploaded file. You can use the built-in uploader to save uploaded file to the flash of the ESP8266/ESP32 module or external SD media without writing a dedicated sketch code. It also supports saving to any destination using a custom uploader that inherits from the AutoConnectUploadHandler class.
+
+ Type
+ ACFile_t
+
+AC_File_FS
: Save the uploaded file to SPIFFS in the flash.
+AC_File_SD
: Save the uploaded file to SD.
+AC_File_Extern
: Save the file using your own upload handler.
+
+
+
+ mimeType
+The mime type of the upload file which included as Media type in the http post request. Set by the client (usually the browser) that requested the upload. It is determined by the file type as application/octet-stream
, text
etc. which is described in IANA Media Type .
+
+ Type
+ String
+
+ size
+Size of the uploading file.
+
+ Type
+ size_t
+
+ Public member functions
+ typeOf
+
ACElement_t typeOf( void )
+
+Returns type of AutoConnectFile.
+
+ Return value
+ AC_File
+
+
+ Constructor
AutoConnectInput( const char * name = "" , const char * value = "" , const char * label = "" , const char * pattern = "" , const char * placeholder = "" )
@@ -2267,20 +2530,20 @@ Returns type of AutoConnectElement.
pattern Regular expression string for checking data format.
placeholder A placeholder string.
- Public member variables
- name
+ Public member variables
+ name
The element name.
Type
String
- value
+ value
Value of the element. It becomes a value attribute of an HTML < input type = "text" >
tag. An entered text in the custom Web page will be sent with a query string of the form. The value set before accessing the page is displayed as the initial value.
Type
String
- label
+ label
A label is an optional string. A label is always arranged on the left side of the input box. Specification of a label will generate an HTML < label >
tag with an id attribute. The input box and the label are connected by the id attribute.
Type
@@ -2298,8 +2561,8 @@ Returns type of AutoConnectElement.
Type
String
- Public member functions
- typeOf
+ Public member functions
+ typeOf
Returns type of AutoConnectElement.
@@ -2317,7 +2580,7 @@ Evaluate the pattern as a regexp and return whether value matches. Always return
false The value does not match a pattern.
AutoConnectRadio
- Constructor
+ Constructor
AutoConnectRadio( const char * name = "" , std :: vector < String > const & values = {}, const char * label = "" , const ACArrange_t order = AC_Vertical, const uint8_t checked = 0 )
@@ -2328,8 +2591,8 @@ Evaluate the pattern as a regexp and return whether value matches. Always return
order The direction to arrange the radio buttons.
checked An index to be checked in the radio buttons.
- Public member variables
- name
+ Public member variables
+ name
The element name.
Type
@@ -2341,7 +2604,7 @@ Evaluate the pattern as a regexp and return whether value matches. Always return
Type
std::vector<String>
- label
+ label
A label is an optional string. A label will be arranged in the left or top of the radio buttons according to the order .
Type
@@ -2364,8 +2627,8 @@ Evaluate the pattern as a regexp and return whether value matches. Always return
Type
uint8_t
- Public member functions
- typeOf
+ Public member functions
+ typeOf
Returns type of AutoConnectElement.
@@ -2378,7 +2641,7 @@ Returns type of AutoConnectElement.
Adds an option for the radio button.
- Parameters
+ Parameter
value An option string to add to the radio button.
check
@@ -2386,7 +2649,7 @@ Adds an option for the radio button.
Indicates the check of the specified option for the radio buttons. You can use the check function for checking dynamically with arbitrary of the radio button.
- Parameters
+ Parameter
value An option string to be checked.
empty
@@ -2394,7 +2657,7 @@ Indicates the check of the specified option for the radio buttons. You can use t
Clear the array of option strings that AutoConnectRadio has in the values. When a reserve parameter is specified, a vector container of that size is reserved.
- Parameters
+ Parameter
reserve Reserved size of a container for the radio button option strings.
operator [ ]
@@ -2402,12 +2665,12 @@ Clear the array of option strings that AutoConnectRadio has in the values. When
Returns a value string of the index specified by n .
- Parameters
+ Parameter
n Index of values array to return. Its base number is 0.
Return value
A reference of a value string indexed by the specified the n .
- size
+ size
Returns number of options which contained.
@@ -2415,7 +2678,7 @@ Returns number of options which contained.
Return value
Number of options which contained.
- value
+ value
const String & value( void ) const
Returns current checked option of the radio buttons.
@@ -2424,7 +2687,7 @@ Returns current checked option of the radio buttons.
A String of an option current checked. If there is no checked option, a null string returned.
AutoConnectSelect
- Constructor
+ Constructor
AutoConnectSelect( const char * name = "" , std :: vector < String > const & options = {}, const char * label = "" )
@@ -2433,8 +2696,8 @@ Returns current checked option of the radio buttons.
options An array of options of the select element. Specifies an std::vector object.
label Label string.
- Public member variables
- name
+ Public member variables
+ name
The element name.
Type
@@ -2446,14 +2709,14 @@ Returns current checked option of the radio buttons.
Type
std::vector<String>
- label
+ label
A label is an optional string. A label will be arranged in the top of the selection list.
Type
String
- Public member functions
- typeOf
+ Public member functions
+ typeOf
Returns type of AutoConnectElement.
@@ -2466,7 +2729,7 @@ Returns type of AutoConnectElement.
Adds a selectable option string for the selection list.
- Parameters
+ Parameter
option A string of selectable item to be contained in the select element.
empty
@@ -2474,7 +2737,7 @@ Adds a selectable option string for the selection list.
Clear the array of options list that AutoConnectSelect has in the options. When a reserve parameter is specified, a vector container of that size is reserved.
- Parameters
+ Parameter
reserve Reserved size of a container for the options.
operator [ ]
@@ -2482,13 +2745,13 @@ Clear the array of options list that AutoConnectSelect has in the options. When
Returns an option string of the index specified by n .
- Parameters
+ Parameter
n Index of options array to return. Its base number is 0.
Return value
A reference of a option string indexed by the specified the n .
- size
+ size
Returns number of options which contained.
@@ -2497,7 +2760,7 @@ Returns number of options which contained.
Number of options which contained.
AutoConnectSubmit
- Constructor
+ Constructor
AutoConnectSubmit( const char * name = "" , const char * value = "" , char * uri = "" )
@@ -2506,14 +2769,14 @@ Returns number of options which contained.
value The name of the submit button as an HTML < input type = "button" >
tag, it will also be the label of the button.
uri Destination URI.
- Public member variables
- name
+ Public member variables
+ name
The element name.
Type
String
- value
+ value
The name of the submit button. It will also be the label of the button.
Type
@@ -2525,8 +2788,8 @@ Returns number of options which contained.
Type
String
- Public member functions
- typeOf
+ Public member functions
+ typeOf
Returns type of AutoConnectElement.
@@ -2535,23 +2798,24 @@ Returns type of AutoConnectElement.
AC_Submit
AutoConnectText
- Constructor
-
AutoConnectText( const char * name = "" , const char * value = "" , const char * style = "" )
+ Constructor
+
AutoConnectText( const char * name = "" , const char * value = "" , const char * style = "" , const char * format = "" )
Parameters
name The element name.
value String of content for the text element.
style A style code with CSS format that qualifiers the text.
+ format A pointer to a null-terminated multibyte string specifying how to interpret the value. It specifies the conversion format when outputting values. The format string conforms to C-style printf library functions
-
Public member variables
-
name
+
Public member variables
+
name
The element name.
Type
String
-
value
+
value
A content string of the text element.
Type
@@ -2563,8 +2827,14 @@ Returns type of AutoConnectElement.
Type
String
-
Public member functions
-
typeOf
+
+
The conversion format when outputting values. The format string conforms to C-style printf library functions.
+
+ Type
+ String
+
+
Public member functions
+
typeOf
Returns type of AutoConnectElement.
@@ -2662,7 +2932,7 @@ Returns type of AutoConnectElement.
-
+
diff --git a/docs/apiextra.html b/docs/apiextra.html
index b1a7f20..50d6475 100644
--- a/docs/apiextra.html
+++ b/docs/apiextra.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
-
+
diff --git a/docs/assets/javascripts/application.b806dc00.js b/docs/assets/javascripts/application.dc02f8ce.js
similarity index 50%
rename from docs/assets/javascripts/application.b806dc00.js
rename to docs/assets/javascripts/application.dc02f8ce.js
index 3c6d6f6..4a86989 100644
--- a/docs/assets/javascripts/application.b806dc00.js
+++ b/docs/assets/javascripts/application.dc02f8ce.js
@@ -1,6 +1,6 @@
-!function(e,t){for(var n in t)e[n]=t[n]}(window,function(n){var r={};function i(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}return i.m=n,i.c=r,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)i.d(n,r,function(e){return t[e]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=14)}([function(e,t,n){"use strict";var r={Listener:function(){function e(e,t,n){var r=this;this.els_=Array.prototype.slice.call("string"==typeof e?document.querySelectorAll(e):[].concat(e)),this.handler_="function"==typeof n?{update:n}:n,this.events_=[].concat(t),this.update_=function(e){return r.handler_.update(e)}}var t=e.prototype;return t.listen=function(){var n=this;this.els_.forEach(function(t){n.events_.forEach(function(e){t.addEventListener(e,n.update_,!1)})}),"function"==typeof this.handler_.setup&&this.handler_.setup()},t.unlisten=function(){var n=this;this.els_.forEach(function(t){n.events_.forEach(function(e){t.removeEventListener(e,n.update_)})}),"function"==typeof this.handler_.reset&&this.handler_.reset()},e}(),MatchMedia:function(e,t){this.handler_=function(e){e.matches?t.listen():t.unlisten()};var n=window.matchMedia(e);n.addListener(this.handler_),this.handler_(n)}},i={Shadow:function(){function e(e,t){var n="string"==typeof e?document.querySelector(e):e;if(!(n instanceof HTMLElement&&n.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=n.parentNode,!((n="string"==typeof t?document.querySelector(t):t)instanceof HTMLElement))throw new ReferenceError;this.header_=n,this.height_=0,this.active_=!1}var t=e.prototype;return t.setup=function(){for(var e=this.el_;e=e.previousElementSibling;){if(!(e instanceof HTMLElement))throw new ReferenceError;this.height_+=e.offsetHeight}this.update()},t.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()},t.reset=function(){this.header_.dataset.mdState="",this.height_=0,this.active_=!1},e}(),Title:function(){function e(e,t){var n="string"==typeof e?document.querySelector(e):e;if(!(n instanceof HTMLElement))throw new ReferenceError;if(this.el_=n,!((n="string"==typeof t?document.querySelector(t):t)instanceof HTMLHeadingElement))throw new ReferenceError;this.header_=n,this.active_=!1}var t=e.prototype;return t.setup=function(){var t=this;Array.prototype.forEach.call(this.el_.children,function(e){e.style.width=t.el_.offsetWidth-20+"px"})},t.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"})},t.reset=function(){this.el_.dataset.mdState="",this.el_.style.width="",this.active_=!1},e}()},o={Blur:function(){function e(e){this.els_="string"==typeof e?document.querySelectorAll(e):e,this.index_=0,this.offset_=window.pageYOffset,this.dir_=!1,this.anchors_=[].reduce.call(this.els_,function(e,t){var n=decodeURIComponent(t.hash);return e.concat(document.getElementById(n.substring(1))||[])},[])}var t=e.prototype;return t.setup=function(){this.update()},t.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;ne)){this.index_=r;break}0=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")},t.reset=function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0},e}()},c=n(6),l=n.n(c);var u={Adapter:{GitHub:function(o){var e,t;function n(e){var t;t=o.call(this,e)||this;var n=/^.+github\.com\/([^/]+)\/?([^/]+)?.*$/.exec(t.base_);if(n&&3===n.length){var r=n[1],i=n[2];t.base_="https://api.github.com/users/"+r+"/repos",t.name_=i}return t}return t=o,(e=n).prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t,n.prototype.fetch_=function(){var i=this;return function n(r){return void 0===r&&(r=0),fetch(i.base_+"?per_page=30&page="+r).then(function(e){return e.json()}).then(function(e){if(!(e instanceof Array))throw new TypeError;if(i.name_){var t=e.find(function(e){return e.name===i.name_});return t||30!==e.length?t?[i.format_(t.stargazers_count)+" Stars",i.format_(t.forks_count)+" Forks"]:[]:n(r+1)}return[e.length+" Repositories"]})}()},n}(function(){function e(e){var t="string"==typeof e?document.querySelector(e):e;if(!(t instanceof HTMLAnchorElement))throw new ReferenceError;this.el_=t,this.base_=this.el_.href,this.salt_=this.hash_(this.base_)}var t=e.prototype;return t.fetch=function(){var n=this;return new Promise(function(t){var e=l.a.getJSON(n.salt_+".cache-source");void 0!==e?t(e):n.fetch_().then(function(e){l.a.set(n.salt_+".cache-source",e,{expires:1/96}),t(e)})})},t.fetch_=function(){throw new Error("fetch_(): Not implemented")},t.format_=function(e){return 1e4=this.el_.children[0].offsetTop+-43;e!==this.active_&&(this.el_.dataset.mdState=(this.active_=e)?"hidden":"")},t.reset=function(){this.el_.dataset.mdState="",this.active_=!1},e}()};t.a={Event:r,Header:i,Nav:o,Search:a,Sidebar:s,Source:u,Tabs:f}},function(t,e,n){(function(e){t.exports=e.lunr=n(25)}).call(this,n(4))},function(e,f,d){"use strict";(function(t){var e=d(8),n=setTimeout;function r(){}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=[],u(e,this)}function i(n,r){for(;3===n._state;)n=n._value;0!==n._state?(n._handled=!0,o._immediateFn(function(){var e=1===n._state?r.onFulfilled:r.onRejected;if(null!==e){var t;try{t=e(n._value)}catch(e){return void s(r.promise,e)}a(r.promise,t)}else(1===n._state?a:s)(r.promise,n._value)})):n._deferreds.push(r)}function a(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof o)return t._state=3,t._value=e,void c(t);if("function"==typeof n)return void u((r=n,i=e,function(){r.apply(i,arguments)}),t)}t._state=1,t._value=e,c(t)}catch(e){s(t,e)}var r,i}function s(e,t){e._state=2,e._value=t,c(e)}function c(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"+n+""};this.stack_=[],n.forEach(function(e,t){var n,r=a.docs_.get(t),i=u.createElement("li",{class:"md-search-result__item"},u.createElement("a",{href:r.location,title:r.title,class:"md-search-result__link",tabindex:"-1"},u.createElement("article",{class:"md-search-result__article md-search-result__article--document"},u.createElement("h1",{class:"md-search-result__title"},{__html:r.title.replace(s,c)}),r.text.length?u.createElement("p",{class:"md-search-result__teaser"},{__html:r.text.replace(s,c)}):{}))),o=e.map(function(t){return function(){var e=a.docs_.get(t.ref);i.appendChild(u.createElement("a",{href:e.location,title:e.title,class:"md-search-result__link","data-md-rel":"anchor",tabindex:"-1"},u.createElement("article",{class:"md-search-result__article"},u.createElement("h1",{class:"md-search-result__title"},{__html:e.title.replace(s,c)}),e.text.length?u.createElement("p",{class:"md-search-result__teaser"},{__html:function(e,t){var n=t;if(e.length>n){for(;" "!==e[n]&&0<--n;);return e.substring(0,n)+"..."}return e}(e.text.replace(s,c),400)}):{})))}});(n=a.stack_).push.apply(n,[function(){return a.list_.appendChild(i)}].concat(o))});var i=this.el_.parentNode;if(!(i instanceof HTMLElement))throw new ReferenceError;for(;this.stack_.length&&i.offsetHeight>=i.scrollHeight-16;)this.stack_.shift()();var o=this.list_.querySelectorAll("[data-md-rel=anchor]");switch(Array.prototype.forEach.call(o,function(r){["click","keydown"].forEach(function(n){r.addEventListener(n,function(e){if("keydown"!==n||13===e.keyCode){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.checked&&(t.checked=!1,t.dispatchEvent(new CustomEvent("change"))),e.preventDefault(),setTimeout(function(){document.location.href=r.href},100)}})})}),n.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("#",n.size)}}}else{var l=function(e){a.docs_=e.reduce(function(e,t){var n=t.location.split("#"),r=n[0],i=n[1];return t.title=h(t.title),t.text=h(t.text),i&&(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 i=a.docs_,o=a.lang_;a.stack_=[],a.index_=d()(function(){var e,t=this,n={"search.pipeline.trimmer":d.a.trimmer,"search.pipeline.stopwords":d.a.stopWordFilter},r=Object.keys(n).reduce(function(e,t){return p(t).match(/^false$/i)||e.push(n[t]),e},[]);this.pipeline.reset(),r&&(e=this.pipeline).add.apply(e,r),1===o.length&&"en"!==o[0]&&d.a[o[0]]?this.use(d.a[o[0]]):1=t.scrollHeight-16;)a.stack_.splice(0,10).forEach(function(e){return e()})})};setTimeout(function(){return"function"==typeof a.data_?a.data_().then(l):l(a.data_)},250)}},e}()}).call(this,i(3))},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,n,r){"use strict";(function(t){r.d(n,"a",function(){return e});var e=function(){function e(e){var t="string"==typeof e?document.querySelector(e):e;if(!(t instanceof HTMLElement))throw new ReferenceError;this.el_=t}return e.prototype.initialize=function(e){e.length&&this.el_.children.length&&this.el_.children[this.el_.children.length-1].appendChild(t.createElement("ul",{class:"md-source__facts"},e.map(function(e){return t.createElement("li",{class:"md-source__fact"},e)}))),this.el_.dataset.mdState="done"},e}()}).call(this,r(3))},,,function(e,n,c){"use strict";c.r(n),function(o){c.d(n,"app",function(){return t});c(15),c(16),c(17),c(18),c(19),c(20),c(21);var r=c(2),e=c(5),a=c.n(e),i=c(0);window.Promise=window.Promise||r.a;var s=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content};var t={initialize:function(t){new i.a.Event.Listener(document,"DOMContentLoaded",function(){if(!(document.body instanceof HTMLElement))throw new ReferenceError;Modernizr.addTest("ios",function(){return!!navigator.userAgent.match(/(iPad|iPhone|iPod)/g)});var e=document.querySelectorAll("table:not([class])");if(Array.prototype.forEach.call(e,function(e){var t=o.createElement("div",{class:"md-typeset__scrollwrap"},o.createElement("div",{class:"md-typeset__table"}));e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t.children[0].appendChild(e)}),a.a.isSupported()){var t=document.querySelectorAll(".codehilite > pre, pre > code");Array.prototype.forEach.call(t,function(e,t){var n="__code_"+t,r=o.createElement("button",{class:"md-clipboard",title:s("clipboard.copy"),"data-clipboard-target":"#"+n+" pre, #"+n+" code"},o.createElement("span",{class:"md-clipboard__message"})),i=e.parentNode;i.id=n,i.insertBefore(r,e)}),new a.a(".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=s("clipboard.copied"),t.dataset.mdTimer=setTimeout(function(){t.classList.remove("md-clipboard__message--active"),t.dataset.mdTimer=""},2e3).toString()})}if(!Modernizr.details){var n=document.querySelectorAll("details > summary");Array.prototype.forEach.call(n,function(e){e.addEventListener("click",function(e){var t=e.target.parentNode;t.hasAttribute("open")?t.removeAttribute("open"):t.setAttribute("open","")})})}var r=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",r),r(),Modernizr.ios){var i=document.querySelectorAll("[data-md-scrollfix]");Array.prototype.forEach.call(i,function(t){t.addEventListener("touchstart",function(){var e=t.scrollTop;0===e?t.scrollTop=1:e+t.offsetHeight===t.scrollHeight&&(t.scrollTop=e-1)})})}}).listen(),new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Header.Shadow("[data-md-component=container]","[data-md-component=header]")).listen(),new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Header.Title("[data-md-component=title]",".md-typeset h1")).listen(),document.querySelector("[data-md-component=hero]")&&new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Tabs.Toggle("[data-md-component=hero]")).listen(),document.querySelector("[data-md-component=tabs]")&&new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Tabs.Toggle("[data-md-component=tabs]")).listen(),new i.a.Event.MatchMedia("(min-width: 1220px)",new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Sidebar.Position("[data-md-component=navigation]","[data-md-component=header]"))),document.querySelector("[data-md-component=toc]")&&new i.a.Event.MatchMedia("(min-width: 960px)",new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Sidebar.Position("[data-md-component=toc]","[data-md-component=header]"))),new i.a.Event.MatchMedia("(min-width: 960px)",new i.a.Event.Listener(window,"scroll",new i.a.Nav.Blur("[data-md-component=toc] .md-nav__link")));var e=document.querySelectorAll("[data-md-component=collapsible]");Array.prototype.forEach.call(e,function(e){new i.a.Event.MatchMedia("(min-width: 1220px)",new i.a.Event.Listener(e.previousElementSibling,"click",new i.a.Nav.Collapse(e)))}),new i.a.Event.MatchMedia("(max-width: 1219px)",new i.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]","change",new i.a.Nav.Scrolling("[data-md-component=navigation] nav"))),document.querySelector("[data-md-component=search]")&&(new i.a.Event.MatchMedia("(max-width: 959px)",new i.a.Event.Listener("[data-md-toggle=search]","change",new i.a.Search.Lock("[data-md-toggle=search]"))),new i.a.Event.Listener("[data-md-component=query]",["focus","keyup","change"],new i.a.Search.Result("[data-md-component=result]",function(){return fetch(t.url.base+"/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 i.a.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 i.a.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 i.a.Event.MatchMedia("(min-width: 960px)",new i.a.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 i.a.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 i.a.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 i.a.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 i.a.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 i.a.Event.MatchMedia("(max-width: 959px)",new i.a.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 r.a.resolve([]);if(!(e instanceof HTMLAnchorElement))throw new ReferenceError;switch(e.dataset.mdSource){case"github":return new i.a.Source.Adapter.GitHub(e).fetch();default:return r.a.resolve([])}}().then(function(t){var e=document.querySelectorAll("[data-md-source]");Array.prototype.forEach.call(e,function(e){new i.a.Source.Repository(e).initialize(t)})});var n=function(){var e=document.querySelectorAll("details");Array.prototype.forEach.call(e,function(e){e.setAttribute("open","")})};new i.a.Event.MatchMedia("print",{listen:n,unlisten:function(){}}),window.onbeforeprint=n}}}.call(this,c(3))},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){e.exports="/home/travis/build/squidfunk/mkdocs-material/material/application.982221ab.css"},function(e,t){e.exports="/home/travis/build/squidfunk/mkdocs-material/material/application-palette.224b79ff.css"},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")).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(7).default||n(7))},function(e,i,o){(function(e){var t=void 0!==e&&e||"undefined"!=typeof self&&self||window,n=Function.prototype.apply;function r(e,t){this._id=e,this._clearFn=t}i.setTimeout=function(){return new r(n.call(setTimeout,t,arguments),clearTimeout)},i.setInterval=function(){return new r(n.call(setInterval,t,arguments),clearInterval)},i.clearTimeout=i.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(t,this._id)},i.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},i.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},i._unrefActive=i.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;0<=t&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},o(23),i.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,i.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,o(4))},function(e,t,n){(function(e,p){!function(n,r){"use strict";if(!n.setImmediate){var i,o,t,a,e,s=1,c={},l=!1,u=n.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(n);f=f&&f.setTimeout?f:n,i="[object process]"==={}.toString.call(n.process)?function(e){p.nextTick(function(){h(e)})}:function(){if(n.postMessage&&!n.importScripts){var e=!0,t=n.onmessage;return n.onmessage=function(){e=!1},n.postMessage("","*"),n.onmessage=t,e}}()?(a="setImmediate$"+Math.random()+"$",e=function(e){e.source===n&&"string"==typeof e.data&&0===e.data.indexOf(a)&&h(+e.data.slice(a.length))},n.addEventListener?n.addEventListener("message",e,!1):n.attachEvent("onmessage",e),function(e){n.postMessage(a+e,"*")}):n.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){h(e.data)},function(e){t.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,function(e){var t=u.createElement("script");t.onreadystatechange=function(){h(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):function(e){setTimeout(h,0,e)},f.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n=this.height_;t!==this.active_&&(this.header_.dataset.mdState=(this.active_=t)?"shadow":"")}else this.height_=0,this.setup()},t.reset=function(){this.header_.dataset.mdState="",this.height_=0,this.active_=!1},e}(),Title:function(){function e(e,t){var n="string"==typeof e?document.querySelector(e):e;if(!(n instanceof HTMLElement))throw new ReferenceError;if(this.el_=n,!((n="string"==typeof t?document.querySelector(t):t)instanceof HTMLHeadingElement))throw new ReferenceError;this.header_=n,this.active_=!1}var t=e.prototype;return t.setup=function(){var t=this;Array.prototype.forEach.call(this.el_.children,function(e){e.style.width=t.el_.offsetWidth-20+"px"})},t.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"})},t.reset=function(){this.el_.dataset.mdState="",this.el_.style.width="",this.active_=!1},e}()},o={Blur:function(){function e(e){this.els_="string"==typeof e?document.querySelectorAll(e):e,this.index_=0,this.offset_=window.pageYOffset,this.dir_=!1,this.anchors_=[].reduce.call(this.els_,function(e,t){var n=decodeURIComponent(t.hash);return e.concat(document.getElementById(n.substring(1))||[])},[])}var t=e.prototype;return t.setup=function(){this.update()},t.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;ne)){this.index_=r;break}0=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")},t.reset=function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0},e}()},c=n(6),l=n.n(c);var u={Adapter:{GitHub:function(o){var e,t;function n(e){var t;t=o.call(this,e)||this;var n=/^.+github\.com\/([^/]+)\/?([^/]+)?.*$/.exec(t.base_);if(n&&3===n.length){var r=n[1],i=n[2];t.base_="https://api.github.com/users/"+r+"/repos",t.name_=i}return t}return t=o,(e=n).prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t,n.prototype.fetch_=function(){var i=this;return function n(r){return void 0===r&&(r=0),fetch(i.base_+"?per_page=30&page="+r).then(function(e){return e.json()}).then(function(e){if(!(e instanceof Array))throw new TypeError;if(i.name_){var t=e.find(function(e){return e.name===i.name_});return t||30!==e.length?t?[i.format_(t.stargazers_count)+" Stars",i.format_(t.forks_count)+" Forks"]:[]:n(r+1)}return[e.length+" Repositories"]})}()},n}(function(){function e(e){var t="string"==typeof e?document.querySelector(e):e;if(!(t instanceof HTMLAnchorElement))throw new ReferenceError;this.el_=t,this.base_=this.el_.href,this.salt_=this.hash_(this.base_)}var t=e.prototype;return t.fetch=function(){var n=this;return new Promise(function(t){var e=l.a.getJSON(n.salt_+".cache-source");void 0!==e?t(e):n.fetch_().then(function(e){l.a.set(n.salt_+".cache-source",e,{expires:1/96}),t(e)})})},t.fetch_=function(){throw new Error("fetch_(): Not implemented")},t.format_=function(e){return 1e4=this.el_.children[0].offsetTop+-43;e!==this.active_&&(this.el_.dataset.mdState=(this.active_=e)?"hidden":"")},t.reset=function(){this.el_.dataset.mdState="",this.active_=!1},e}()};t.a={Event:r,Header:i,Nav:o,Search:a,Sidebar:s,Source:u,Tabs:f}},function(t,e,n){(function(e){t.exports=e.lunr=n(25)}).call(this,n(4))},function(e,f,d){"use strict";(function(t){var e=d(8),n=setTimeout;function r(){}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=[],u(e,this)}function i(n,r){for(;3===n._state;)n=n._value;0!==n._state?(n._handled=!0,o._immediateFn(function(){var e=1===n._state?r.onFulfilled:r.onRejected;if(null!==e){var t;try{t=e(n._value)}catch(e){return void s(r.promise,e)}a(r.promise,t)}else(1===n._state?a:s)(r.promise,n._value)})):n._deferreds.push(r)}function a(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof o)return t._state=3,t._value=e,void c(t);if("function"==typeof n)return void u((r=n,i=e,function(){r.apply(i,arguments)}),t)}t._state=1,t._value=e,c(t)}catch(e){s(t,e)}var r,i}function s(e,t){e._state=2,e._value=t,c(e)}function c(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"+n+""};this.stack_=[],n.forEach(function(e,t){var n,r=a.docs_.get(t),i=u.createElement("li",{class:"md-search-result__item"},u.createElement("a",{href:r.location,title:r.title,class:"md-search-result__link",tabindex:"-1"},u.createElement("article",{class:"md-search-result__article md-search-result__article--document"},u.createElement("h1",{class:"md-search-result__title"},{__html:r.title.replace(s,c)}),r.text.length?u.createElement("p",{class:"md-search-result__teaser"},{__html:r.text.replace(s,c)}):{}))),o=e.map(function(t){return function(){var e=a.docs_.get(t.ref);i.appendChild(u.createElement("a",{href:e.location,title:e.title,class:"md-search-result__link","data-md-rel":"anchor",tabindex:"-1"},u.createElement("article",{class:"md-search-result__article"},u.createElement("h1",{class:"md-search-result__title"},{__html:e.title.replace(s,c)}),e.text.length?u.createElement("p",{class:"md-search-result__teaser"},{__html:function(e,t){var n=t;if(e.length>n){for(;" "!==e[n]&&0<--n;);return e.substring(0,n)+"..."}return e}(e.text.replace(s,c),400)}):{})))}});(n=a.stack_).push.apply(n,[function(){return a.list_.appendChild(i)}].concat(o))});var i=this.el_.parentNode;if(!(i instanceof HTMLElement))throw new ReferenceError;for(;this.stack_.length&&i.offsetHeight>=i.scrollHeight-16;)this.stack_.shift()();var o=this.list_.querySelectorAll("[data-md-rel=anchor]");switch(Array.prototype.forEach.call(o,function(r){["click","keydown"].forEach(function(n){r.addEventListener(n,function(e){if("keydown"!==n||13===e.keyCode){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.checked&&(t.checked=!1,t.dispatchEvent(new CustomEvent("change"))),e.preventDefault(),setTimeout(function(){document.location.href=r.href},100)}})})}),n.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("#",n.size)}}}else{var l=function(e){a.docs_=e.reduce(function(e,t){var n,r,i,o=t.location.split("#"),a=o[0],s=o[1];return t.text=(n=t.text,r=document.createTextNode(n),(i=document.createElement("p")).appendChild(r),i.innerHTML),s&&(t.parent=e.get(a),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 i=a.docs_,o=a.lang_;a.stack_=[],a.index_=d()(function(){var e,t=this,n={"search.pipeline.trimmer":d.a.trimmer,"search.pipeline.stopwords":d.a.stopWordFilter},r=Object.keys(n).reduce(function(e,t){return h(t).match(/^false$/i)||e.push(n[t]),e},[]);this.pipeline.reset(),r&&(e=this.pipeline).add.apply(e,r),1===o.length&&"en"!==o[0]&&d.a[o[0]]?this.use(d.a[o[0]]):1=t.scrollHeight-16;)a.stack_.splice(0,10).forEach(function(e){return e()})})};setTimeout(function(){return"function"==typeof a.data_?a.data_().then(l):l(a.data_)},250)}},e}()}).call(this,i(3))},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,n,r){"use strict";(function(t){r.d(n,"a",function(){return e});var e=function(){function e(e){var t="string"==typeof e?document.querySelector(e):e;if(!(t instanceof HTMLElement))throw new ReferenceError;this.el_=t}return e.prototype.initialize=function(e){e.length&&this.el_.children.length&&this.el_.children[this.el_.children.length-1].appendChild(t.createElement("ul",{class:"md-source__facts"},e.map(function(e){return t.createElement("li",{class:"md-source__fact"},e)}))),this.el_.dataset.mdState="done"},e}()}).call(this,r(3))},,,function(e,n,c){"use strict";c.r(n),function(o){c.d(n,"app",function(){return t});c(15),c(16),c(17),c(18),c(19),c(20),c(21);var r=c(2),e=c(5),a=c.n(e),i=c(0);window.Promise=window.Promise||r.a;var s=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content};var t={initialize:function(t){new i.a.Event.Listener(document,"DOMContentLoaded",function(){if(!(document.body instanceof HTMLElement))throw new ReferenceError;Modernizr.addTest("ios",function(){return!!navigator.userAgent.match(/(iPad|iPhone|iPod)/g)});var e=document.querySelectorAll("table:not([class])");if(Array.prototype.forEach.call(e,function(e){var t=o.createElement("div",{class:"md-typeset__scrollwrap"},o.createElement("div",{class:"md-typeset__table"}));e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t.children[0].appendChild(e)}),a.a.isSupported()){var t=document.querySelectorAll(".codehilite > pre, pre > code");Array.prototype.forEach.call(t,function(e,t){var n="__code_"+t,r=o.createElement("button",{class:"md-clipboard",title:s("clipboard.copy"),"data-clipboard-target":"#"+n+" pre, #"+n+" code"},o.createElement("span",{class:"md-clipboard__message"})),i=e.parentNode;i.id=n,i.insertBefore(r,e)}),new a.a(".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=s("clipboard.copied"),t.dataset.mdTimer=setTimeout(function(){t.classList.remove("md-clipboard__message--active"),t.dataset.mdTimer=""},2e3).toString()})}if(!Modernizr.details){var n=document.querySelectorAll("details > summary");Array.prototype.forEach.call(n,function(e){e.addEventListener("click",function(e){var t=e.target.parentNode;t.hasAttribute("open")?t.removeAttribute("open"):t.setAttribute("open","")})})}var r=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",r),r(),Modernizr.ios){var i=document.querySelectorAll("[data-md-scrollfix]");Array.prototype.forEach.call(i,function(t){t.addEventListener("touchstart",function(){var e=t.scrollTop;0===e?t.scrollTop=1:e+t.offsetHeight===t.scrollHeight&&(t.scrollTop=e-1)})})}}).listen(),new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Header.Shadow("[data-md-component=container]","[data-md-component=header]")).listen(),new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Header.Title("[data-md-component=title]",".md-typeset h1")).listen(),document.querySelector("[data-md-component=hero]")&&new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Tabs.Toggle("[data-md-component=hero]")).listen(),document.querySelector("[data-md-component=tabs]")&&new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Tabs.Toggle("[data-md-component=tabs]")).listen(),new i.a.Event.MatchMedia("(min-width: 1220px)",new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Sidebar.Position("[data-md-component=navigation]","[data-md-component=header]"))),document.querySelector("[data-md-component=toc]")&&new i.a.Event.MatchMedia("(min-width: 960px)",new i.a.Event.Listener(window,["scroll","resize","orientationchange"],new i.a.Sidebar.Position("[data-md-component=toc]","[data-md-component=header]"))),new i.a.Event.MatchMedia("(min-width: 960px)",new i.a.Event.Listener(window,"scroll",new i.a.Nav.Blur("[data-md-component=toc] .md-nav__link")));var e=document.querySelectorAll("[data-md-component=collapsible]");Array.prototype.forEach.call(e,function(e){new i.a.Event.MatchMedia("(min-width: 1220px)",new i.a.Event.Listener(e.previousElementSibling,"click",new i.a.Nav.Collapse(e)))}),new i.a.Event.MatchMedia("(max-width: 1219px)",new i.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]","change",new i.a.Nav.Scrolling("[data-md-component=navigation] nav"))),document.querySelector("[data-md-component=search]")&&(new i.a.Event.MatchMedia("(max-width: 959px)",new i.a.Event.Listener("[data-md-toggle=search]","change",new i.a.Search.Lock("[data-md-toggle=search]"))),new i.a.Event.Listener("[data-md-component=query]",["focus","keyup","change"],new i.a.Search.Result("[data-md-component=result]",function(){return fetch(t.url.base+"/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 i.a.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 i.a.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 i.a.Event.MatchMedia("(min-width: 960px)",new i.a.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 i.a.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(!(document.activeElement instanceof HTMLElement&&"true"===document.activeElement.contentEditable||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 i.a.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 i.a.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 i.a.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 i.a.Event.MatchMedia("(max-width: 959px)",new i.a.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 r.a.resolve([]);if(!(e instanceof HTMLAnchorElement))throw new ReferenceError;switch(e.dataset.mdSource){case"github":return new i.a.Source.Adapter.GitHub(e).fetch();default:return r.a.resolve([])}}().then(function(t){var e=document.querySelectorAll("[data-md-source]");Array.prototype.forEach.call(e,function(e){new i.a.Source.Repository(e).initialize(t)})});var n=function(){var e=document.querySelectorAll("details");Array.prototype.forEach.call(e,function(e){e.setAttribute("open","")})};new i.a.Event.MatchMedia("print",{listen:n,unlisten:function(){}}),window.onbeforeprint=n}}}.call(this,c(3))},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){e.exports="/home/travis/build/squidfunk/mkdocs-material/material/application.3020aac5.css"},function(e,t){e.exports="/home/travis/build/squidfunk/mkdocs-material/material/application-palette.224b79ff.css"},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")).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(7).default||n(7))},function(e,i,o){(function(e){var t=void 0!==e&&e||"undefined"!=typeof self&&self||window,n=Function.prototype.apply;function r(e,t){this._id=e,this._clearFn=t}i.setTimeout=function(){return new r(n.call(setTimeout,t,arguments),clearTimeout)},i.setInterval=function(){return new r(n.call(setInterval,t,arguments),clearInterval)},i.clearTimeout=i.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(t,this._id)},i.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},i.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},i._unrefActive=i.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;0<=t&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},o(23),i.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,i.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,o(4))},function(e,t,n){(function(e,p){!function(n,r){"use strict";if(!n.setImmediate){var i,o,t,a,e,s=1,c={},l=!1,u=n.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(n);f=f&&f.setTimeout?f:n,i="[object process]"==={}.toString.call(n.process)?function(e){p.nextTick(function(){h(e)})}:function(){if(n.postMessage&&!n.importScripts){var e=!0,t=n.onmessage;return n.onmessage=function(){e=!1},n.postMessage("","*"),n.onmessage=t,e}}()?(a="setImmediate$"+Math.random()+"$",e=function(e){e.source===n&&"string"==typeof e.data&&0===e.data.indexOf(a)&&h(+e.data.slice(a.length))},n.addEventListener?n.addEventListener("message",e,!1):n.attachEvent("onmessage",e),function(e){n.postMessage(a+e,"*")}):n.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){h(e.data)},function(e){t.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,function(e){var t=u.createElement("script");t.onreadystatechange=function(){h(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):function(e){setTimeout(h,0,e)},f.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n=this.length)return D.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},D.QueryLexer.prototype.width=function(){return this.pos-this.start},D.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},D.QueryLexer.prototype.backup=function(){this.pos-=1},D.QueryLexer.prototype.acceptDigitRun=function(){for(var e,t;47<(t=(e=this.next()).charCodeAt(0))&&t<58;);e!=D.QueryLexer.EOS&&this.backup()},D.QueryLexer.prototype.more=function(){return this.pos=this.length)return D.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},D.QueryLexer.prototype.width=function(){return this.pos-this.start},D.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},D.QueryLexer.prototype.backup=function(){this.pos-=1},D.QueryLexer.prototype.acceptDigitRun=function(){for(var e,t;47<(t=(e=this.next()).charCodeAt(0))&&t<58;);e!=D.QueryLexer.EOS&&this.backup()},D.QueryLexer.prototype.more=function(){return this.pos=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return e<=_.cursor}function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),u=!0,g())))}function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),g())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(o,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(s(e))break}else if(s(e))break}(),_.cursor=r,i=_.limit,e=i,w()||((i=_.cursor)<3&&(i=3),w()||(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var r,e,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(n,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}),r.Pipeline.registerFunction(r.du.stemmer,"stemmer-du"),r.du.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.du.stopWordFilter,"stopWordFilter-du")}});
\ No newline at end of file
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,q,r;console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=(v=e.stemmerSupport.Among,q=e.stemmerSupport.SnowballProgram,r=new function(){var r,i,u,o=[new v("",-1,6),new v("á",0,1),new v("ä",0,1),new v("é",0,2),new v("ë",0,2),new v("í",0,3),new v("ï",0,3),new v("ó",0,4),new v("ö",0,4),new v("ú",0,5),new v("ü",0,5)],n=[new v("",-1,3),new v("I",0,2),new v("Y",0,1)],t=[new v("dd",-1,-1),new v("kk",-1,-1),new v("tt",-1,-1)],c=[new v("ene",-1,2),new v("se",-1,3),new v("en",-1,2),new v("heden",2,1),new v("s",-1,3)],a=[new v("end",-1,1),new v("ig",-1,2),new v("ing",-1,1),new v("lijk",-1,3),new v("baar",-1,4),new v("bar",-1,5)],l=[new v("aa",-1,-1),new v("ee",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],d=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],_=new q;function s(e){return(_.cursor=e)>=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return r<=_.cursor}function g(){var e=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-e,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var e;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.slice_del(),u=!0,g())))}function k(){var e;b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.eq_s_b(3,"gem")||(_.cursor=_.limit-e,_.slice_del(),g())))}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var e=_.cursor;return function(){for(var e,r,i,n=_.cursor;;){if(_.bra=_.cursor,e=_.find_among(o,11))switch(_.ket=_.cursor,e){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(r=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=r);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=r;else if(s(r))break}else if(s(r))break}(),_.cursor=e,i=_.limit,r=i,w()||((i=_.cursor)<3&&(i=3),w()||(r=_.cursor)),_.limit_backward=e,_.cursor=_.limit,function(){var e,r,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,e=_.find_among_b(c,5))switch(_.bra=_.cursor,e){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(r=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-r,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,e=_.find_among_b(a,6))switch(_.bra=_.cursor,e){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var e;;)if(_.bra=_.cursor,e=_.find_among(n,3))switch(_.ket=_.cursor,e){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}});
\ No newline at end of file
diff --git a/docs/assets/javascripts/lunr/lunr.ja.js b/docs/assets/javascripts/lunr/lunr.ja.js
new file mode 100644
index 0000000..69f6202
--- /dev/null
+++ b/docs/assets/javascripts/lunr/lunr.ja.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(m){if(void 0===m)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===m.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var l="2"==m.version[0];m.ja=function(){this.pipeline.reset(),this.pipeline.add(m.ja.trimmer,m.ja.stopWordFilter,m.ja.stemmer),l?this.tokenizer=m.ja.tokenizer:(m.tokenizer&&(m.tokenizer=m.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=m.ja.tokenizer))};var j=new m.TinySegmenter;m.ja.tokenizer=function(e){var r,t,i,n,o,s,p,a,u;if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return l?new m.Token(e.toLowerCase()):e.toLowerCase()});for(r=(t=e.toString().toLowerCase().replace(/^\s+/,"")).length-1;0<=r;r--)if(/\S/.test(t.charAt(r))){t=t.substring(0,r+1);break}for(o=[],i=t.length,p=a=0;a<=i;a++)if(s=a-p,t.charAt(a).match(/\s/)||a==i){if(0=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return e<=_.cursor}function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),u=!0,g())))}function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),g())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(o,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(s(e))break}else if(s(e))break}(),_.cursor=r,i=_.limit,e=i,w()||((i=_.cursor)<3&&(i=3),w()||(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var r,e,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(n,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}});
\ No newline at end of file
diff --git a/docs/assets/javascripts/lunr/lunr.th.js b/docs/assets/javascripts/lunr/lunr.th.js
new file mode 100644
index 0000000..ee8ef37
--- /dev/null
+++ b/docs/assets/javascripts/lunr/lunr.th.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(t){if(void 0===t)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===t.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==t.version[0];t.th=function(){this.pipeline.reset(),this.pipeline.add(t.th.trimmer),i?this.tokenizer=t.th.tokenizer:(t.tokenizer&&(t.tokenizer=t.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=t.th.tokenizer))},t.th.wordCharacters="[-]",t.th.trimmer=t.trimmerSupport.generateTrimmer(t.th.wordCharacters),t.Pipeline.registerFunction(t.th.trimmer,"trimmer-th");var n=t.wordcut;n.init(),t.th.tokenizer=function(e){if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return i?new t.Token(e):e});var r=e.toString().replace(/^\s+/,"");return n.cut(r).split("|")}}});
\ No newline at end of file
diff --git a/docs/assets/javascripts/lunr/wordcut.js b/docs/assets/javascripts/lunr/wordcut.js
new file mode 100644
index 0000000..179792a
--- /dev/null
+++ b/docs/assets/javascripts/lunr/wordcut.js
@@ -0,0 +1 @@
+!function(n){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=n();else if("function"==typeof define&&define.amd)define([],n);else{var t;((t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).lunr||(t.lunr={})).wordcut=n()}}(function(){return function o(s,a,c){function u(e,n){if(!a[e]){if(!s[e]){var t="function"==typeof require&&require;if(!n&&t)return t(e,!0);if(l)return l(e,!0);var r=new Error("Cannot find module '"+e+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[e]={exports:{}};s[e][0].call(i.exports,function(n){var t=s[e][1][n];return u(t||n)},i,i.exports,o,s,a,c)}return a[e].exports}for(var l="function"==typeof require&&require,n=0;ne&&(this._events[n].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[n].length),"function"==typeof console.trace&&console.trace()));return this},r.prototype.once=function(n,t){if(!a(t))throw TypeError("listener must be a function");var e=!1;function r(){this.removeListener(n,r),e||(e=!0,t.apply(this,arguments))}return r.listener=t,this.on(n,r),this},r.prototype.removeListener=function(n,t){var e,r,i,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[n])return this;if(i=(e=this._events[n]).length,r=-1,e===t||a(e.listener)&&e.listener===t)delete this._events[n],this._events.removeListener&&this.emit("removeListener",n,t);else if(c(e)){for(o=i;0this.maxLength)return i();if(!this.stat&&p(this.cache,o)){var t=this.cache[o];if(Array.isArray(t)&&(t="DIR"),!n||"DIR"===t)return i(null,t);if(n&&"FILE"===t)return i()}var e=this.statCache[o];if(void 0!==e){if(!1===e)return i(null,e);var s=e.isDirectory()?"DIR":"FILE";return n&&"FILE"===s?i():i(null,s,e)}var a=this,c=d("stat\0"+o,function(n,e){{if(e&&e.isSymbolicLink())return u.stat(o,function(n,t){n?a._stat2(r,o,null,e,i):a._stat2(r,o,n,t,i)});a._stat2(r,o,n,e,i)}});c&&u.lstat(o,c)},b.prototype._stat2=function(n,t,e,r,i){if(e)return this.statCache[t]=!1,i();var o="/"===n.slice(-1);if(this.statCache[t]=r,"/"===t.slice(-1)&&!r.isDirectory())return i(null,!1,r);var s=r.isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||s,o&&"DIR"!==s?i():i(null,s,r)}}).call(this,_("_process"))},{"./common.js":15,"./sync.js":17,_process:24,assert:9,events:14,fs:12,inflight:18,inherits:19,minimatch:20,once:21,path:22,"path-is-absolute":23,util:28}],17:[function(e,r,n){(function(i){(r.exports=n).GlobSync=h;var s=e("fs"),c=e("minimatch"),g=(c.Minimatch,e("./glob.js").Glob,e("util"),e("path")),u=e("assert"),l=e("path-is-absolute"),t=e("./common.js"),o=(t.alphasort,t.alphasorti,t.setopts),a=t.ownProp,f=t.childrenIgnored;function n(n,t){if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new h(n,t).found}function h(n,t){if(!n)throw new Error("must provide pattern");if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if(!(this instanceof h))return new h(n,t);if(o(this,n,t),this.noprocess)return this;var e=this.minimatch.set.length;this.matches=new Array(e);for(var r=0;rthis.maxLength)return!1;if(!this.stat&&a(this.cache,t)){var r=this.cache[t];if(Array.isArray(r)&&(r="DIR"),!e||"DIR"===r)return r;if(e&&"FILE"===r)return!1}var i=this.statCache[t];if(!i){var o;try{o=s.lstatSync(t)}catch(n){return!1}if(o.isSymbolicLink())try{i=s.statSync(t)}catch(n){i=o}else i=o}r=(this.statCache[t]=i).isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||r,(!e||"DIR"===r)&&r},h.prototype._mark=function(n){return t.mark(this,n)},h.prototype._makeAbs=function(n){return t.makeAbs(this,n)}}).call(this,e("_process"))},{"./common.js":15,"./glob.js":16,_process:24,assert:9,fs:12,minimatch:20,path:22,"path-is-absolute":23,util:28}],18:[function(t,r,n){(function(s){var n=t("wrappy"),a=Object.create(null),e=t("once");r.exports=n(function(n,t){return a[n]?(a[n].push(t),null):(a[n]=[t],o=n,e(function n(){var t=a[o],e=t.length,r=function(n){for(var t=n.length,e=[],r=0;re?(t.splice(0,e),s.nextTick(function(){n.apply(null,r)})):delete a[o]}}));var o})}).call(this,t("_process"))},{_process:24,once:21,wrappy:29}],19:[function(n,t,e){"function"==typeof Object.create?t.exports=function(n,t){n.super_=t,n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(n,t){n.super_=t;var e=function(){};e.prototype=t.prototype,n.prototype=new e,n.prototype.constructor=n}},{}],20:[function(n,t,e){(t.exports=s).Minimatch=i;var u={sep:"/"};try{u=n("path")}catch(n){}var M=s.GLOBSTAR=i.GLOBSTAR={},r=n("brace-expansion"),C={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},P="[^/]",z=P+"*?",B="().*{}+?[]^$\\!".split("").reduce(function(n,t){return n[t]=!0,n},{});var l=/\/+/;function o(t,e){t=t||{},e=e||{};var r={};return Object.keys(e).forEach(function(n){r[n]=e[n]}),Object.keys(t).forEach(function(n){r[n]=t[n]}),r}function s(n,t,e){if("string"!=typeof t)throw new TypeError("glob pattern string required");return e||(e={}),!(!e.nocomment&&"#"===t.charAt(0))&&(""===t.trim()?""===n:new i(t,e).match(n))}function i(n,t){if(!(this instanceof i))return new i(n,t);if("string"!=typeof n)throw new TypeError("glob pattern string required");t||(t={}),n=n.trim(),"/"!==u.sep&&(n=n.split(u.sep).join("/")),this.options=t,this.set=[],this.pattern=n,this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.make()}function a(n,t){if(t||(t=this instanceof i?this.options:{}),void 0===(n=void 0===n?this.pattern:n))throw new TypeError("undefined pattern");return t.nobrace||!n.match(/\{.*\}/)?[n]:r(n)}s.filter=function(r,i){return i=i||{},function(n,t,e){return s(n,r,i)}},s.defaults=function(r){if(!r||!Object.keys(r).length)return s;var i=s,n=function(n,t,e){return i.minimatch(n,t,o(r,e))};return n.Minimatch=function(n,t){return new i.Minimatch(n,o(r,t))},n},i.defaults=function(n){return n&&Object.keys(n).length?s.defaults(n).Minimatch:i},i.prototype.debug=function(){},i.prototype.make=function(){if(this._made)return;var n=this.pattern,t=this.options;if(!t.nocomment&&"#"===n.charAt(0))return void(this.comment=!0);if(!n)return void(this.empty=!0);this.parseNegate();var e=this.globSet=this.braceExpand();t.debug&&(this.debug=console.error);this.debug(this.pattern,e),e=this.globParts=e.map(function(n){return n.split(l)}),this.debug(this.pattern,e),e=e.map(function(n,t,e){return n.map(this.parse,this)},this),this.debug(this.pattern,e),e=e.filter(function(n){return-1===n.indexOf(!1)}),this.debug(this.pattern,e),this.set=e},i.prototype.parseNegate=function(){var n=this.pattern,t=!1,e=this.options,r=0;if(e.nonegate)return;for(var i=0,o=n.length;i>> no match, partial?",n,f,t,h),f!==s))}if("string"==typeof u?(c=r.nocase?l.toLowerCase()===u.toLowerCase():l===u,this.debug("string match",u,l,c)):(c=l.match(u),this.debug("pattern match",u,l,c)),!c)return!1}if(i===s&&o===a)return!0;if(i===s)return e;if(o===a)return i===s-1&&""===n[i];throw new Error("wtf?")}},{"brace-expansion":11,path:22}],21:[function(n,t,e){var r=n("wrappy");function i(n){var t=function(){return t.called?t.value:(t.called=!0,t.value=n.apply(this,arguments))};return t.called=!1,t}function o(n){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=n.apply(this,arguments)},e=n.name||"Function wrapped with `once`";return t.onceError=e+" shouldn't be called more than once",t.called=!1,t}t.exports=r(i),t.exports.strict=r(o),i.proto=i(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return i(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return o(this)},configurable:!0})})},{wrappy:29}],22:[function(n,t,u){(function(i){function o(n,t){for(var e=0,r=n.length-1;0<=r;r--){var i=n[r];"."===i?n.splice(r,1):".."===i?(n.splice(r,1),e++):e&&(n.splice(r,1),e--)}if(t)for(;e--;e)n.unshift("..");return n}var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,s=function(n){return t.exec(n).slice(1)};function a(n,t){if(n.filter)return n.filter(t);for(var e=[],r=0;r":">",'"':""","'":"'","`":"`"},D=d.invert(N),F=function(t){var e=function(n){return t[n]},n="(?:"+d.keys(t).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(n){return n=null==n?"":""+n,r.test(n)?n.replace(i,e):n}};d.escape=F(N),d.unescape=F(D),d.result=function(n,t,e){var r=null==n?void 0:n[t];return void 0===r&&(r=e),d.isFunction(r)?r.call(n):r};var M=0;d.uniqueId=function(n){var t=++M+"";return n?n+t:t},d.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var C=/(.)^/,P={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\u2028|\u2029/g,B=function(n){return"\\"+P[n]};d.template=function(o,n,t){!n&&t&&(n=t),n=d.defaults({},n,d.templateSettings);var e=RegExp([(n.escape||C).source,(n.interpolate||C).source,(n.evaluate||C).source].join("|")+"|$","g"),s=0,a="__p+='";o.replace(e,function(n,t,e,r,i){return a+=o.slice(s,i).replace(z,B),s=i+n.length,t?a+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?a+="'+\n((__t=("+e+"))==null?'':__t)+\n'":r&&(a+="';\n"+r+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{var r=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var i=function(n){return r.call(this,n,d)},c=n.variable||"obj";return i.source="function("+c+"){\n"+a+"}",i},d.chain=function(n){var t=d(n);return t._chain=!0,t};var U=function(n,t){return n._chain?d(t).chain():t};d.mixin=function(e){d.each(d.functions(e),function(n){var t=d[n]=e[n];d.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),U(this,t.apply(d,n))}})},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],function(t){var e=r[t];d.prototype[t]=function(){var n=this._wrapped;return e.apply(n,arguments),"shift"!==t&&"splice"!==t||0!==n.length||delete n[0],U(this,n)}}),d.each(["concat","join","slice"],function(n){var t=r[n];d.prototype[n]=function(){return U(this,t.apply(this._wrapped,arguments))}}),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],26:[function(n,t,e){arguments[4][19][0].apply(e,arguments)},{dup:19}],27:[function(n,t,e){t.exports=function(n){return n&&"object"==typeof n&&"function"==typeof n.copy&&"function"==typeof n.fill&&"function"==typeof n.readUInt8}},{}],28:[function(h,n,k){(function(r,i){var a=/%[sdj%]/g;k.format=function(n){if(!_(n)){for(var t=[],e=0;eab",t=n.offsetHeight,n.open=!0,t=t!==n.offsetHeight}),t)}),c.addTest("fetch","fetch"in i);var _="Moz O ms Webkit",w=t._config.usePrefixes?_.split(" "):[];t._cssomPrefixes=w;var x={elem:m("modernizr")};c._q.push(function(){delete x.elem});var T={style:x.elem.style};c._q.unshift(function(){delete T.style});var P=t._config.usePrefixes?_.toLowerCase().split(" "):[];t._domPrefixes=P,t.testAllProps=r,t.testAllProps=e;var j="CSS"in i&&"supports"in i.CSS,O="supportsCSS"in i;c.addTest("supports",j||O),c.addTest("csstransforms3d",function(){return!!e("perspective","1px",!0)}),function(){var e,t,n,r,o,i;for(var s in f)if(f.hasOwnProperty(s)){if(e=[],(t=f[s]).name&&(e.push(t.name.toLowerCase()),t.options&&t.options.aliases&&t.options.aliases.length))for(n=0;nab",t=n.offsetHeight,n.open=!0,t=t!=n.offsetHeight}),t)}),c.addTest("fetch","fetch"in i);var _="Moz O ms Webkit",w=t._config.usePrefixes?_.split(" "):[];t._cssomPrefixes=w;var x={elem:m("modernizr")};c._q.push(function(){delete x.elem});var T={style:x.elem.style};c._q.unshift(function(){delete T.style});var P=t._config.usePrefixes?_.toLowerCase().split(" "):[];t._domPrefixes=P,t.testAllProps=r,t.testAllProps=e;var j="CSS"in i&&"supports"in i.CSS,O="supportsCSS"in i;c.addTest("supports",j||O),c.addTest("csstransforms3d",function(){return!!e("perspective","1px",!0)}),function(){var e,t,n,r,o,i;for(var s in f)if(f.hasOwnProperty(s)){if(e=[],(t=f[s]).name&&(e.push(t.name.toLowerCase()),t.options&&t.options.aliases&&t.options.aliases.length))for(n=0;n.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before,.md-typeset summary:after{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__icon,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before,.md-search-result__article--document:before{display:inline-block;margin:.2rem;padding:.4rem;font-size:1.2rem;cursor:pointer}.md-icon--arrow-back:before{content:""}.md-icon--arrow-forward:before{content:""}.md-icon--menu:before{content:""}.md-icon--search:before{content:""}[dir=rtl] .md-icon--arrow-back:before{content:""}[dir=rtl] .md-icon--arrow-forward:before{content:""}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";font-family:Helvetica Neue,Helvetica,Arial,sans-serif}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern";font-feature-settings:"kern";font-family:Courier New,Courier,monospace}.md-typeset{font-size:.8rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 2rem;color:rgba(0,0,0,.54);font-size:1.5625rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:2rem 0 .8rem;font-size:1.25rem;line-height:1.4}.md-typeset h3{margin:1.6rem 0 .8rem;font-size:1rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:.8rem}.md-typeset h4{font-size:.8rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:.8rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:.64rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.05rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,92.5%,.5);color:#37474f;font-size:85%;direction:ltr}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.1rem;box-shadow:.29412em 0 0 hsla(0,0%,92.5%,.5),-.29412em 0 0 hsla(0,0%,92.5%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:initial;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{position:relative;margin:1em 0;border-radius:.1rem;line-height:1.4;-webkit-overflow-scrolling:touch}.md-typeset pre>code{display:block;margin:0;padding:.525rem .6rem;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:slice;box-decoration-break:slice;overflow:auto}.md-typeset pre>code::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset kbd{padding:0 .29412em;border-radius:.15rem;border:.05rem solid #c9c9c9;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .05rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.1rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.05rem dotted rgba(0,0,0,.54);text-decoration:none;cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.07812em;margin-left:0}.md-typeset blockquote{padding-left:.6rem;border-left:.2rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}[dir=rtl] .md-typeset blockquote{padding-right:.6rem;padding-left:0;border-right:.2rem solid rgba(0,0,0,.26);border-left:initial}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em;margin-left:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em;margin-left:0}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em;margin-left:0}.md-typeset dd{margin:1em 0 1em 1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em;margin-left:0}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);display:inline-block;max-width:100%;border-radius:.1rem;font-size:.64rem;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{min-width:5rem;padding:.6rem .8rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:.6rem .8rem;border-top:.05rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr{transition:background-color .125s}.md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.035);box-shadow:inset 0 .05rem 0 #fff}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}.md-typeset .md-typeset__table table{display:table;width:100%;margin:0;overflow:hidden}html{font-size:125%;overflow-x:hidden}body,html{height:100%}body{position:relative;font-size:.5rem}hr{display:block;height:.05rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:61rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;padding-top:2.4rem;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{height:100%;padding-top:1.5rem;padding-bottom:.05rem}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:3}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md-skip{position:fixed;width:.05rem;height:.05rem;margin:.5rem;padding:.3rem .5rem;-webkit-transform:translateY(.4rem);transform:translateY(.4rem);border-radius:.1rem;background-color:rgba(0,0,0,.87);color:#fff;font-size:.64rem;opacity:0;overflow:hidden}.md-skip:focus{width:auto;height:auto;clip:auto;-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1;z-index:10}@page{margin:25mm}.md-clipboard{position:absolute;top:.3rem;right:.3rem;width:1.4rem;height:1.4rem;border-radius:.1rem;font-size:.8rem;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-clipboard:before{transition:color .25s,opacity .25s;color:rgba(0,0,0,.07);content:"\E14D"}.codehilite:hover .md-clipboard:before,.md-typeset .highlight:hover .md-clipboard:before,pre:hover .md-clipboard:before{color:rgba(0,0,0,.54)}.md-clipboard:focus:before,.md-clipboard:hover:before{color:#536dfe}.md-clipboard__message{display:block;position:absolute;top:0;right:1.7rem;padding:.3rem .5rem;-webkit-transform:translateX(.4rem);transform:translateX(.4rem);transition:opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0);transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s;transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0);border-radius:.1rem;background-color:rgba(0,0,0,.54);color:#fff;font-size:.64rem;white-space:nowrap;opacity:0;pointer-events:none}.md-clipboard__message--active{-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1;pointer-events:auto}.md-clipboard__message:before{content:attr(aria-label)}.md-clipboard__message:after{display:block;position:absolute;top:50%;right:-.2rem;width:0;margin-top:-.2rem;border-color:transparent rgba(0,0,0,.54);border-style:solid;border-width:.2rem 0 .2rem .2rem;content:""}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}.md-content__inner:before{display:block;height:.4rem;content:""}.md-content__inner>:last-child{margin-bottom:0}.md-content__icon{position:relative;margin:.4rem 0;padding:0;float:right}.md-typeset .md-content__icon{color:rgba(0,0,0,.26)}.md-header{position:fixed;top:0;right:0;left:0;height:2.4rem;transition:background-color .25s,color .25s;background-color:#3f51b5;color:#fff;box-shadow:none;z-index:2;-webkit-backface-visibility:hidden;backface-visibility:hidden}.no-js .md-header{transition:none;box-shadow:none}.md-header[data-md-state=shadow]{transition:background-color .25s,color .25s,box-shadow .25s;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.md-header-nav{padding:0 .2rem}.md-header-nav__button{position:relative;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo *{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__topic{display:block;position:absolute;transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(1.25rem);transform:translateX(1.25rem);transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);opacity:0;z-index:-1;pointer-events:none}[dir=rtl] .md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(-1.25rem);transform:translateX(-1.25rem)}.no-js .md-header-nav__topic{position:static}.no-js .md-header-nav__topic+.md-header-nav__topic{display:none}.md-header-nav__title{padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-header-nav__title[data-md-state=active] .md-header-nav__topic{-webkit-transform:translateX(-1.25rem);transform:translateX(-1.25rem);transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);opacity:0;z-index:-1;pointer-events:none}[dir=rtl] .md-header-nav__title[data-md-state=active] .md-header-nav__topic{-webkit-transform:translateX(1.25rem);transform:translateX(1.25rem)}.md-header-nav__title[data-md-state=active] .md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);opacity:1;z-index:0;pointer-events:auto}.md-header-nav__source{display:none}.md-hero{transition:background .25s;background-color:#3f51b5;color:#fff;font-size:1rem;overflow:hidden}.md-hero__inner{margin-top:1rem;padding:.8rem .8rem .4rem;transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition-delay:.1s}[data-md-state=hidden] .md-hero__inner{pointer-events:none;-webkit-transform:translateY(.625rem);transform:translateY(.625rem);transition:opacity .1s 0s,-webkit-transform 0s .4s;transition:transform 0s .4s,opacity .1s 0s;transition:transform 0s .4s,opacity .1s 0s,-webkit-transform 0s .4s;opacity:0}.md-hero--expand .md-hero__inner{margin-bottom:1.2rem}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.2rem;overflow:auto}.md-footer-nav__link{padding-top:1.4rem;padding-bottom:.4rem;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}[dir=rtl] .md-footer-nav__link--prev{float:right}.md-footer-nav__link--next{width:75%;float:right;text-align:right}[dir=rtl] .md-footer-nav__link--next{float:left;text-align:left}.md-footer-nav__button{transition:background .25s}.md-footer-nav__title{position:relative;padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-1rem;padding:0 1rem;color:hsla(0,0%,100%,.7);font-size:.75rem}.md-footer-meta{background-color:rgba(0,0,0,.895)}.md-footer-meta__inner{padding:.2rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:#fff}.md-footer-copyright{margin:0 .6rem;padding:.4rem 0;color:hsla(0,0%,100%,.3);font-size:.64rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .4rem;padding:.2rem 0 .6rem}.md-footer-social__link{display:inline-block;width:1.6rem;height:1.6rem;font-size:.8rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;padding:0 .6rem;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"\E5C4"}[dir=rtl] .md-nav__title:before{content:"\E5C8"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:0 .6rem}.md-nav__item:last-child{padding-bottom:.6rem}.md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-right:.6rem;padding-left:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;margin-top:.625em;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"\E313"}html .md-nav__link[for=__toc]{display:none}html .md-nav__link[for=__toc]~.md-nav{display:none}html .md-nav__link[for=__toc]+.md-nav__link:after{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__link--active,.md-nav__link:active{color:#3f51b5}.md-nav__item--nested>.md-nav__link{color:inherit}.md-nav__link:focus,.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 2.2rem 0 3.6rem;text-overflow:ellipsis;z-index:2}[dir=rtl] .md-search__input{padding:0 3.6rem 0 2.2rem}.md-search__input::-webkit-input-placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input:-ms-input-placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-ms-input-placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-webkit-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input:-ms-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-ms-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;transition:color .25s cubic-bezier(.1,.7,.1,1),opacity .25s;font-size:1.2rem;cursor:pointer;z-index:2}.md-search__icon:hover{opacity:.7}.md-search__icon[for=__search]{top:.3rem;left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem;left:auto}.md-search__icon[for=__search]:before{content:"\E8B6"}.md-search__icon[type=reset]{top:.3rem;right:.5rem;-webkit-transform:scale(.125);transform:scale(.125);transition:opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);opacity:0}[dir=rtl] .md-search__icon[type=reset]{right:auto;left:.5rem}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]{-webkit-transform:scale(1);transform:scale(1);opacity:1}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]:hover{opacity:.7}.md-search__output{position:absolute;width:100%;border-radius:0 0 .1rem .1rem;overflow:hidden;z-index:1}.md-search__scrollwrap{height:100%;background-color:#fff;box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result{color:rgba(0,0,0,.87);word-break:break-word}.md-search-result__meta{padding:0 .8rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:.64rem;line-height:1.8rem}.md-search-result__list{margin:0;padding:0;border-top:.05rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.05rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;transition:background .25s;outline:0;overflow:hidden}.md-search-result__link:hover,.md-search-result__link[data-md-state=active]{background-color:rgba(83,109,254,.1)}.md-search-result__link:hover .md-search-result__article:before,.md-search-result__link[data-md-state=active] .md-search-result__article:before{opacity:.7}.md-search-result__link:last-child .md-search-result__teaser{margin-bottom:.6rem}.md-search-result__article{position:relative;padding:0 .8rem;overflow:auto}.md-search-result__article--document:before{position:absolute;left:0;margin:.1rem;transition:opacity .25s;color:rgba(0,0,0,.54);content:"\E880"}[dir=rtl] .md-search-result__article--document:before{right:0;left:auto}.md-search-result__article--document .md-search-result__title{margin:.55rem 0;font-size:.8rem;font-weight:400;line-height:1.4}.md-search-result__title{margin:.5em 0;font-size:.64rem;font-weight:700;line-height:1.4}.md-search-result__teaser{display:-webkit-box;max-height:1.65rem;margin:.5em 0;color:rgba(0,0,0,.54);font-size:.64rem;line-height:1.4;text-overflow:ellipsis;overflow:hidden;-webkit-line-clamp:2}.md-search-result em{font-style:normal;font-weight:700;text-decoration:underline}.md-sidebar{position:absolute;width:12.1rem;padding:1.2rem 0;overflow:hidden}.md-sidebar[data-md-state=lock]{position:fixed;top:2.4rem}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .2rem;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}@-webkit-keyframes md-source__facts--done{0%{height:0}to{height:.65rem}}@keyframes md-source__facts--done{0%{height:0}to{height:.65rem}}@-webkit-keyframes md-source__fact--done{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes md-source__fact--done{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;padding-right:.6rem;transition:opacity .25s;font-size:.65rem;line-height:1.2;white-space:nowrap}[dir=rtl] .md-source{padding-right:0;padding-left:.6rem}.md-source:hover{opacity:.7}.md-source:after{display:inline-block;height:2.4rem;content:"";vertical-align:middle}.md-source__icon{display:inline-block;width:2.4rem;height:2.4rem;content:"";vertical-align:middle}.md-source__icon svg{width:1.2rem;height:1.2rem;margin-top:.6rem;margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem;margin-left:0}.md-source__icon+.md-source__repository{margin-left:-2.2rem;padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2.2rem;margin-left:0;padding-right:2rem;padding-left:0}.md-source__repository{display:inline-block;max-width:100%;margin-left:.6rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:.55rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:md-source__facts--done .25s ease-in;animation:md-source__facts--done .25s ease-in}.md-source__fact{float:left}[dir=rtl] .md-source__fact{float:right}[data-md-state=done] .md-source__fact{-webkit-animation:md-source__fact--done .4s ease-out;animation:md-source__fact--done .4s ease-out}.md-source__fact:before{margin:0 .1rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.md-source-file{display:inline-block;margin:1em .5em 1em 0;padding-right:.25rem;border-radius:.1rem;background-color:rgba(0,0,0,.07);font-size:.64rem;list-style-type:none;cursor:pointer;overflow:hidden}.md-source-file:before{display:inline-block;margin-right:.25rem;padding:.25rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:.8rem;content:"\E86F";vertical-align:middle}html .md-source-file{transition:background .4s,color .4s,box-shadow .4s cubic-bezier(.4,0,.2,1)}html .md-source-file:before{transition:inherit}html body .md-typeset .md-source-file{color:rgba(0,0,0,.54)}.md-source-file:hover{box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36)}.md-source-file:hover:before{background-color:#536dfe}.md-tabs{width:100%;transition:background .25s;background-color:#3f51b5;color:#fff;overflow:auto}.md-tabs__list{margin:0 0 0 .2rem;padding:0;list-style:none;white-space:nowrap}.md-tabs__item{display:inline-block;height:2.4rem;padding-right:.6rem;padding-left:.6rem}.md-tabs__link{display:block;margin-top:.8rem;transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);font-size:.7rem;opacity:.7}.md-tabs__link--active,.md-tabs__link:hover{color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:.02s}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:.04s}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:.06s}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:.08s}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[data-md-state=hidden]{pointer-events:none}.md-tabs[data-md-state=hidden] .md-tabs__link{-webkit-transform:translateY(50%);transform:translateY(50%);transition:color .25s,opacity .1s,-webkit-transform 0s .4s;transition:color .25s,transform 0s .4s,opacity .1s;transition:color .25s,transform 0s .4s,opacity .1s,-webkit-transform 0s .4s;opacity:0}.md-typeset .admonition,.md-typeset details{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:relative;margin:1.5625em 0;padding:0 .6rem;border-left:.2rem solid #448aff;border-radius:.1rem;font-size:.64rem;overflow:auto}[dir=rtl] .md-typeset .admonition,[dir=rtl] .md-typeset details{border-right:.2rem solid #448aff;border-left:none}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin:1em 0}.md-typeset .admonition>.admonition-title,.md-typeset .admonition>summary,.md-typeset details>.admonition-title,.md-typeset details>summary{margin:0 -.6rem;padding:.4rem .6rem .4rem 2rem;border-bottom:.05rem solid rgba(68,138,255,.1);background-color:rgba(68,138,255,.1);font-weight:700}[dir=rtl] .md-typeset .admonition>.admonition-title,[dir=rtl] .md-typeset .admonition>summary,[dir=rtl] .md-typeset details>.admonition-title,[dir=rtl] .md-typeset details>summary{padding:.4rem 2rem .4rem .6rem}.md-typeset .admonition>.admonition-title:last-child,.md-typeset .admonition>summary:last-child,.md-typeset details>.admonition-title:last-child,.md-typeset details>summary:last-child{margin-bottom:0}.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before{position:absolute;left:.6rem;color:#448aff;font-size:1rem;content:"\E3C9"}[dir=rtl] .md-typeset .admonition>.admonition-title:before,[dir=rtl] .md-typeset .admonition>summary:before,[dir=rtl] .md-typeset details>.admonition-title:before,[dir=rtl] .md-typeset details>summary:before{right:.6rem;left:auto}.md-typeset .admonition.abstract,.md-typeset .admonition.summary,.md-typeset .admonition.tldr,.md-typeset details.abstract,.md-typeset details.summary,.md-typeset details.tldr{border-left-color:#00b0ff}[dir=rtl] .md-typeset .admonition.abstract,[dir=rtl] .md-typeset .admonition.summary,[dir=rtl] .md-typeset .admonition.tldr,[dir=rtl] .md-typeset details.abstract,[dir=rtl] .md-typeset details.summary,[dir=rtl] .md-typeset details.tldr{border-right-color:#00b0ff}.md-typeset .admonition.abstract>.admonition-title,.md-typeset .admonition.abstract>summary,.md-typeset .admonition.summary>.admonition-title,.md-typeset .admonition.summary>summary,.md-typeset .admonition.tldr>.admonition-title,.md-typeset .admonition.tldr>summary,.md-typeset details.abstract>.admonition-title,.md-typeset details.abstract>summary,.md-typeset details.summary>.admonition-title,.md-typeset details.summary>summary,.md-typeset details.tldr>.admonition-title,.md-typeset details.tldr>summary{border-bottom-color:rgba(0,176,255,.1);background-color:rgba(0,176,255,.1)}.md-typeset .admonition.abstract>.admonition-title:before,.md-typeset .admonition.abstract>summary:before,.md-typeset .admonition.summary>.admonition-title:before,.md-typeset .admonition.summary>summary:before,.md-typeset .admonition.tldr>.admonition-title:before,.md-typeset .admonition.tldr>summary:before,.md-typeset details.abstract>.admonition-title:before,.md-typeset details.abstract>summary:before,.md-typeset details.summary>.admonition-title:before,.md-typeset details.summary>summary:before,.md-typeset details.tldr>.admonition-title:before,.md-typeset details.tldr>summary:before{color:#00b0ff;content:""}.md-typeset .admonition.info,.md-typeset .admonition.todo,.md-typeset details.info,.md-typeset details.todo{border-left-color:#00b8d4}[dir=rtl] .md-typeset .admonition.info,[dir=rtl] .md-typeset .admonition.todo,[dir=rtl] .md-typeset details.info,[dir=rtl] .md-typeset details.todo{border-right-color:#00b8d4}.md-typeset .admonition.info>.admonition-title,.md-typeset .admonition.info>summary,.md-typeset .admonition.todo>.admonition-title,.md-typeset .admonition.todo>summary,.md-typeset details.info>.admonition-title,.md-typeset details.info>summary,.md-typeset details.todo>.admonition-title,.md-typeset details.todo>summary{border-bottom-color:rgba(0,184,212,.1);background-color:rgba(0,184,212,.1)}.md-typeset .admonition.info>.admonition-title:before,.md-typeset .admonition.info>summary:before,.md-typeset .admonition.todo>.admonition-title:before,.md-typeset .admonition.todo>summary:before,.md-typeset details.info>.admonition-title:before,.md-typeset details.info>summary:before,.md-typeset details.todo>.admonition-title:before,.md-typeset details.todo>summary:before{color:#00b8d4;content:""}.md-typeset .admonition.hint,.md-typeset .admonition.important,.md-typeset .admonition.tip,.md-typeset details.hint,.md-typeset details.important,.md-typeset details.tip{border-left-color:#00bfa5}[dir=rtl] .md-typeset .admonition.hint,[dir=rtl] .md-typeset .admonition.important,[dir=rtl] .md-typeset .admonition.tip,[dir=rtl] .md-typeset details.hint,[dir=rtl] .md-typeset details.important,[dir=rtl] .md-typeset details.tip{border-right-color:#00bfa5}.md-typeset .admonition.hint>.admonition-title,.md-typeset .admonition.hint>summary,.md-typeset .admonition.important>.admonition-title,.md-typeset .admonition.important>summary,.md-typeset .admonition.tip>.admonition-title,.md-typeset .admonition.tip>summary,.md-typeset details.hint>.admonition-title,.md-typeset details.hint>summary,.md-typeset details.important>.admonition-title,.md-typeset details.important>summary,.md-typeset details.tip>.admonition-title,.md-typeset details.tip>summary{border-bottom-color:rgba(0,191,165,.1);background-color:rgba(0,191,165,.1)}.md-typeset .admonition.hint>.admonition-title:before,.md-typeset .admonition.hint>summary:before,.md-typeset .admonition.important>.admonition-title:before,.md-typeset .admonition.important>summary:before,.md-typeset .admonition.tip>.admonition-title:before,.md-typeset .admonition.tip>summary:before,.md-typeset details.hint>.admonition-title:before,.md-typeset details.hint>summary:before,.md-typeset details.important>.admonition-title:before,.md-typeset details.important>summary:before,.md-typeset details.tip>.admonition-title:before,.md-typeset details.tip>summary:before{color:#00bfa5;content:""}.md-typeset .admonition.check,.md-typeset .admonition.done,.md-typeset .admonition.success,.md-typeset details.check,.md-typeset details.done,.md-typeset details.success{border-left-color:#00c853}[dir=rtl] .md-typeset .admonition.check,[dir=rtl] .md-typeset .admonition.done,[dir=rtl] .md-typeset .admonition.success,[dir=rtl] .md-typeset details.check,[dir=rtl] .md-typeset details.done,[dir=rtl] .md-typeset details.success{border-right-color:#00c853}.md-typeset .admonition.check>.admonition-title,.md-typeset .admonition.check>summary,.md-typeset .admonition.done>.admonition-title,.md-typeset .admonition.done>summary,.md-typeset .admonition.success>.admonition-title,.md-typeset .admonition.success>summary,.md-typeset details.check>.admonition-title,.md-typeset details.check>summary,.md-typeset details.done>.admonition-title,.md-typeset details.done>summary,.md-typeset details.success>.admonition-title,.md-typeset details.success>summary{border-bottom-color:rgba(0,200,83,.1);background-color:rgba(0,200,83,.1)}.md-typeset .admonition.check>.admonition-title:before,.md-typeset .admonition.check>summary:before,.md-typeset .admonition.done>.admonition-title:before,.md-typeset .admonition.done>summary:before,.md-typeset .admonition.success>.admonition-title:before,.md-typeset .admonition.success>summary:before,.md-typeset details.check>.admonition-title:before,.md-typeset details.check>summary:before,.md-typeset details.done>.admonition-title:before,.md-typeset details.done>summary:before,.md-typeset details.success>.admonition-title:before,.md-typeset details.success>summary:before{color:#00c853;content:""}.md-typeset .admonition.faq,.md-typeset .admonition.help,.md-typeset .admonition.question,.md-typeset details.faq,.md-typeset details.help,.md-typeset details.question{border-left-color:#64dd17}[dir=rtl] .md-typeset .admonition.faq,[dir=rtl] .md-typeset .admonition.help,[dir=rtl] .md-typeset .admonition.question,[dir=rtl] .md-typeset details.faq,[dir=rtl] .md-typeset details.help,[dir=rtl] .md-typeset details.question{border-right-color:#64dd17}.md-typeset .admonition.faq>.admonition-title,.md-typeset .admonition.faq>summary,.md-typeset .admonition.help>.admonition-title,.md-typeset .admonition.help>summary,.md-typeset .admonition.question>.admonition-title,.md-typeset .admonition.question>summary,.md-typeset details.faq>.admonition-title,.md-typeset details.faq>summary,.md-typeset details.help>.admonition-title,.md-typeset details.help>summary,.md-typeset details.question>.admonition-title,.md-typeset details.question>summary{border-bottom-color:rgba(100,221,23,.1);background-color:rgba(100,221,23,.1)}.md-typeset .admonition.faq>.admonition-title:before,.md-typeset .admonition.faq>summary:before,.md-typeset .admonition.help>.admonition-title:before,.md-typeset .admonition.help>summary:before,.md-typeset .admonition.question>.admonition-title:before,.md-typeset .admonition.question>summary:before,.md-typeset details.faq>.admonition-title:before,.md-typeset details.faq>summary:before,.md-typeset details.help>.admonition-title:before,.md-typeset details.help>summary:before,.md-typeset details.question>.admonition-title:before,.md-typeset details.question>summary:before{color:#64dd17;content:""}.md-typeset .admonition.attention,.md-typeset .admonition.caution,.md-typeset .admonition.warning,.md-typeset details.attention,.md-typeset details.caution,.md-typeset details.warning{border-left-color:#ff9100}[dir=rtl] .md-typeset .admonition.attention,[dir=rtl] .md-typeset .admonition.caution,[dir=rtl] .md-typeset .admonition.warning,[dir=rtl] .md-typeset details.attention,[dir=rtl] .md-typeset details.caution,[dir=rtl] .md-typeset details.warning{border-right-color:#ff9100}.md-typeset .admonition.attention>.admonition-title,.md-typeset .admonition.attention>summary,.md-typeset .admonition.caution>.admonition-title,.md-typeset .admonition.caution>summary,.md-typeset .admonition.warning>.admonition-title,.md-typeset .admonition.warning>summary,.md-typeset details.attention>.admonition-title,.md-typeset details.attention>summary,.md-typeset details.caution>.admonition-title,.md-typeset details.caution>summary,.md-typeset details.warning>.admonition-title,.md-typeset details.warning>summary{border-bottom-color:rgba(255,145,0,.1);background-color:rgba(255,145,0,.1)}.md-typeset .admonition.attention>.admonition-title:before,.md-typeset .admonition.attention>summary:before,.md-typeset .admonition.caution>.admonition-title:before,.md-typeset .admonition.caution>summary:before,.md-typeset .admonition.warning>.admonition-title:before,.md-typeset .admonition.warning>summary:before,.md-typeset details.attention>.admonition-title:before,.md-typeset details.attention>summary:before,.md-typeset details.caution>.admonition-title:before,.md-typeset details.caution>summary:before,.md-typeset details.warning>.admonition-title:before,.md-typeset details.warning>summary:before{color:#ff9100;content:""}.md-typeset .admonition.fail,.md-typeset .admonition.failure,.md-typeset .admonition.missing,.md-typeset details.fail,.md-typeset details.failure,.md-typeset details.missing{border-left-color:#ff5252}[dir=rtl] .md-typeset .admonition.fail,[dir=rtl] .md-typeset .admonition.failure,[dir=rtl] .md-typeset .admonition.missing,[dir=rtl] .md-typeset details.fail,[dir=rtl] .md-typeset details.failure,[dir=rtl] .md-typeset details.missing{border-right-color:#ff5252}.md-typeset .admonition.fail>.admonition-title,.md-typeset .admonition.fail>summary,.md-typeset .admonition.failure>.admonition-title,.md-typeset .admonition.failure>summary,.md-typeset .admonition.missing>.admonition-title,.md-typeset .admonition.missing>summary,.md-typeset details.fail>.admonition-title,.md-typeset details.fail>summary,.md-typeset details.failure>.admonition-title,.md-typeset details.failure>summary,.md-typeset details.missing>.admonition-title,.md-typeset details.missing>summary{border-bottom-color:rgba(255,82,82,.1);background-color:rgba(255,82,82,.1)}.md-typeset .admonition.fail>.admonition-title:before,.md-typeset .admonition.fail>summary:before,.md-typeset .admonition.failure>.admonition-title:before,.md-typeset .admonition.failure>summary:before,.md-typeset .admonition.missing>.admonition-title:before,.md-typeset .admonition.missing>summary:before,.md-typeset details.fail>.admonition-title:before,.md-typeset details.fail>summary:before,.md-typeset details.failure>.admonition-title:before,.md-typeset details.failure>summary:before,.md-typeset details.missing>.admonition-title:before,.md-typeset details.missing>summary:before{color:#ff5252;content:""}.md-typeset .admonition.danger,.md-typeset .admonition.error,.md-typeset details.danger,.md-typeset details.error{border-left-color:#ff1744}[dir=rtl] .md-typeset .admonition.danger,[dir=rtl] .md-typeset .admonition.error,[dir=rtl] .md-typeset details.danger,[dir=rtl] .md-typeset details.error{border-right-color:#ff1744}.md-typeset .admonition.danger>.admonition-title,.md-typeset .admonition.danger>summary,.md-typeset .admonition.error>.admonition-title,.md-typeset .admonition.error>summary,.md-typeset details.danger>.admonition-title,.md-typeset details.danger>summary,.md-typeset details.error>.admonition-title,.md-typeset details.error>summary{border-bottom-color:rgba(255,23,68,.1);background-color:rgba(255,23,68,.1)}.md-typeset .admonition.danger>.admonition-title:before,.md-typeset .admonition.danger>summary:before,.md-typeset .admonition.error>.admonition-title:before,.md-typeset .admonition.error>summary:before,.md-typeset details.danger>.admonition-title:before,.md-typeset details.danger>summary:before,.md-typeset details.error>.admonition-title:before,.md-typeset details.error>summary:before{color:#ff1744;content:""}.md-typeset .admonition.bug,.md-typeset details.bug{border-left-color:#f50057}[dir=rtl] .md-typeset .admonition.bug,[dir=rtl] .md-typeset details.bug{border-right-color:#f50057}.md-typeset .admonition.bug>.admonition-title,.md-typeset .admonition.bug>summary,.md-typeset details.bug>.admonition-title,.md-typeset details.bug>summary{border-bottom-color:rgba(245,0,87,.1);background-color:rgba(245,0,87,.1)}.md-typeset .admonition.bug>.admonition-title:before,.md-typeset .admonition.bug>summary:before,.md-typeset details.bug>.admonition-title:before,.md-typeset details.bug>summary:before{color:#f50057;content:""}.md-typeset .admonition.example,.md-typeset details.example{border-left-color:#651fff}[dir=rtl] .md-typeset .admonition.example,[dir=rtl] .md-typeset details.example{border-right-color:#651fff}.md-typeset .admonition.example>.admonition-title,.md-typeset .admonition.example>summary,.md-typeset details.example>.admonition-title,.md-typeset details.example>summary{border-bottom-color:rgba(101,31,255,.1);background-color:rgba(101,31,255,.1)}.md-typeset .admonition.example>.admonition-title:before,.md-typeset .admonition.example>summary:before,.md-typeset details.example>.admonition-title:before,.md-typeset details.example>summary:before{color:#651fff;content:""}.md-typeset .admonition.cite,.md-typeset .admonition.quote,.md-typeset details.cite,.md-typeset details.quote{border-left-color:#9e9e9e}[dir=rtl] .md-typeset .admonition.cite,[dir=rtl] .md-typeset .admonition.quote,[dir=rtl] .md-typeset details.cite,[dir=rtl] .md-typeset details.quote{border-right-color:#9e9e9e}.md-typeset .admonition.cite>.admonition-title,.md-typeset .admonition.cite>summary,.md-typeset .admonition.quote>.admonition-title,.md-typeset .admonition.quote>summary,.md-typeset details.cite>.admonition-title,.md-typeset details.cite>summary,.md-typeset details.quote>.admonition-title,.md-typeset details.quote>summary{border-bottom-color:hsla(0,0%,62%,.1);background-color:hsla(0,0%,62%,.1)}.md-typeset .admonition.cite>.admonition-title:before,.md-typeset .admonition.cite>summary:before,.md-typeset .admonition.quote>.admonition-title:before,.md-typeset .admonition.quote>summary:before,.md-typeset details.cite>.admonition-title:before,.md-typeset details.cite>summary:before,.md-typeset details.quote>.admonition-title:before,.md-typeset details.quote>summary:before{color:#9e9e9e;content:""}.codehilite .o,.codehilite .ow,.md-typeset .highlight .o,.md-typeset .highlight .ow{color:inherit}.codehilite .ge,.md-typeset .highlight .ge{color:#000}.codehilite .gr,.md-typeset .highlight .gr{color:#a00}.codehilite .gh,.md-typeset .highlight .gh{color:#999}.codehilite .go,.md-typeset .highlight .go{color:#888}.codehilite .gp,.md-typeset .highlight .gp{color:#555}.codehilite .gs,.md-typeset .highlight .gs{color:inherit}.codehilite .gu,.md-typeset .highlight .gu{color:#aaa}.codehilite .gt,.md-typeset .highlight .gt{color:#a00}.codehilite .gd,.md-typeset .highlight .gd{background-color:#fdd}.codehilite .gi,.md-typeset .highlight .gi{background-color:#dfd}.codehilite .k,.md-typeset .highlight .k{color:#3b78e7}.codehilite .kc,.md-typeset .highlight .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn,.md-typeset .highlight .kd,.md-typeset .highlight .kn{color:#3b78e7}.codehilite .kp,.md-typeset .highlight .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt,.md-typeset .highlight .kr,.md-typeset .highlight .kt{color:#3e61a2}.codehilite .c,.codehilite .cm,.md-typeset .highlight .c,.md-typeset .highlight .cm{color:#999}.codehilite .cp,.md-typeset .highlight .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs,.md-typeset .highlight .c1,.md-typeset .highlight .ch,.md-typeset .highlight .cs{color:#999}.codehilite .na,.codehilite .nb,.md-typeset .highlight .na,.md-typeset .highlight .nb{color:#c2185b}.codehilite .bp,.md-typeset .highlight .bp{color:#3e61a2}.codehilite .nc,.md-typeset .highlight .nc{color:#c2185b}.codehilite .no,.md-typeset .highlight .no{color:#3e61a2}.codehilite .nd,.codehilite .ni,.md-typeset .highlight .nd,.md-typeset .highlight .ni{color:#666}.codehilite .ne,.codehilite .nf,.md-typeset .highlight .ne,.md-typeset .highlight .nf{color:#c2185b}.codehilite .nl,.md-typeset .highlight .nl{color:#3b5179}.codehilite .nn,.md-typeset .highlight .nn{color:#ec407a}.codehilite .nt,.md-typeset .highlight .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi,.md-typeset .highlight .nv,.md-typeset .highlight .vc,.md-typeset .highlight .vg,.md-typeset .highlight .vi{color:#3e61a2}.codehilite .nx,.md-typeset .highlight .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo,.md-typeset .highlight .il,.md-typeset .highlight .m,.md-typeset .highlight .mf,.md-typeset .highlight .mh,.md-typeset .highlight .mi,.md-typeset .highlight .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc,.md-typeset .highlight .s,.md-typeset .highlight .sb,.md-typeset .highlight .sc{color:#0d904f}.codehilite .sd,.md-typeset .highlight .sd{color:#999}.codehilite .s2,.md-typeset .highlight .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx,.md-typeset .highlight .se,.md-typeset .highlight .sh,.md-typeset .highlight .si,.md-typeset .highlight .sx{color:#183691}.codehilite .sr,.md-typeset .highlight .sr{color:#009926}.codehilite .s1,.codehilite .ss,.md-typeset .highlight .s1,.md-typeset .highlight .ss{color:#0d904f}.codehilite .err,.md-typeset .highlight .err{color:#a61717}.codehilite .w,.md-typeset .highlight .w{color:transparent}.codehilite .hll,.md-typeset .highlight .hll{display:block;margin:0 -.6rem;padding:0 .6rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite,.md-typeset .highlight{position:relative;margin:1em 0;padding:0;border-radius:.1rem;background-color:hsla(0,0%,92.5%,.5);color:#37474f;line-height:1.4;-webkit-overflow-scrolling:touch}.md-typeset .codehilite code,.md-typeset .codehilite pre,.md-typeset .highlight code,.md-typeset .highlight pre{display:block;margin:0;padding:.525rem .6rem;background-color:transparent;overflow:auto;vertical-align:top}.md-typeset .codehilite code::-webkit-scrollbar,.md-typeset .codehilite pre::-webkit-scrollbar,.md-typeset .highlight code::-webkit-scrollbar,.md-typeset .highlight pre::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset .codehilite code::-webkit-scrollbar-thumb,.md-typeset .codehilite pre::-webkit-scrollbar-thumb,.md-typeset .highlight code::-webkit-scrollbar-thumb,.md-typeset .highlight pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite code::-webkit-scrollbar-thumb:hover,.md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,.md-typeset .highlight code::-webkit-scrollbar-thumb:hover,.md-typeset .highlight pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre.codehilite,.md-typeset pre.highlight{overflow:visible}.md-typeset pre.codehilite code,.md-typeset pre.highlight code{display:block;padding:.525rem .6rem;overflow:auto}.md-typeset .codehilitetable,.md-typeset .highlighttable{display:block;margin:1em 0;border-radius:.2em;font-size:.8rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td,.md-typeset .highlighttable tbody,.md-typeset .highlighttable td{display:block;padding:0}.md-typeset .codehilitetable tr,.md-typeset .highlighttable tr{display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .highlight,.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .codehilite,.md-typeset .highlighttable .highlight,.md-typeset .highlighttable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .linenodiv{padding:.525rem .6rem}.md-typeset .codehilitetable .linenos,.md-typeset .highlighttable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre,.md-typeset .highlighttable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code,.md-typeset .highlighttable .code{flex:1;overflow:hidden}.md-typeset>.codehilitetable,.md-typeset>.highlighttable{box-shadow:none}.md-typeset [id^="fnref:"]{display:inline-block}.md-typeset [id^="fnref:"]:target{margin-top:-3.8rem;padding-top:3.8rem;pointer-events:none}.md-typeset [id^="fn:"]:before{display:none;height:0;content:""}.md-typeset [id^="fn:"]:target:before{display:block;margin-top:-3.5rem;padding-top:3.5rem;pointer-events:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:.64rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{transition:color .25s}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-ref{display:inline-block;pointer-events:auto}.md-typeset .footnote-ref:before{display:inline;margin:0 .2em;border-left:.05rem solid rgba(0,0,0,.26);font-size:1.25em;content:"";vertical-align:-.25rem}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.25rem);transform:translateX(.25rem);transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}[dir=rtl] .md-typeset .footnote-backref{-webkit-transform:translateX(-.25rem);transform:translateX(-.25rem)}.md-typeset .footnote-backref:before{display:inline-block;font-size:.8rem;content:"\E31B"}[dir=rtl] .md-typeset .footnote-backref:before{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.md-typeset .headerlink{display:inline-block;margin-left:.5rem;-webkit-transform:translateY(.25rem);transform:translateY(.25rem);transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem;margin-left:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset h1[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h1[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink,.md-typeset h1[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink:hover,.md-typeset h1[id]:target .headerlink{color:#536dfe}.md-typeset h2[id]:before{display:block;margin-top:-8px;padding-top:8px;content:""}.md-typeset h2[id]:target:before{margin-top:-3.4rem;padding-top:3.4rem}.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink,.md-typeset h2[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink:hover,.md-typeset h2[id]:target .headerlink{color:#536dfe}.md-typeset h3[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h3[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink,.md-typeset h3[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink:hover,.md-typeset h3[id]:target .headerlink{color:#536dfe}.md-typeset h4[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h4[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink,.md-typeset h4[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink:hover,.md-typeset h4[id]:target .headerlink{color:#536dfe}.md-typeset h5[id]:before{display:block;margin-top:-11px;padding-top:11px;content:""}.md-typeset h5[id]:target:before{margin-top:-3.55rem;padding-top:3.55rem}.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink,.md-typeset h5[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink:hover,.md-typeset h5[id]:target .headerlink{color:#536dfe}.md-typeset h6[id]:before{display:block;margin-top:-11px;padding-top:11px;content:""}.md-typeset h6[id]:target:before{margin-top:-3.55rem;padding-top:3.55rem}.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink,.md-typeset h6[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink:hover,.md-typeset h6[id]:target .headerlink{color:#536dfe}.md-typeset .MJXc-display{margin:.75em 0;padding:.75em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .critic.comment,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,92.5%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,92.5%,.5),-.25em 0 0 hsla(0,0%,92.5%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"\E0B7";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:.8rem;padding-left:.8rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset details{display:block;padding-top:0}.md-typeset details[open]>summary:after{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.md-typeset details:not([open]){padding-bottom:0}.md-typeset details:not([open])>summary{border-bottom:none}.md-typeset details summary{padding-right:2rem}[dir=rtl] .md-typeset details summary{padding-left:2rem}.no-details .md-typeset details:not([open])>*{display:none}.no-details .md-typeset details:not([open]) summary{display:block}.md-typeset summary{display:block;outline:none;cursor:pointer}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset summary:after{position:absolute;top:.4rem;right:.6rem;color:rgba(0,0,0,.26);font-size:1rem;content:"\E313"}[dir=rtl] .md-typeset summary:after{right:auto;left:.6rem}.md-typeset .emojione{width:1rem;vertical-align:text-top}.md-typeset code.codehilite,.md-typeset code.highlight{margin:0 .29412em;padding:.07353em 0}.md-typeset .superfences-content{display:none;order:99;width:100%;background-color:#fff}.md-typeset .superfences-content>*{margin:0;border-radius:0}.md-typeset .superfences-tabs{display:flex;position:relative;flex-wrap:wrap;margin:1em 0;border:.05rem solid rgba(0,0,0,.07);border-radius:.2em}.md-typeset .superfences-tabs>input{display:none}.md-typeset .superfences-tabs>input:checked+label{font-weight:700}.md-typeset .superfences-tabs>input:checked+label+.superfences-content{display:block}.md-typeset .superfences-tabs>label{width:auto;padding:.6rem;transition:color .125s;font-size:.64rem;cursor:pointer}html .md-typeset .superfences-tabs>label:hover{color:#536dfe}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em;left:auto}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.15em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.25em;content:"\E835";vertical-align:-.25em}[dir=rtl] .md-typeset .task-list-control .task-list-indicator:before{right:-1.25em;left:auto}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"\E834"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code,.md-typeset pre{white-space:pre-wrap}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-clipboard,.md-content__icon,.md-footer,.md-header,.md-sidebar,.md-tabs,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -.8rem;border-radius:0}.md-typeset pre>code{padding:.525rem .8rem}.md-footer-nav__link--prev .md-footer-nav__title{display:none}.md-search-result__teaser{max-height:2.5rem;-webkit-line-clamp:3}.codehilite .hll,.md-typeset .highlight .hll{margin:0 -.8rem;padding:0 .8rem}.md-typeset>.codehilite,.md-typeset>.highlight{margin:1em -.8rem;border-radius:0}.md-typeset>.codehilite code,.md-typeset>.codehilite pre,.md-typeset>.highlight code,.md-typeset>.highlight pre{padding:.525rem .8rem}.md-typeset>.codehilitetable,.md-typeset>.highlighttable{margin:1em -.8rem;border-radius:0}.md-typeset>.codehilitetable .codehilite>code,.md-typeset>.codehilitetable .codehilite>pre,.md-typeset>.codehilitetable .highlight>code,.md-typeset>.codehilitetable .highlight>pre,.md-typeset>.codehilitetable .linenodiv,.md-typeset>.highlighttable .codehilite>code,.md-typeset>.highlighttable .codehilite>pre,.md-typeset>.highlighttable .highlight>code,.md-typeset>.highlighttable .highlight>pre,.md-typeset>.highlighttable .linenodiv{padding:.5rem .8rem}.md-typeset>p>.MJXc-display{margin:.75em -.8rem;padding:.25em .8rem}.md-typeset>.superfences-tabs{margin:1em -.8rem;border:0;border-top:.05rem solid rgba(0,0,0,.07);border-radius:0}.md-typeset>.superfences-tabs code,.md-typeset>.superfences-tabs pre{padding:.525rem .8rem}}@media only screen and (min-width:100em){html{font-size:137.5%}}@media only screen and (min-width:125em){html{font-size:150%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}html .md-nav__link[for=__toc]{display:block;padding-right:2.4rem}html .md-nav__link[for=__toc]:after{color:inherit;content:"\E8DE"}html .md-nav__link[for=__toc]+.md-nav__link{display:none}html .md-nav__link[for=__toc]~.md-nav{display:flex}html [dir=rtl] .md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav__source{display:block;padding:0 .2rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{position:absolute;top:.2rem;left:.2rem;width:1.8rem;height:1.8rem;-webkit-transform-origin:center;transform-origin:center;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:1rem;background-color:#fff;overflow:hidden;pointer-events:none}[dir=rtl] .md-search__overlay{right:.2rem;left:auto}[data-md-toggle=search]:checked~.md-header .md-search__overlay{transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;width:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);transition:right 0s .3s,left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);transition:right 0s 0s,left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}[dir=rtl] [data-md-toggle=search]:checked~.md-header .md-search__inner{right:0;left:auto}html [dir=rtl] .md-search__inner{right:100%;left:auto;-webkit-transform:translateX(-5%);transform:translateX(-5%)}.md-search__input{width:100%;height:2.4rem;font-size:.9rem}.md-search__icon[for=__search]{top:.6rem;left:.8rem}.md-search__icon[for=__search][for=__search]:before{content:"\E5C4"}[dir=rtl] .md-search__icon[for=__search][for=__search]:before{content:"\E5C8"}.md-search__icon[type=reset]{top:.6rem;right:.8rem}.md-search__output{top:2.4rem;bottom:0}.md-search-result__article--document:before{display:none}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-hero__inner{margin-top:2.4rem;margin-bottom:1.2rem}.md-nav{background-color:#fff}.md-nav--primary,.md-nav--primary .md-nav{display:flex;position:absolute;top:0;right:0;left:0;flex-direction:column;height:100%;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:5.6rem;padding:3rem .8rem .2rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:2.4rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.2rem;left:.2rem;width:2rem;height:2rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background-color:#fff;box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.2rem;left:.2rem;width:3.2rem;height:3.2rem;font-size:2.4rem}html .md-nav--primary .md-nav__title--site:before{display:none}html [dir=rtl] .md-nav--primary .md-nav__title:before{right:.2rem;left:auto}html [dir=rtl] .md-nav--primary .md-nav__title--site .md-nav__button{right:.2rem;left:auto}.md-nav--primary .md-nav__list{flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.05rem solid rgba(0,0,0,.07)}[dir=rtl] .md-nav--primary .md-nav__item{padding:0}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:2.4rem}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"\E315"}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"\E314"}.md-nav--primary .md-nav__link{position:relative;margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:.6rem;margin-top:-.6rem;color:inherit;font-size:1.2rem}[dir=rtl] .md-nav--primary .md-nav__link:after{right:auto;left:.6rem}.md-nav--primary .md-nav--secondary .md-nav__link{position:static}.md-nav--primary .md-nav--secondary .md-nav{position:static;background-color:transparent}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem;padding-left:0}.md-nav__toggle~.md-nav{display:flex;-webkit-transform:translateX(100%);transform:translateX(100%);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}[dir=rtl] .md-nav__toggle~.md-nav{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.no-csstransforms3d .md-nav__toggle~.md-nav{display:none}.md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.no-csstransforms3d .md-nav__toggle:checked~.md-nav{display:flex}.md-sidebar--primary{position:fixed;top:0;left:-12.1rem;width:12.1rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:3}[dir=rtl] .md-sidebar--primary{right:-12.1rem;left:auto}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(12.1rem);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{-webkit-transform:translateX(-12.1rem);transform:translateX(-12.1rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}.md-tabs{display:none}}@media only screen and (min-width:60em){.md-content{margin-right:12.1rem}[dir=rtl] .md-content{margin-right:0;margin-left:12.1rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:11.5rem;max-width:11.5rem;margin-left:1.4rem;padding-right:.6rem}[dir=rtl] .md-header-nav__source{margin-right:1.4rem;margin-left:0;padding-right:0;padding-left:.6rem}.md-search{padding:.2rem}.md-search__overlay{position:fixed;top:0;left:0;width:0;height:0;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);cursor:pointer}[dir=rtl] .md-search__overlay{right:0;left:auto}[data-md-toggle=search]:checked~.md-header .md-search__overlay{width:100%;height:100%;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-search__inner{position:relative;width:11.5rem;padding:.1rem 0;float:right;transition:width .25s cubic-bezier(.1,.7,.1,1)}[dir=rtl] .md-search__inner{float:left}.md-search__form,.md-search__input{border-radius:.1rem}.md-search__input{width:100%;height:1.8rem;padding-left:2.2rem;transition:background-color .25s cubic-bezier(.1,.7,.1,1),color .25s cubic-bezier(.1,.7,.1,1);background-color:rgba(0,0,0,.26);color:inherit;font-size:.8rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input+.md-search__icon{color:inherit}.md-search__input::-webkit-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input:-ms-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input::-ms-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input::placeholder{color:hsla(0,0%,100%,.7)}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.1rem .1rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:1.9rem;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem;padding-left:0}.md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem;padding-left:.8rem}.md-sidebar--secondary{display:block;margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}[dir=rtl] .md-sidebar--secondary{margin-right:100%;margin-left:0;-webkit-transform:translate(100%);transform:translate(100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:12.1rem}[dir=rtl] .md-content{margin-right:12.1rem}.md-content__inner{margin-right:1.2rem;margin-left:1.2rem}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.no-js .md-nav__toggle~.md-nav{display:none}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.no-js .md-nav[data-md-state=expand],.no-js .md-nav__toggle:checked~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}.md-search__scrollwrap{width:34.4rem}.md-sidebar--secondary{margin-left:61rem}[dir=rtl] .md-sidebar--secondary{margin-right:61rem;margin-left:0}.md-tabs~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{font-size:0;visibility:hidden}.md-tabs--active~.md-main .md-nav--primary .md-nav__title{display:block;padding:0}.md-tabs--active~.md-main .md-nav--primary .md-nav__title--site{display:none}.no-js .md-tabs--active~.md-main .md-nav--primary .md-nav{display:block}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item{font-size:0;visibility:hidden}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{display:none;font-size:.7rem;overflow:auto;visibility:visible}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active{display:block}.md-tabs--active~.md-main .md-nav[data-md-level="1"]{max-height:none;overflow:visible}.md-tabs--active~.md-main .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:0}.md-tabs--active~.md-main .md-nav[data-md-level="1"] .md-nav .md-nav__title{display:none}}@media only screen and (min-width:45em){.md-footer-nav__link{width:50%}.md-footer-copyright{max-width:75%;float:left}[dir=rtl] .md-footer-copyright{float:right}.md-footer-social{padding:.6rem 0;float:right}[dir=rtl] .md-footer-social{float:left}}@media only screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}.md-search__scrollwrap{width:23.4rem}.md-search-result__teaser{max-height:2.5rem;-webkit-line-clamp:3}}
\ No newline at end of file
diff --git a/docs/assets/stylesheets/application.982221ab.css b/docs/assets/stylesheets/application.982221ab.css
deleted file mode 100644
index a3762ca..0000000
--- a/docs/assets/stylesheets/application.982221ab.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:separate;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{margin:0;padding:0;border:0;outline-style:none;background:transparent;font-size:inherit}input{border:0;outline:0}.md-clipboard:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-search-result__article--document:before,.md-source-file:before,.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before,.md-typeset summary:after{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__icon,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before,.md-search-result__article--document:before{display:inline-block;margin:.2rem;padding:.4rem;font-size:1.2rem;cursor:pointer}.md-icon--arrow-back:before{content:""}.md-icon--arrow-forward:before{content:""}.md-icon--menu:before{content:""}.md-icon--search:before{content:""}[dir=rtl] .md-icon--arrow-back:before{content:""}[dir=rtl] .md-icon--arrow-forward:before{content:""}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";font-family:Helvetica Neue,Helvetica,Arial,sans-serif}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern";font-feature-settings:"kern";font-family:Courier New,Courier,monospace}.md-typeset{font-size:.8rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 2rem;color:rgba(0,0,0,.54);font-size:1.5625rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:2rem 0 .8rem;font-size:1.25rem;line-height:1.4}.md-typeset h3{margin:1.6rem 0 .8rem;font-size:1rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:.8rem}.md-typeset h4{font-size:.8rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:.8rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:.64rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.05rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,92.5%,.5);color:#37474f;font-size:85%;direction:ltr}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.1rem;box-shadow:.29412em 0 0 hsla(0,0%,92.5%,.5),-.29412em 0 0 hsla(0,0%,92.5%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:none;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{position:relative;margin:1em 0;border-radius:.1rem;line-height:1.4;-webkit-overflow-scrolling:touch}.md-typeset pre>code{display:block;margin:0;padding:.525rem .6rem;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:none;box-decoration-break:none;overflow:auto}.md-typeset pre>code::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset kbd{padding:0 .29412em;border-radius:.15rem;border:.05rem solid #c9c9c9;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .05rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.1rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.05rem dotted rgba(0,0,0,.54);text-decoration:none;cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.07812em;margin-left:0}.md-typeset blockquote{padding-left:.6rem;border-left:.2rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}[dir=rtl] .md-typeset blockquote{padding-right:.6rem;padding-left:0;border-right:.2rem solid rgba(0,0,0,.26);border-left:initial}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em;margin-left:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em;margin-left:0}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em;margin-left:0}.md-typeset dd{margin:1em 0 1em 1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em;margin-left:0}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);display:inline-block;max-width:100%;border-radius:.1rem;font-size:.64rem;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{min-width:5rem;padding:.6rem .8rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:.6rem .8rem;border-top:.05rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr{transition:background-color .125s}.md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.035);box-shadow:inset 0 .05rem 0 #fff}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}.md-typeset .md-typeset__table table{display:table;width:100%;margin:0;overflow:hidden}html{font-size:125%;overflow-x:hidden}body,html{height:100%}body{position:relative;font-size:.5rem}hr{display:block;height:.05rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:61rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;padding-top:2.4rem;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{height:100%;padding-top:1.5rem;padding-bottom:.05rem}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:3}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md-skip{position:fixed;width:.05rem;height:.05rem;margin:.5rem;padding:.3rem .5rem;clip:rect(.05rem);-webkit-transform:translateY(.4rem);transform:translateY(.4rem);border-radius:.1rem;background-color:rgba(0,0,0,.87);color:#fff;font-size:.64rem;opacity:0;overflow:hidden}.md-skip:focus{width:auto;height:auto;clip:auto;-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1;z-index:10}@page{margin:25mm}.md-clipboard{position:absolute;top:.3rem;right:.3rem;width:1.4rem;height:1.4rem;border-radius:.1rem;font-size:.8rem;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-clipboard:before{transition:color .25s,opacity .25s;color:rgba(0,0,0,.07);content:"\E14D"}.codehilite:hover .md-clipboard:before,.md-typeset .highlight:hover .md-clipboard:before,pre:hover .md-clipboard:before{color:rgba(0,0,0,.54)}.md-clipboard:focus:before,.md-clipboard:hover:before{color:#536dfe}.md-clipboard__message{display:block;position:absolute;top:0;right:1.7rem;padding:.3rem .5rem;-webkit-transform:translateX(.4rem);transform:translateX(.4rem);transition:opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0);transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s;transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0);border-radius:.1rem;background-color:rgba(0,0,0,.54);color:#fff;font-size:.64rem;white-space:nowrap;opacity:0;pointer-events:none}.md-clipboard__message--active{-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1;pointer-events:auto}.md-clipboard__message:before{content:attr(aria-label)}.md-clipboard__message:after{display:block;position:absolute;top:50%;right:-.2rem;width:0;margin-top:-.2rem;border-color:transparent rgba(0,0,0,.54);border-style:solid;border-width:.2rem 0 .2rem .2rem;content:""}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}.md-content__inner:before{display:block;height:.4rem;content:""}.md-content__inner>:last-child{margin-bottom:0}.md-content__icon{position:relative;margin:.4rem 0;padding:0;float:right}.md-typeset .md-content__icon{color:rgba(0,0,0,.26)}.md-header{position:fixed;top:0;right:0;left:0;height:2.4rem;transition:background-color .25s,color .25s;background-color:#3f51b5;color:#fff;box-shadow:none;z-index:2;-webkit-backface-visibility:hidden;backface-visibility:hidden}.no-js .md-header{transition:none;box-shadow:none}.md-header[data-md-state=shadow]{transition:background-color .25s,color .25s,box-shadow .25s;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.md-header-nav{padding:0 .2rem}.md-header-nav__button{position:relative;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo *{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__topic{display:block;position:absolute;transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(1.25rem);transform:translateX(1.25rem);transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);opacity:0;z-index:-1;pointer-events:none}[dir=rtl] .md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(-1.25rem);transform:translateX(-1.25rem)}.no-js .md-header-nav__topic{position:static}.no-js .md-header-nav__topic+.md-header-nav__topic{display:none}.md-header-nav__title{padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-header-nav__title[data-md-state=active] .md-header-nav__topic{-webkit-transform:translateX(-1.25rem);transform:translateX(-1.25rem);transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);opacity:0;z-index:-1;pointer-events:none}[dir=rtl] .md-header-nav__title[data-md-state=active] .md-header-nav__topic{-webkit-transform:translateX(1.25rem);transform:translateX(1.25rem)}.md-header-nav__title[data-md-state=active] .md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);opacity:1;z-index:0;pointer-events:auto}.md-header-nav__source{display:none}.md-hero{transition:background .25s;background-color:#3f51b5;color:#fff;font-size:1rem;overflow:hidden}.md-hero__inner{margin-top:1rem;padding:.8rem .8rem .4rem;transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition-delay:.1s}[data-md-state=hidden] .md-hero__inner{pointer-events:none;-webkit-transform:translateY(.625rem);transform:translateY(.625rem);transition:opacity .1s 0s,-webkit-transform 0s .4s;transition:transform 0s .4s,opacity .1s 0s;transition:transform 0s .4s,opacity .1s 0s,-webkit-transform 0s .4s;opacity:0}.md-hero--expand .md-hero__inner{margin-bottom:1.2rem}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.2rem;overflow:auto}.md-footer-nav__link{padding-top:1.4rem;padding-bottom:.4rem;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}[dir=rtl] .md-footer-nav__link--prev{float:right}.md-footer-nav__link--next{width:75%;float:right;text-align:right}[dir=rtl] .md-footer-nav__link--next{float:left;text-align:left}.md-footer-nav__button{transition:background .25s}.md-footer-nav__title{position:relative;padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-1rem;padding:0 1rem;color:hsla(0,0%,100%,.7);font-size:.75rem}.md-footer-meta{background-color:rgba(0,0,0,.895)}.md-footer-meta__inner{padding:.2rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:#fff}.md-footer-copyright{margin:0 .6rem;padding:.4rem 0;color:hsla(0,0%,100%,.3);font-size:.64rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .4rem;padding:.2rem 0 .6rem}.md-footer-social__link{display:inline-block;width:1.6rem;height:1.6rem;font-size:.8rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;padding:0 .6rem;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"\E5C4"}[dir=rtl] .md-nav__title:before{content:"\E5C8"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:0 .6rem}.md-nav__item:last-child{padding-bottom:.6rem}.md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-right:.6rem;padding-left:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;margin-top:.625em;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"\E313"}html .md-nav__link[for=__toc]{display:none}html .md-nav__link[for=__toc]~.md-nav{display:none}html .md-nav__link[for=__toc]+.md-nav__link:after{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__link--active,.md-nav__link:active{color:#3f51b5}.md-nav__item--nested>.md-nav__link{color:inherit}.md-nav__link:focus,.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 2.2rem 0 3.6rem;text-overflow:ellipsis;z-index:2}[dir=rtl] .md-search__input{padding:0 3.6rem 0 2.2rem}.md-search__input::-webkit-input-placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input:-ms-input-placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-ms-input-placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-webkit-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input:-ms-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-ms-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;transition:color .25s cubic-bezier(.1,.7,.1,1),opacity .25s;font-size:1.2rem;cursor:pointer;z-index:2}.md-search__icon:hover{opacity:.7}.md-search__icon[for=__search]{top:.3rem;left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem;left:auto}.md-search__icon[for=__search]:before{content:"\E8B6"}.md-search__icon[type=reset]{top:.3rem;right:.5rem;-webkit-transform:scale(.125);transform:scale(.125);transition:opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);opacity:0}[dir=rtl] .md-search__icon[type=reset]{right:auto;left:.5rem}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]{-webkit-transform:scale(1);transform:scale(1);opacity:1}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]:hover{opacity:.7}.md-search__output{position:absolute;width:100%;border-radius:0 0 .1rem .1rem;overflow:hidden;z-index:1}.md-search__scrollwrap{height:100%;background-color:#fff;box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result{color:rgba(0,0,0,.87);word-break:break-word}.md-search-result__meta{padding:0 .8rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:.64rem;line-height:1.8rem}.md-search-result__list{margin:0;padding:0;border-top:.05rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.05rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;transition:background .25s;outline:0;overflow:hidden}.md-search-result__link:hover,.md-search-result__link[data-md-state=active]{background-color:rgba(83,109,254,.1)}.md-search-result__link:hover .md-search-result__article:before,.md-search-result__link[data-md-state=active] .md-search-result__article:before{opacity:.7}.md-search-result__link:last-child .md-search-result__teaser{margin-bottom:.6rem}.md-search-result__article{position:relative;padding:0 .8rem;overflow:auto}.md-search-result__article--document:before{position:absolute;left:0;margin:.1rem;transition:opacity .25s;color:rgba(0,0,0,.54);content:"\E880"}[dir=rtl] .md-search-result__article--document:before{right:0;left:auto}.md-search-result__article--document .md-search-result__title{margin:.55rem 0;font-size:.8rem;font-weight:400;line-height:1.4}.md-search-result__title{margin:.5em 0;font-size:.64rem;font-weight:700;line-height:1.4}.md-search-result__teaser{display:-webkit-box;max-height:1.65rem;margin:.5em 0;color:rgba(0,0,0,.54);font-size:.64rem;line-height:1.4;text-overflow:ellipsis;overflow:hidden;-webkit-line-clamp:2}.md-search-result em{font-style:normal;font-weight:700;text-decoration:underline}.md-sidebar{position:absolute;width:12.1rem;padding:1.2rem 0;overflow:hidden}.md-sidebar[data-md-state=lock]{position:fixed;top:2.4rem}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .2rem;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}@-webkit-keyframes md-source__facts--done{0%{height:0}to{height:.65rem}}@keyframes md-source__facts--done{0%{height:0}to{height:.65rem}}@-webkit-keyframes md-source__fact--done{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes md-source__fact--done{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;padding-right:.6rem;transition:opacity .25s;font-size:.65rem;line-height:1.2;white-space:nowrap}[dir=rtl] .md-source{padding-right:0;padding-left:.6rem}.md-source:hover{opacity:.7}.md-source:after{display:inline-block;height:2.4rem;content:"";vertical-align:middle}.md-source__icon{display:inline-block;width:2.4rem;height:2.4rem;content:"";vertical-align:middle}.md-source__icon svg{width:1.2rem;height:1.2rem;margin-top:.6rem;margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem;margin-left:0}.md-source__icon+.md-source__repository{margin-left:-2.2rem;padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2.2rem;margin-left:0;padding-right:2rem;padding-left:0}.md-source__repository{display:inline-block;max-width:100%;margin-left:.6rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:.55rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:md-source__facts--done .25s ease-in;animation:md-source__facts--done .25s ease-in}.md-source__fact{float:left}[dir=rtl] .md-source__fact{float:right}[data-md-state=done] .md-source__fact{-webkit-animation:md-source__fact--done .4s ease-out;animation:md-source__fact--done .4s ease-out}.md-source__fact:before{margin:0 .1rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.md-source-file{display:inline-block;margin:1em .5em 1em 0;padding-right:.25rem;border-radius:.1rem;background-color:rgba(0,0,0,.07);font-size:.64rem;list-style-type:none;cursor:pointer;overflow:hidden}.md-source-file:before{display:inline-block;margin-right:.25rem;padding:.25rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:.8rem;content:"\E86F";vertical-align:middle}html .md-source-file{transition:background .4s,color .4s,box-shadow .4s cubic-bezier(.4,0,.2,1)}html .md-source-file:before{transition:inherit}html body .md-typeset .md-source-file{color:rgba(0,0,0,.54)}.md-source-file:hover{box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36)}.md-source-file:hover:before{background-color:#536dfe}.md-tabs{width:100%;transition:background .25s;background-color:#3f51b5;color:#fff;overflow:auto}.md-tabs__list{margin:0 0 0 .2rem;padding:0;list-style:none;white-space:nowrap}.md-tabs__item{display:inline-block;height:2.4rem;padding-right:.6rem;padding-left:.6rem}.md-tabs__link{display:block;margin-top:.8rem;transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);font-size:.7rem;opacity:.7}.md-tabs__link--active,.md-tabs__link:hover{color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:.02s}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:.04s}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:.06s}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:.08s}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[data-md-state=hidden]{pointer-events:none}.md-tabs[data-md-state=hidden] .md-tabs__link{-webkit-transform:translateY(50%);transform:translateY(50%);transition:color .25s,opacity .1s,-webkit-transform 0s .4s;transition:color .25s,transform 0s .4s,opacity .1s;transition:color .25s,transform 0s .4s,opacity .1s,-webkit-transform 0s .4s;opacity:0}.md-typeset .admonition,.md-typeset details{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:relative;margin:1.5625em 0;padding:0 .6rem;border-left:.2rem solid #448aff;border-radius:.1rem;font-size:.64rem;overflow:auto}[dir=rtl] .md-typeset .admonition,[dir=rtl] .md-typeset details{border-right:.2rem solid #448aff;border-left:none}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin:1em 0}.md-typeset .admonition>.admonition-title,.md-typeset .admonition>summary,.md-typeset details>.admonition-title,.md-typeset details>summary{margin:0 -.6rem;padding:.4rem .6rem .4rem 2rem;border-bottom:.05rem solid rgba(68,138,255,.1);background-color:rgba(68,138,255,.1);font-weight:700}[dir=rtl] .md-typeset .admonition>.admonition-title,[dir=rtl] .md-typeset .admonition>summary,[dir=rtl] .md-typeset details>.admonition-title,[dir=rtl] .md-typeset details>summary{padding:.4rem 2rem .4rem .6rem}.md-typeset .admonition>.admonition-title:last-child,.md-typeset .admonition>summary:last-child,.md-typeset details>.admonition-title:last-child,.md-typeset details>summary:last-child{margin-bottom:0}.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before{position:absolute;left:.6rem;color:#448aff;font-size:1rem;content:"\E3C9"}[dir=rtl] .md-typeset .admonition>.admonition-title:before,[dir=rtl] .md-typeset .admonition>summary:before,[dir=rtl] .md-typeset details>.admonition-title:before,[dir=rtl] .md-typeset details>summary:before{right:.6rem;left:auto}.md-typeset .admonition.abstract,.md-typeset .admonition.summary,.md-typeset .admonition.tldr,.md-typeset details.abstract,.md-typeset details.summary,.md-typeset details.tldr{border-left-color:#00b0ff}[dir=rtl] .md-typeset .admonition.abstract,[dir=rtl] .md-typeset .admonition.summary,[dir=rtl] .md-typeset .admonition.tldr,[dir=rtl] .md-typeset details.abstract,[dir=rtl] .md-typeset details.summary,[dir=rtl] .md-typeset details.tldr{border-right-color:#00b0ff}.md-typeset .admonition.abstract>.admonition-title,.md-typeset .admonition.abstract>summary,.md-typeset .admonition.summary>.admonition-title,.md-typeset .admonition.summary>summary,.md-typeset .admonition.tldr>.admonition-title,.md-typeset .admonition.tldr>summary,.md-typeset details.abstract>.admonition-title,.md-typeset details.abstract>summary,.md-typeset details.summary>.admonition-title,.md-typeset details.summary>summary,.md-typeset details.tldr>.admonition-title,.md-typeset details.tldr>summary{border-bottom-color:.05rem solid rgba(0,176,255,.1);background-color:rgba(0,176,255,.1)}.md-typeset .admonition.abstract>.admonition-title:before,.md-typeset .admonition.abstract>summary:before,.md-typeset .admonition.summary>.admonition-title:before,.md-typeset .admonition.summary>summary:before,.md-typeset .admonition.tldr>.admonition-title:before,.md-typeset .admonition.tldr>summary:before,.md-typeset details.abstract>.admonition-title:before,.md-typeset details.abstract>summary:before,.md-typeset details.summary>.admonition-title:before,.md-typeset details.summary>summary:before,.md-typeset details.tldr>.admonition-title:before,.md-typeset details.tldr>summary:before{color:#00b0ff;content:""}.md-typeset .admonition.info,.md-typeset .admonition.todo,.md-typeset details.info,.md-typeset details.todo{border-left-color:#00b8d4}[dir=rtl] .md-typeset .admonition.info,[dir=rtl] .md-typeset .admonition.todo,[dir=rtl] .md-typeset details.info,[dir=rtl] .md-typeset details.todo{border-right-color:#00b8d4}.md-typeset .admonition.info>.admonition-title,.md-typeset .admonition.info>summary,.md-typeset .admonition.todo>.admonition-title,.md-typeset .admonition.todo>summary,.md-typeset details.info>.admonition-title,.md-typeset details.info>summary,.md-typeset details.todo>.admonition-title,.md-typeset details.todo>summary{border-bottom-color:.05rem solid rgba(0,184,212,.1);background-color:rgba(0,184,212,.1)}.md-typeset .admonition.info>.admonition-title:before,.md-typeset .admonition.info>summary:before,.md-typeset .admonition.todo>.admonition-title:before,.md-typeset .admonition.todo>summary:before,.md-typeset details.info>.admonition-title:before,.md-typeset details.info>summary:before,.md-typeset details.todo>.admonition-title:before,.md-typeset details.todo>summary:before{color:#00b8d4;content:""}.md-typeset .admonition.hint,.md-typeset .admonition.important,.md-typeset .admonition.tip,.md-typeset details.hint,.md-typeset details.important,.md-typeset details.tip{border-left-color:#00bfa5}[dir=rtl] .md-typeset .admonition.hint,[dir=rtl] .md-typeset .admonition.important,[dir=rtl] .md-typeset .admonition.tip,[dir=rtl] .md-typeset details.hint,[dir=rtl] .md-typeset details.important,[dir=rtl] .md-typeset details.tip{border-right-color:#00bfa5}.md-typeset .admonition.hint>.admonition-title,.md-typeset .admonition.hint>summary,.md-typeset .admonition.important>.admonition-title,.md-typeset .admonition.important>summary,.md-typeset .admonition.tip>.admonition-title,.md-typeset .admonition.tip>summary,.md-typeset details.hint>.admonition-title,.md-typeset details.hint>summary,.md-typeset details.important>.admonition-title,.md-typeset details.important>summary,.md-typeset details.tip>.admonition-title,.md-typeset details.tip>summary{border-bottom-color:.05rem solid rgba(0,191,165,.1);background-color:rgba(0,191,165,.1)}.md-typeset .admonition.hint>.admonition-title:before,.md-typeset .admonition.hint>summary:before,.md-typeset .admonition.important>.admonition-title:before,.md-typeset .admonition.important>summary:before,.md-typeset .admonition.tip>.admonition-title:before,.md-typeset .admonition.tip>summary:before,.md-typeset details.hint>.admonition-title:before,.md-typeset details.hint>summary:before,.md-typeset details.important>.admonition-title:before,.md-typeset details.important>summary:before,.md-typeset details.tip>.admonition-title:before,.md-typeset details.tip>summary:before{color:#00bfa5;content:""}.md-typeset .admonition.check,.md-typeset .admonition.done,.md-typeset .admonition.success,.md-typeset details.check,.md-typeset details.done,.md-typeset details.success{border-left-color:#00c853}[dir=rtl] .md-typeset .admonition.check,[dir=rtl] .md-typeset .admonition.done,[dir=rtl] .md-typeset .admonition.success,[dir=rtl] .md-typeset details.check,[dir=rtl] .md-typeset details.done,[dir=rtl] .md-typeset details.success{border-right-color:#00c853}.md-typeset .admonition.check>.admonition-title,.md-typeset .admonition.check>summary,.md-typeset .admonition.done>.admonition-title,.md-typeset .admonition.done>summary,.md-typeset .admonition.success>.admonition-title,.md-typeset .admonition.success>summary,.md-typeset details.check>.admonition-title,.md-typeset details.check>summary,.md-typeset details.done>.admonition-title,.md-typeset details.done>summary,.md-typeset details.success>.admonition-title,.md-typeset details.success>summary{border-bottom-color:.05rem solid rgba(0,200,83,.1);background-color:rgba(0,200,83,.1)}.md-typeset .admonition.check>.admonition-title:before,.md-typeset .admonition.check>summary:before,.md-typeset .admonition.done>.admonition-title:before,.md-typeset .admonition.done>summary:before,.md-typeset .admonition.success>.admonition-title:before,.md-typeset .admonition.success>summary:before,.md-typeset details.check>.admonition-title:before,.md-typeset details.check>summary:before,.md-typeset details.done>.admonition-title:before,.md-typeset details.done>summary:before,.md-typeset details.success>.admonition-title:before,.md-typeset details.success>summary:before{color:#00c853;content:""}.md-typeset .admonition.faq,.md-typeset .admonition.help,.md-typeset .admonition.question,.md-typeset details.faq,.md-typeset details.help,.md-typeset details.question{border-left-color:#64dd17}[dir=rtl] .md-typeset .admonition.faq,[dir=rtl] .md-typeset .admonition.help,[dir=rtl] .md-typeset .admonition.question,[dir=rtl] .md-typeset details.faq,[dir=rtl] .md-typeset details.help,[dir=rtl] .md-typeset details.question{border-right-color:#64dd17}.md-typeset .admonition.faq>.admonition-title,.md-typeset .admonition.faq>summary,.md-typeset .admonition.help>.admonition-title,.md-typeset .admonition.help>summary,.md-typeset .admonition.question>.admonition-title,.md-typeset .admonition.question>summary,.md-typeset details.faq>.admonition-title,.md-typeset details.faq>summary,.md-typeset details.help>.admonition-title,.md-typeset details.help>summary,.md-typeset details.question>.admonition-title,.md-typeset details.question>summary{border-bottom-color:.05rem solid rgba(100,221,23,.1);background-color:rgba(100,221,23,.1)}.md-typeset .admonition.faq>.admonition-title:before,.md-typeset .admonition.faq>summary:before,.md-typeset .admonition.help>.admonition-title:before,.md-typeset .admonition.help>summary:before,.md-typeset .admonition.question>.admonition-title:before,.md-typeset .admonition.question>summary:before,.md-typeset details.faq>.admonition-title:before,.md-typeset details.faq>summary:before,.md-typeset details.help>.admonition-title:before,.md-typeset details.help>summary:before,.md-typeset details.question>.admonition-title:before,.md-typeset details.question>summary:before{color:#64dd17;content:""}.md-typeset .admonition.attention,.md-typeset .admonition.caution,.md-typeset .admonition.warning,.md-typeset details.attention,.md-typeset details.caution,.md-typeset details.warning{border-left-color:#ff9100}[dir=rtl] .md-typeset .admonition.attention,[dir=rtl] .md-typeset .admonition.caution,[dir=rtl] .md-typeset .admonition.warning,[dir=rtl] .md-typeset details.attention,[dir=rtl] .md-typeset details.caution,[dir=rtl] .md-typeset details.warning{border-right-color:#ff9100}.md-typeset .admonition.attention>.admonition-title,.md-typeset .admonition.attention>summary,.md-typeset .admonition.caution>.admonition-title,.md-typeset .admonition.caution>summary,.md-typeset .admonition.warning>.admonition-title,.md-typeset .admonition.warning>summary,.md-typeset details.attention>.admonition-title,.md-typeset details.attention>summary,.md-typeset details.caution>.admonition-title,.md-typeset details.caution>summary,.md-typeset details.warning>.admonition-title,.md-typeset details.warning>summary{border-bottom-color:.05rem solid rgba(255,145,0,.1);background-color:rgba(255,145,0,.1)}.md-typeset .admonition.attention>.admonition-title:before,.md-typeset .admonition.attention>summary:before,.md-typeset .admonition.caution>.admonition-title:before,.md-typeset .admonition.caution>summary:before,.md-typeset .admonition.warning>.admonition-title:before,.md-typeset .admonition.warning>summary:before,.md-typeset details.attention>.admonition-title:before,.md-typeset details.attention>summary:before,.md-typeset details.caution>.admonition-title:before,.md-typeset details.caution>summary:before,.md-typeset details.warning>.admonition-title:before,.md-typeset details.warning>summary:before{color:#ff9100;content:""}.md-typeset .admonition.fail,.md-typeset .admonition.failure,.md-typeset .admonition.missing,.md-typeset details.fail,.md-typeset details.failure,.md-typeset details.missing{border-left-color:#ff5252}[dir=rtl] .md-typeset .admonition.fail,[dir=rtl] .md-typeset .admonition.failure,[dir=rtl] .md-typeset .admonition.missing,[dir=rtl] .md-typeset details.fail,[dir=rtl] .md-typeset details.failure,[dir=rtl] .md-typeset details.missing{border-right-color:#ff5252}.md-typeset .admonition.fail>.admonition-title,.md-typeset .admonition.fail>summary,.md-typeset .admonition.failure>.admonition-title,.md-typeset .admonition.failure>summary,.md-typeset .admonition.missing>.admonition-title,.md-typeset .admonition.missing>summary,.md-typeset details.fail>.admonition-title,.md-typeset details.fail>summary,.md-typeset details.failure>.admonition-title,.md-typeset details.failure>summary,.md-typeset details.missing>.admonition-title,.md-typeset details.missing>summary{border-bottom-color:.05rem solid rgba(255,82,82,.1);background-color:rgba(255,82,82,.1)}.md-typeset .admonition.fail>.admonition-title:before,.md-typeset .admonition.fail>summary:before,.md-typeset .admonition.failure>.admonition-title:before,.md-typeset .admonition.failure>summary:before,.md-typeset .admonition.missing>.admonition-title:before,.md-typeset .admonition.missing>summary:before,.md-typeset details.fail>.admonition-title:before,.md-typeset details.fail>summary:before,.md-typeset details.failure>.admonition-title:before,.md-typeset details.failure>summary:before,.md-typeset details.missing>.admonition-title:before,.md-typeset details.missing>summary:before{color:#ff5252;content:""}.md-typeset .admonition.danger,.md-typeset .admonition.error,.md-typeset details.danger,.md-typeset details.error{border-left-color:#ff1744}[dir=rtl] .md-typeset .admonition.danger,[dir=rtl] .md-typeset .admonition.error,[dir=rtl] .md-typeset details.danger,[dir=rtl] .md-typeset details.error{border-right-color:#ff1744}.md-typeset .admonition.danger>.admonition-title,.md-typeset .admonition.danger>summary,.md-typeset .admonition.error>.admonition-title,.md-typeset .admonition.error>summary,.md-typeset details.danger>.admonition-title,.md-typeset details.danger>summary,.md-typeset details.error>.admonition-title,.md-typeset details.error>summary{border-bottom-color:.05rem solid rgba(255,23,68,.1);background-color:rgba(255,23,68,.1)}.md-typeset .admonition.danger>.admonition-title:before,.md-typeset .admonition.danger>summary:before,.md-typeset .admonition.error>.admonition-title:before,.md-typeset .admonition.error>summary:before,.md-typeset details.danger>.admonition-title:before,.md-typeset details.danger>summary:before,.md-typeset details.error>.admonition-title:before,.md-typeset details.error>summary:before{color:#ff1744;content:""}.md-typeset .admonition.bug,.md-typeset details.bug{border-left-color:#f50057}[dir=rtl] .md-typeset .admonition.bug,[dir=rtl] .md-typeset details.bug{border-right-color:#f50057}.md-typeset .admonition.bug>.admonition-title,.md-typeset .admonition.bug>summary,.md-typeset details.bug>.admonition-title,.md-typeset details.bug>summary{border-bottom-color:.05rem solid rgba(245,0,87,.1);background-color:rgba(245,0,87,.1)}.md-typeset .admonition.bug>.admonition-title:before,.md-typeset .admonition.bug>summary:before,.md-typeset details.bug>.admonition-title:before,.md-typeset details.bug>summary:before{color:#f50057;content:""}.md-typeset .admonition.example,.md-typeset details.example{border-left-color:#651fff}[dir=rtl] .md-typeset .admonition.example,[dir=rtl] .md-typeset details.example{border-right-color:#651fff}.md-typeset .admonition.example>.admonition-title,.md-typeset .admonition.example>summary,.md-typeset details.example>.admonition-title,.md-typeset details.example>summary{border-bottom-color:.05rem solid rgba(101,31,255,.1);background-color:rgba(101,31,255,.1)}.md-typeset .admonition.example>.admonition-title:before,.md-typeset .admonition.example>summary:before,.md-typeset details.example>.admonition-title:before,.md-typeset details.example>summary:before{color:#651fff;content:""}.md-typeset .admonition.cite,.md-typeset .admonition.quote,.md-typeset details.cite,.md-typeset details.quote{border-left-color:#9e9e9e}[dir=rtl] .md-typeset .admonition.cite,[dir=rtl] .md-typeset .admonition.quote,[dir=rtl] .md-typeset details.cite,[dir=rtl] .md-typeset details.quote{border-right-color:#9e9e9e}.md-typeset .admonition.cite>.admonition-title,.md-typeset .admonition.cite>summary,.md-typeset .admonition.quote>.admonition-title,.md-typeset .admonition.quote>summary,.md-typeset details.cite>.admonition-title,.md-typeset details.cite>summary,.md-typeset details.quote>.admonition-title,.md-typeset details.quote>summary{border-bottom-color:.05rem solid hsla(0,0%,62%,.1);background-color:hsla(0,0%,62%,.1)}.md-typeset .admonition.cite>.admonition-title:before,.md-typeset .admonition.cite>summary:before,.md-typeset .admonition.quote>.admonition-title:before,.md-typeset .admonition.quote>summary:before,.md-typeset details.cite>.admonition-title:before,.md-typeset details.cite>summary:before,.md-typeset details.quote>.admonition-title:before,.md-typeset details.quote>summary:before{color:#9e9e9e;content:""}.codehilite .o,.codehilite .ow,.md-typeset .highlight .o,.md-typeset .highlight .ow{color:inherit}.codehilite .ge,.md-typeset .highlight .ge{color:#000}.codehilite .gr,.md-typeset .highlight .gr{color:#a00}.codehilite .gh,.md-typeset .highlight .gh{color:#999}.codehilite .go,.md-typeset .highlight .go{color:#888}.codehilite .gp,.md-typeset .highlight .gp{color:#555}.codehilite .gs,.md-typeset .highlight .gs{color:inherit}.codehilite .gu,.md-typeset .highlight .gu{color:#aaa}.codehilite .gt,.md-typeset .highlight .gt{color:#a00}.codehilite .gd,.md-typeset .highlight .gd{background-color:#fdd}.codehilite .gi,.md-typeset .highlight .gi{background-color:#dfd}.codehilite .k,.md-typeset .highlight .k{color:#3b78e7}.codehilite .kc,.md-typeset .highlight .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn,.md-typeset .highlight .kd,.md-typeset .highlight .kn{color:#3b78e7}.codehilite .kp,.md-typeset .highlight .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt,.md-typeset .highlight .kr,.md-typeset .highlight .kt{color:#3e61a2}.codehilite .c,.codehilite .cm,.md-typeset .highlight .c,.md-typeset .highlight .cm{color:#999}.codehilite .cp,.md-typeset .highlight .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs,.md-typeset .highlight .c1,.md-typeset .highlight .ch,.md-typeset .highlight .cs{color:#999}.codehilite .na,.codehilite .nb,.md-typeset .highlight .na,.md-typeset .highlight .nb{color:#c2185b}.codehilite .bp,.md-typeset .highlight .bp{color:#3e61a2}.codehilite .nc,.md-typeset .highlight .nc{color:#c2185b}.codehilite .no,.md-typeset .highlight .no{color:#3e61a2}.codehilite .nd,.codehilite .ni,.md-typeset .highlight .nd,.md-typeset .highlight .ni{color:#666}.codehilite .ne,.codehilite .nf,.md-typeset .highlight .ne,.md-typeset .highlight .nf{color:#c2185b}.codehilite .nl,.md-typeset .highlight .nl{color:#3b5179}.codehilite .nn,.md-typeset .highlight .nn{color:#ec407a}.codehilite .nt,.md-typeset .highlight .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi,.md-typeset .highlight .nv,.md-typeset .highlight .vc,.md-typeset .highlight .vg,.md-typeset .highlight .vi{color:#3e61a2}.codehilite .nx,.md-typeset .highlight .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo,.md-typeset .highlight .il,.md-typeset .highlight .m,.md-typeset .highlight .mf,.md-typeset .highlight .mh,.md-typeset .highlight .mi,.md-typeset .highlight .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc,.md-typeset .highlight .s,.md-typeset .highlight .sb,.md-typeset .highlight .sc{color:#0d904f}.codehilite .sd,.md-typeset .highlight .sd{color:#999}.codehilite .s2,.md-typeset .highlight .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx,.md-typeset .highlight .se,.md-typeset .highlight .sh,.md-typeset .highlight .si,.md-typeset .highlight .sx{color:#183691}.codehilite .sr,.md-typeset .highlight .sr{color:#009926}.codehilite .s1,.codehilite .ss,.md-typeset .highlight .s1,.md-typeset .highlight .ss{color:#0d904f}.codehilite .err,.md-typeset .highlight .err{color:#a61717}.codehilite .w,.md-typeset .highlight .w{color:transparent}.codehilite .hll,.md-typeset .highlight .hll{display:block;margin:0 -.6rem;padding:0 .6rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite,.md-typeset .highlight{position:relative;margin:1em 0;padding:0;border-radius:.1rem;background-color:hsla(0,0%,92.5%,.5);color:#37474f;line-height:1.4;-webkit-overflow-scrolling:touch}.md-typeset .codehilite code,.md-typeset .codehilite pre,.md-typeset .highlight code,.md-typeset .highlight pre{display:block;margin:0;padding:.525rem .6rem;background-color:transparent;overflow:auto;vertical-align:top}.md-typeset .codehilite code::-webkit-scrollbar,.md-typeset .codehilite pre::-webkit-scrollbar,.md-typeset .highlight code::-webkit-scrollbar,.md-typeset .highlight pre::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset .codehilite code::-webkit-scrollbar-thumb,.md-typeset .codehilite pre::-webkit-scrollbar-thumb,.md-typeset .highlight code::-webkit-scrollbar-thumb,.md-typeset .highlight pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite code::-webkit-scrollbar-thumb:hover,.md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,.md-typeset .highlight code::-webkit-scrollbar-thumb:hover,.md-typeset .highlight pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre.codehilite,.md-typeset pre.highlight{overflow:visible}.md-typeset pre.codehilite code,.md-typeset pre.highlight code{display:block;padding:.525rem .6rem;overflow:auto}.md-typeset .codehilitetable,.md-typeset .highlighttable{display:block;margin:1em 0;border-radius:.2em;font-size:.8rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td,.md-typeset .highlighttable tbody,.md-typeset .highlighttable td{display:block;padding:0}.md-typeset .codehilitetable tr,.md-typeset .highlighttable tr{display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .highlight,.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .codehilite,.md-typeset .highlighttable .highlight,.md-typeset .highlighttable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .linenodiv{padding:.525rem .6rem}.md-typeset .codehilitetable .linenos,.md-typeset .highlighttable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre,.md-typeset .highlighttable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code,.md-typeset .highlighttable .code{flex:1;overflow:hidden}.md-typeset>.codehilitetable,.md-typeset>.highlighttable{box-shadow:none}.md-typeset [id^="fnref:"]{display:inline-block}.md-typeset [id^="fnref:"]:target{margin-top:-3.8rem;padding-top:3.8rem;pointer-events:none}.md-typeset [id^="fn:"]:before{display:none;height:0;content:""}.md-typeset [id^="fn:"]:target:before{display:block;margin-top:-3.5rem;padding-top:3.5rem;pointer-events:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:.64rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{transition:color .25s}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-ref{display:inline-block;pointer-events:auto}.md-typeset .footnote-ref:before{display:inline;margin:0 .2em;border-left:.05rem solid rgba(0,0,0,.26);font-size:1.25em;content:"";vertical-align:-.25rem}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.25rem);transform:translateX(.25rem);transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}[dir=rtl] .md-typeset .footnote-backref{-webkit-transform:translateX(-.25rem);transform:translateX(-.25rem)}.md-typeset .footnote-backref:before{display:inline-block;font-size:.8rem;content:"\E31B"}[dir=rtl] .md-typeset .footnote-backref:before{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.md-typeset .headerlink{display:inline-block;margin-left:.5rem;-webkit-transform:translateY(.25rem);transform:translateY(.25rem);transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem;margin-left:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset h1[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h1[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink,.md-typeset h1[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink:hover,.md-typeset h1[id]:target .headerlink{color:#536dfe}.md-typeset h2[id]:before{display:block;margin-top:-8px;padding-top:8px;content:""}.md-typeset h2[id]:target:before{margin-top:-3.4rem;padding-top:3.4rem}.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink,.md-typeset h2[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink:hover,.md-typeset h2[id]:target .headerlink{color:#536dfe}.md-typeset h3[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h3[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink,.md-typeset h3[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink:hover,.md-typeset h3[id]:target .headerlink{color:#536dfe}.md-typeset h4[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h4[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink,.md-typeset h4[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink:hover,.md-typeset h4[id]:target .headerlink{color:#536dfe}.md-typeset h5[id]:before{display:block;margin-top:-11px;padding-top:11px;content:""}.md-typeset h5[id]:target:before{margin-top:-3.55rem;padding-top:3.55rem}.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink,.md-typeset h5[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink:hover,.md-typeset h5[id]:target .headerlink{color:#536dfe}.md-typeset h6[id]:before{display:block;margin-top:-11px;padding-top:11px;content:""}.md-typeset h6[id]:target:before{margin-top:-3.55rem;padding-top:3.55rem}.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink,.md-typeset h6[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink:hover,.md-typeset h6[id]:target .headerlink{color:#536dfe}.md-typeset .MJXc-display{margin:.75em 0;padding:.75em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .critic.comment,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,92.5%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,92.5%,.5),-.25em 0 0 hsla(0,0%,92.5%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"\E0B7";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:.8rem;padding-left:.8rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset details{display:block;padding-top:0}.md-typeset details[open]>summary:after{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.md-typeset details:not([open]){padding-bottom:0}.md-typeset details:not([open])>summary{border-bottom:none}.md-typeset details summary{padding-right:2rem}[dir=rtl] .md-typeset details summary{padding-left:2rem}.no-details .md-typeset details:not([open])>*{display:none}.no-details .md-typeset details:not([open]) summary{display:block}.md-typeset summary{display:block;outline:none;cursor:pointer}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset summary:after{position:absolute;top:.4rem;right:.6rem;color:rgba(0,0,0,.26);font-size:1rem;content:"\E313"}[dir=rtl] .md-typeset summary:after{right:auto;left:.6rem}.md-typeset .emojione{width:1rem;vertical-align:text-top}.md-typeset code.codehilite,.md-typeset code.highlight{margin:0 .29412em;padding:.07353em 0}.md-typeset .superfences-content{display:none;order:99;width:100%;background-color:#fff}.md-typeset .superfences-content>*{margin:0;border-radius:0}.md-typeset .superfences-tabs{display:flex;position:relative;flex-wrap:wrap;margin:1em 0;border:.05rem solid rgba(0,0,0,.07);border-radius:.2em}.md-typeset .superfences-tabs>input{display:none}.md-typeset .superfences-tabs>input:checked+label{font-weight:700}.md-typeset .superfences-tabs>input:checked+label+.superfences-content{display:block}.md-typeset .superfences-tabs>label{width:auto;padding:.6rem;transition:color .125s;font-size:.64rem;cursor:pointer}html .md-typeset .superfences-tabs>label:hover{color:#536dfe}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em;left:auto}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.15em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.25em;content:"\E835";vertical-align:-.25em}[dir=rtl] .md-typeset .task-list-control .task-list-indicator:before{right:-1.25em;left:auto}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"\E834"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code,.md-typeset pre{white-space:pre-wrap}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-clipboard,.md-content__icon,.md-footer,.md-header,.md-sidebar,.md-tabs,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -.8rem;border-radius:0}.md-typeset pre>code{padding:.525rem .8rem}.md-footer-nav__link--prev .md-footer-nav__title{display:none}.md-search-result__teaser{max-height:2.5rem;-webkit-line-clamp:3}.codehilite .hll,.md-typeset .highlight .hll{margin:0 -.8rem;padding:0 .8rem}.md-typeset>.codehilite,.md-typeset>.highlight{margin:1em -.8rem;border-radius:0}.md-typeset>.codehilite code,.md-typeset>.codehilite pre,.md-typeset>.highlight code,.md-typeset>.highlight pre{padding:.525rem .8rem}.md-typeset>.codehilitetable,.md-typeset>.highlighttable{margin:1em -.8rem;border-radius:0}.md-typeset>.codehilitetable .codehilite>code,.md-typeset>.codehilitetable .codehilite>pre,.md-typeset>.codehilitetable .highlight>code,.md-typeset>.codehilitetable .highlight>pre,.md-typeset>.codehilitetable .linenodiv,.md-typeset>.highlighttable .codehilite>code,.md-typeset>.highlighttable .codehilite>pre,.md-typeset>.highlighttable .highlight>code,.md-typeset>.highlighttable .highlight>pre,.md-typeset>.highlighttable .linenodiv{padding:.5rem .8rem}.md-typeset>p>.MJXc-display{margin:.75em -.8rem;padding:.25em .8rem}.md-typeset>.superfences-tabs{margin:1em -.8rem;border:0;border-top:.05rem solid rgba(0,0,0,.07);border-radius:0}.md-typeset>.superfences-tabs code,.md-typeset>.superfences-tabs pre{padding:.525rem .8rem}}@media only screen and (min-width:100em){html{font-size:137.5%}}@media only screen and (min-width:125em){html{font-size:150%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}html .md-nav__link[for=__toc]{display:block;padding-right:2.4rem}html .md-nav__link[for=__toc]:after{color:inherit;content:"\E8DE"}html .md-nav__link[for=__toc]+.md-nav__link{display:none}html .md-nav__link[for=__toc]~.md-nav{display:flex}html [dir=rtl] .md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav__source{display:block;padding:0 .2rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{position:absolute;top:.2rem;left:.2rem;width:1.8rem;height:1.8rem;-webkit-transform-origin:center;transform-origin:center;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:1rem;background-color:#fff;overflow:hidden;pointer-events:none}[dir=rtl] .md-search__overlay{right:.2rem;left:auto}[data-md-toggle=search]:checked~.md-header .md-search__overlay{transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;width:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);transition:right 0s .3s,left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);transition:right 0s 0s,left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}[dir=rtl] [data-md-toggle=search]:checked~.md-header .md-search__inner{right:0;left:auto}html [dir=rtl] .md-search__inner{right:100%;left:auto;-webkit-transform:translateX(-5%);transform:translateX(-5%)}.md-search__input{width:100%;height:2.4rem;font-size:.9rem}.md-search__icon[for=__search]{top:.6rem;left:.8rem}.md-search__icon[for=__search][for=__search]:before{content:"\E5C4"}[dir=rtl] .md-search__icon[for=__search][for=__search]:before{content:"\E5C8"}.md-search__icon[type=reset]{top:.6rem;right:.8rem}.md-search__output{top:2.4rem;bottom:0}.md-search-result__article--document:before{display:none}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-hero__inner{margin-top:2.4rem;margin-bottom:1.2rem}.md-nav{background-color:#fff}.md-nav--primary,.md-nav--primary .md-nav{display:flex;position:absolute;top:0;right:0;left:0;flex-direction:column;height:100%;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:5.6rem;padding:3rem .8rem .2rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:2.4rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.2rem;left:.2rem;width:2rem;height:2rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background-color:#fff;box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.2rem;left:.2rem;width:3.2rem;height:3.2rem;font-size:2.4rem}html .md-nav--primary .md-nav__title--site:before{display:none}html [dir=rtl] .md-nav--primary .md-nav__title:before{right:.2rem;left:auto}html [dir=rtl] .md-nav--primary .md-nav__title--site .md-nav__button{right:.2rem;left:auto}.md-nav--primary .md-nav__list{flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.05rem solid rgba(0,0,0,.07)}[dir=rtl] .md-nav--primary .md-nav__item{padding:0}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:2.4rem}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"\E315"}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"\E314"}.md-nav--primary .md-nav__link{position:relative;margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:.6rem;margin-top:-.6rem;color:inherit;font-size:1.2rem}[dir=rtl] .md-nav--primary .md-nav__link:after{right:auto;left:.6rem}.md-nav--primary .md-nav--secondary .md-nav__link{position:static}.md-nav--primary .md-nav--secondary .md-nav{position:static;background-color:transparent}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem;padding-left:0}.md-nav__toggle~.md-nav{display:flex;-webkit-transform:translateX(100%);transform:translateX(100%);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}[dir=rtl] .md-nav__toggle~.md-nav{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.no-csstransforms3d .md-nav__toggle~.md-nav{display:none}.md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.no-csstransforms3d .md-nav__toggle:checked~.md-nav{display:flex}.md-sidebar--primary{position:fixed;top:0;left:-12.1rem;width:12.1rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:3}[dir=rtl] .md-sidebar--primary{right:-12.1rem;left:auto}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(12.1rem);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{-webkit-transform:translateX(-12.1rem);transform:translateX(-12.1rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}.md-tabs{display:none}}@media only screen and (min-width:60em){.md-content{margin-right:12.1rem}[dir=rtl] .md-content{margin-right:0;margin-left:12.1rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:11.5rem;max-width:11.5rem;margin-left:1.4rem;padding-right:.6rem}[dir=rtl] .md-header-nav__source{margin-right:1.4rem;margin-left:0;padding-right:0;padding-left:.6rem}.md-search{padding:.2rem}.md-search__overlay{position:fixed;top:0;left:0;width:0;height:0;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);cursor:pointer}[dir=rtl] .md-search__overlay{right:0;left:auto}[data-md-toggle=search]:checked~.md-header .md-search__overlay{width:100%;height:100%;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-search__inner{position:relative;width:11.5rem;padding:.1rem 0;float:right;transition:width .25s cubic-bezier(.1,.7,.1,1)}[dir=rtl] .md-search__inner{float:left}.md-search__form,.md-search__input{border-radius:.1rem}.md-search__input{width:100%;height:1.8rem;padding-left:2.2rem;transition:background-color .25s cubic-bezier(.1,.7,.1,1),color .25s cubic-bezier(.1,.7,.1,1);background-color:rgba(0,0,0,.26);color:inherit;font-size:.8rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input+.md-search__icon{color:inherit}.md-search__input::-webkit-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input:-ms-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input::-ms-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input::placeholder{color:hsla(0,0%,100%,.7)}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.1rem .1rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:none}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:1.9rem;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem;padding-left:0}.md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem;padding-left:.8rem}.md-sidebar--secondary{display:block;margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}[dir=rtl] .md-sidebar--secondary{margin-right:100%;margin-left:0;-webkit-transform:translate(100%);transform:translate(100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:12.1rem}[dir=rtl] .md-content{margin-right:12.1rem}.md-content__inner{margin-right:1.2rem;margin-left:1.2rem}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.no-js .md-nav__toggle~.md-nav{display:none}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.no-js .md-nav[data-md-state=expand],.no-js .md-nav__toggle:checked~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}.md-search__scrollwrap{width:34.4rem}.md-sidebar--secondary{margin-left:61rem}[dir=rtl] .md-sidebar--secondary{margin-right:61rem;margin-left:0}.md-tabs~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{font-size:0;visibility:hidden}.md-tabs--active~.md-main .md-nav--primary .md-nav__title{display:block;padding:0}.md-tabs--active~.md-main .md-nav--primary .md-nav__title--site{display:none}.no-js .md-tabs--active~.md-main .md-nav--primary .md-nav{display:block}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item{font-size:0;visibility:hidden}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{display:none;font-size:.7rem;overflow:auto;visibility:visible}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active{display:block}.md-tabs--active~.md-main .md-nav[data-md-level="1"]{max-height:none;overflow:visible}.md-tabs--active~.md-main .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:0}.md-tabs--active~.md-main .md-nav[data-md-level="1"] .md-nav .md-nav__title{display:none}}@media only screen and (min-width:45em){.md-footer-nav__link{width:50%}.md-footer-copyright{max-width:75%;float:left}[dir=rtl] .md-footer-copyright{float:right}.md-footer-social{padding:.6rem 0;float:right}[dir=rtl] .md-footer-social{float:left}}@media only screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}.md-search__scrollwrap{width:23.4rem}.md-search-result__teaser{max-height:2.5rem;-webkit-line-clamp:3}}
\ No newline at end of file
diff --git a/docs/basicusage.html b/docs/basicusage.html
index 9daa426..5b1300f 100644
--- a/docs/basicusage.html
+++ b/docs/basicusage.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,81 +229,6 @@
-
-
-
-
-
-
-
+
diff --git a/docs/changelog.html b/docs/changelog.html
index 2b30b9e..a2c184e 100644
--- a/docs/changelog.html
+++ b/docs/changelog.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -139,7 +139,7 @@
-
+
Skip to content
@@ -229,81 +229,6 @@
-
-
-
-
-
-
-
+
diff --git a/docs/credit.html b/docs/credit.html
new file mode 100644
index 0000000..0dadaae
--- /dev/null
+++ b/docs/credit.html
@@ -0,0 +1,1185 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Saved credentail access - AutoConnect for ESP8266/ESP32
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Saved credentail access
+
+ Saved credential in EEPROM
+AutoConnect stores the established WiFi connection in the EEPROM of the ESP8266/ESP32 module and equips the class to access it from the sketch. You can read, write or erase the credentials using this class individually. It's AutoConnectCredential class which provides the access method to the saved credentials in EEPROM.
+AutoConnectCredential
+
+#include <AutoConnectCredential.h>
+
+
+ Constructors
+AutoConnectCredential();
+
+
+AutoConnectCredential default constructor. The default offset value is 0. If the offset value is 0, the credential area starts from the top of the EEPROM. AutoConnect sometimes overwrites data when using this area with user sketch.
+
AutoConnectCredential( uint16_t offset);
+
+
+ Parameter
+ offset Species offset from the top of the EEPROM for the credential area together. The offset value is from 0 to the flash sector size.
+
+ Public member functions
+ entries
+
+
+Returns number of entries as contained credentials.
+
+ Return value
+ Number of entries as contained credentials.
+
+ load
+int8_t load( const char * ssid, struct station_config * config)
+
+
+Load a credential entry and store to config .
+
+ Parameters
+ ssid SSID to be loaded.
+ config station_config
+ Return value
+ Save the specified SSID's credential entry to station_config pointed to by the parameter as config . -1 is returned if the SSID is not saved.
+
+ load
+bool load( int8_t entry, struct station_config * config)
+
+
+Load a credential entry and store to config .
+
+ Parameters
+ entry Specifies the index number based 0 to be loaded.
+ config station_config
+ Return value
+ Save the specified credential entry to station_config pointed to by the parameter as config . -1 is returned if specified number is not saved.
+
+ save
+bool save( const struct station_config * config)
+
+
+Save a credentail entry.
+
+ Parameter
+ config station_config to be saved.
+ Return value
+ true Successfully saved.
+ false Failed to save.
+
+ del
+bool del( const char * ssid)
+
+
+Delete a credential the specified SSID.
+
+ Parameter
+ ssid SSID to be deleted.
+ Return value
+ true Successfully deleted.
+ false Failed to delete.
+
+The data structures
+ station_config
+A structure is included in the ESP8266 SDK. You can use it in the sketch like as follows:
+extern "C" {
+#include <user_interface.h>
+}
+
+
+struct station_config {
+ uint8 ssid[ 32 ];
+ uint8 password[ 64 ];
+ uint8 bssid_set;
+ uint8 bssid[ 6 ];
+};
+
+
+ The credential entry
+A data structure of the credential saving area in EEPROM as the below.
+
+
+
+Byte offset
+Length
+Value
+
+
+
+
+0
+8
+AC_CREDT
+
+
+8
+1
+Number of contained entries (uint8_t)
+
+
+9
+2
+Container size, excluding size of AC_CREDT and size of the number of entries(width for uint16_t type).
+
+
+11
+variable
+SSID terminated by 0x00. Max length is 32 bytes.
+
+
+variable
+variable
+Password plain text terminated by 0x00. Max length is 64 bytes.
+
+
+variable
+6
+BSSID
+
+
+variable
+
+Contained the next entries. (Continuation SSID+Password+BSSID)
+
+
+variable
+1
+0x00. End of container.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/datatips.html b/docs/datatips.html
index b13587a..11ceaa6 100644
--- a/docs/datatips.html
+++ b/docs/datatips.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
@@ -756,12 +679,60 @@
-
-
+
+
+
+
+
Appendix
+
+
+
+ Appendix
+
+
+
+
+
@@ -931,16 +902,20 @@
Here, represent examples the typical method for the data type conversion for the AutoConnectElements value of custom Web pages.
Integer
Use int() or toInt() of String .
-AutoConnectInput & input = aux.getElement < AutoConnectInput > ( "INPUT" );
+
AutoConnectInput & input = aux.getElement < AutoConnectInput > ( "INPUT" );
int value = input.value.toInt();
-
+You can shorten it and write as like:
+int value = aux[ "INPUT" ].value.toInt();
+
Float
Use float() or toFloat() of String .
-AutoConnectInput & input = aux.getElement < AutoConnectInput > ( "INPUT" );
+
AutoConnectInput & input = aux.getElement < AutoConnectInput > ( "INPUT" );
float value = input.value.toFloat();
-
+You can shorten it and write as like:
+float value = aux[ "INPUT" ].value.toFloat();
+
Date & Time
The easiest way is to use the Arduino Time Library . Sketches must accommodate differences in date and time formats depending on the time zone. You can absorb the difference in DateTime format by using sscanf
function.
#include <TimeLib.h>
@@ -948,7 +923,7 @@
time_t tm;
int Year, Month, Day, Hour, Minute, Second;
-AutoConnectInput & input = aux.getElement < AutoConnectInput > ( "INPUT" );
+AutoConnectInput & input = aux.[ "INPUT" ].as < AutoConnectInput > ();
sscanf(input.value.c_str(), "%d-%d-%d %d:%d:%d" , & Year, & Month, & Day, & Hour, & Minute, & Second);
tm.Year = CalendarYrToTm(Year);
tm.Month = Month;
@@ -961,7 +936,7 @@
IP address
To convert a String to an IP address, use IPAddress::fromString . To stringize an instance of an IP address, use IPAddress::toString .
IPAddress ip;
-AutoConnectInput & input aux.getElement < AutoConnectInput > ( "INPUT" );
+AutoConnectInput & input aux[ "INPUT" ].as < AutoConnectInput > ();
ip.fromString(input.value);
input.value = ip.toString();
@@ -1012,9 +987,9 @@
AutoConnect portal;
String checkIPAddress (AutoConnectAux & aux, PageArgument & args) {
- AutoConnectAux * input_page = portal.aux( "/" );
- AutoConnectInput & ipaddress = input_page -> getElement < AutoConnectInput > ( "ipaddress" );
- AutoConnectText & result = aux.getElement < AutoConnectText > ( "result" );
+ AutoConnectAux & input_page = * portal.aux( "/" );
+ AutoConnectInput & ipaddress = input_page[ "ipaddress" ].as < AutoConnectInput > ();
+ AutoConnectText & result = aux[ "result" ].as < AutoConnectText > ();
if (ipaddress.isValid()) {
result.value = "IP Address " + ipaddress.value + " is OK." ;
@@ -1163,7 +1138,7 @@
-
+
diff --git a/docs/faq.html b/docs/faq.html
index 93177bc..bf43a7d 100644
--- a/docs/faq.html
+++ b/docs/faq.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,81 +229,6 @@
-
-
-
-
-
-
@@ -636,12 +561,60 @@
-
-
+
+
+
+
+
Appendix
+
+
+
+ Appendix
+
+
+
+
+
@@ -732,40 +705,6 @@
How erase the credentials saved in EEPROM?
-
-
-
-
@@ -991,40 +930,6 @@
How erase the credentials saved in EEPROM?
-
-
-
-
@@ -1207,7 +1112,7 @@ For AutoConnect menus to work properly, call How change esp8266ap for SSID name in Captive portal?
You can change both by using AutoConnectConfig::apid and AutoConnectConfig::psk . Refer to section Change SSID and Password for SoftAP in Advanced usage .
How change HTTP port?
-HTTP port number is defined as a macro in AutoConnect.h header file. You can change it directly with several editors and must re-compile.
+HTTP port number is defined as a macro in AutoConnectDefs.h header file. You can change it directly with several editors and must re-compile.
#define AUTOCONNECT_HTTPPORT 80
@@ -1243,117 +1148,7 @@ wdt reset
How erase the credentials saved in EEPROM?
-Make some sketches for erasing the EEPROM area, or some erasing utility is needed. You can prepare the sketch to erase the saved credential with AutoConnectCredential . The AutoConnectCrendential class provides the access method to the saved credential in EEPROM and library source file is including it.
-A class description of AutoConnectCredential is follows.
-
-#include <AutoConnectCredential.h>
-
-
- Constructor
-AutoConnectCredential();
-
-
-AutoConnectCredential default constructor. The default offset value is 0. If the offset value is 0, the credential storage area starts from the top of the EEPROM. AutoConnect sometimes overwrites data when using this area with user sketch.
-AutoConnectCredential( uint16_t offset);
-
-
-Specify offset from the top of the EEPROM for the credential storage area together. The offset value is from 0 to the flash sector size.
- Public member functions
-
-
-uint8_t entries()
- Returns number of entries as contained credentials.
-
-
-int8_t load(const char* ssid , struct station_config* config )
- Load a credential entry specified ssid to config . Returns -1 as unsuccessfully loaded.
-
-
-bool load(int8_t entry , struct station_config* config )
- Load a credential entry to config . The entry parameter specify to index of the entry.
-
-
-bool save(const struct station_config* config )
- Save a credential entry stored in config to EEPROM. Returns the true as succeeded.
-
-
-bool del(const char* ssid )
- Delete a credential entry specified ssid . Returns the true as successfully deleted.
-
-
- Data structures
-
-station_config
- A structure is included in the ESP8266 SDK. You can use it in the sketch like as follows.
-
-extern "C" {
-#include <user_interface.h>
-}
-
-
-struct station_config {
- uint8 ssid[ 32 ];
- uint8 password[ 64 ];
- uint8 bssid_set;
- uint8 bssid[ 6 ];
-};
-
-
-
-EEPROM data structure
- A data structure of the credential saving area in EEPROM as the below.
-
-
-
-
-Byte offset
-Length
-Value
-
-
-
-
-0
-8
-AC_CREDT
-
-
-8
-1
-Number of contained entries (uint8_t)
-
-
-9
-2
-Container size, excluding size of AC_CREDT and size of the number of entries(width for uint16_t type).
-
-
-11
-variable
-SSID terminated by 0x00. Max length is 32 bytes.
-
-
-variable
-variable
-Password plain text terminated by 0x00. Max length is 64 bytes.
-
-
-variable
-6
-BSSID
-
-
-variable
-
-Contained the next entries. (Continuation SSID+Password+BSSID)
-
-
-variable
-1
-0x00. End of container.
-
-
-
+Make some sketches for erasing the EEPROM area, or some erasing utility is needed. You can prepare the sketch to erase the saved credential with AutoConnectCredential . The AutoConnectCrendential class provides the access method to the saved credential in EEPROM and library source file is including it. Refer to 'Saved credential access ' on section Appendix for details.
Hint
With the ESPShaker , you can access EEPROM interactively from the serial monitor, and of course you can erase saved credentials.
@@ -1401,12 +1196,12 @@ wdt reset
-
PageBuilder.h
+
PageBuilder.h
4. Reports the issue to AutoConnect Github repository
-
If you can not solve AutoConnect problems please report to Issues . And please make your question comprehensively, not a statement. Include all relevant information to start the problem diagnostics as follows:
+
If you can not solve AutoConnect problems please report to Issues . And please make your question comprehensively, not a statement. Include all relevant information to start the problem diagnostics as follows:
-
+
diff --git a/docs/gettingstarted.html b/docs/gettingstarted.html
index 7481975..e4bc5a6 100644
--- a/docs/gettingstarted.html
+++ b/docs/gettingstarted.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,81 +229,6 @@
-
-
-
-
-
-
-
+
diff --git a/docs/howtoembed.html b/docs/howtoembed.html
index 7a7eee9..c3a0ebe 100644
--- a/docs/howtoembed.html
+++ b/docs/howtoembed.html
@@ -38,7 +38,7 @@
-
+
@@ -46,7 +46,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
@@ -229,83 +229,6 @@
-
-
-
-
-
-
-
-
-
+
diff --git a/docs/images/ac_upload_flow.svg b/docs/images/ac_upload_flow.svg
new file mode 100644
index 0000000..e2b7fd3
--- /dev/null
+++ b/docs/images/ac_upload_flow.svg
@@ -0,0 +1,973 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+ Upload
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Submit
+
+ Web Browser
+
+ File
+
+
+ HTTPUploadStatus { String filename; String name; }
+ RequestHandler ::upload()
+
+
+
+ HTTPUploadStatus
+ name
+ value
+
+
+
+
+
+
+
+ REGISTER
+
+ AutoConnectAux ::onUpload(uplooadHandler )
+ INVOKE uploadHandler
+ value
+
+
+ AutoConnectFile
+ COPY
+ COPY
+
+
+
+ REGISTER
+ WebServer ::on(reqHandler )
+
+ INVOKE reqHandler
+ Function reqHandler ()
+
+
+
+
+ Sketch
+
+
+
+ Built-in uploader
+
+
+
+ AutoConnect
+
+
+
+ ESP8266WebServer WebServer w/ESP32
+
+ POST /{URL} Upload=File
+ CREATE
+ AutoConnectFile
+
+ SAVE
+
+
+
diff --git a/docs/images/acfile.png b/docs/images/acfile.png
new file mode 100644
index 0000000000000000000000000000000000000000..40fbb3b8636e48a49daf50c0f58e4e152d178b69
GIT binary patch
literal 4870
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
literal 0
HcmV?d00001
diff --git a/docs/images/upload.gif b/docs/images/upload.gif
new file mode 100644
index 0000000000000000000000000000000000000000..0ebbab3e3bf7a5965101466ee54fb782e87fdf5e
GIT binary patch
literal 183630
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⋘H;Kv$|29-p^>
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