diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..e640493 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,72 @@ +# This is a basic workflow to help you get started with Actions + +name: Build + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [ master ] + pull_request: + branches: [ master ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + name: ${{ matrix.os }} Python ${{ matrix.python-version }} + # The type of runner that the job will run on + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: ["ubuntu-latest"] + python-version: ["3.12"] + + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v4 + - uses: conda-incubator/setup-miniconda@v3 + with: + activate-environment: test + auto-activate-base: false + python-version: ${{ matrix.python-version }} + + - name: Install + shell: bash -l {0} + run: | + conda info + conda config --add channels conda-forge + conda install obspy + pip install git+https://github.com/schaefferaj/stdb + pip install . + + # - name: Tests + # shell: bash -l {0} + # run: | + # mkdir empty + # cd empty + # conda install pytest + # pytest -v --pyargs splitpy + + # - name: Make docs + # if: matrix.python-version == '3.12' + # shell: bash -l {0} + # run: | + # cd docs + # conda install sphinx + # pip install sphinx_rtd_theme + # make html + # touch _build/html/.nojekyll + # cd .. + + # - name: Deploy 🚀 + # if: matrix.python-version == '3.12' + # uses: JamesIves/github-pages-deploy-action@3.7.1 + # with: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # BRANCH: gh-pages # The branch the action should deploy to. + # FOLDER: docs/_build/html # The folder the action should deploy. + # CLEAN: true # Automatically remove deleted files from the deploy branch diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 57130bf..0000000 --- a/.travis.yml +++ /dev/null @@ -1,49 +0,0 @@ -language: c -os: - - linux - - osx - - windows -env: - - PYTHON_VERSION=3.6 - - PYTHON_VERSION=3.7 - - PYTHON_VERSION=3.8 -jobs: - include: - - env: PYTHON_VERSION=3.7 DOCS=1 -before_install: - - wget https://raw.githubusercontent.com/trichter/conda4travis/latest/conda4travis.sh -O conda4travis.sh - - source conda4travis.sh - - conda config --add channels conda-forge - - if [[ $DOCS == 1 ]]; then - DEP="sphinx sphinx_rtd_theme"; - else - DEP="pytest-cov"; - fi - - conda create -q -n testenv python=$PYTHON_VERSION obspy $DEP -c conda-forge - - conda activate testenv - - conda list -install: - - pip install stdb - - pip install -v --no-deps . -script: - - if [[ $DOCS == 1 ]]; then - cd docs; make html; touch _build/html/.nojekyll; cd ..; - else - mkdir empty; cd empty; pytest -v --cov=splitpy ../splitpy/tests/; - fi - -after_success: - - if [[ $DOCS != 1 ]]; then - bash <(curl -s https://codecov.io/bash); - else - openssl aes-256-cbc -K $encrypted_f315283a03bb_key -iv $encrypted_f315283a03bb_iv -in ".travis/github_deploy_key.enc" -out ".travis/github_deploy_key" -d; - fi -notifications: - email: false -deploy: - provider: pages:git - edge: true # opt in to dpl v2 - deploy_key: .travis/github_deploy_key - local_dir: docs/_build/html - on: - condition: $DOCS = 1 \ No newline at end of file diff --git a/.travis/github_deploy_key.enc b/.travis/github_deploy_key.enc deleted file mode 100644 index c63f8f8..0000000 Binary files a/.travis/github_deploy_key.enc and /dev/null differ diff --git a/README.md b/README.md index 6effb09..d388af8 100644 --- a/README.md +++ b/README.md @@ -53,4 +53,4 @@ Examples of straightforward contributions include notebooks that describe publis #### Use Cases -- Esteve, C., Audet, P., Schaeffer, A.J., Schutt, D.L., Aster, R.A., and Cubley, J. (2020). Seismic evidence for craton chiseling and displacement of lithospheric mantle by the Tintina Fault in the Northern Canadian Cordilleras, Geology, in press. +- Esteve, C., Audet, P., Schaeffer, A.J., Schutt, D.L., Aster, R.A., and Cubley, J. (2020). Seismic evidence for craton chiseling and displacement of lithospheric mantle by the Tintina Fault in the Northern Canadian Cordilleras, Geology, 48, 1120–1125, https://doi.org/10.1130/G47688.1 \ No newline at end of file diff --git a/Scripts/split_calc_auto.py b/Scripts/split_calc_auto.py deleted file mode 100644 index 665a226..0000000 --- a/Scripts/split_calc_auto.py +++ /dev/null @@ -1,368 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2019 Pascal Audet & Andrew Schaeffer -# -# This file is part of SplitPy. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -# -*- coding: utf-8 -*- -from pathlib import Path -from splitpy import arguments, utils -from splitpy import Split, DiagPlot -import matplotlib.pyplot as plt -import numpy as np -import pickle -import stdb -from obspy.clients.fdsn import Client -from obspy import UTCDateTime -import matplotlib -matplotlib.use('Qt5Agg') - - -def main(): - - # Run Input Parser - args = arguments.get_arguments_calc_auto() - - # Load Database - # stdb=0.1.4 - try: - db, stkeys = stdb.io.load_db(fname=args.indb, keys=args.stkeys) - - # stdb=0.1.3 - except: - db = stdb.io.load_db(fname=args.indb) - - # Construct station key loop - allkeys = db.keys() - sorted(allkeys) - - # Extract key subset - if len(args.stkeys) > 0: - stkeys = [] - for skey in args.stkeys: - stkeys.extend([s for s in allkeys if skey in s]) - else: - stkeys = db.keys() - sorted(stkeys) - - # Loop over station keys - for stkey in list(stkeys): - - # Extract station information from dictionary - sta = db[stkey] - - # Output directory - datapath = Path('DATA') / stkey - if not datapath.is_dir(): - datapath.mkdir(parents=True) - - # Establish client - if len(args.UserAuth) == 0: - data_client = Client(args.Server) - else: - data_client = Client( - args.Server, user=args.UserAuth[0], password=args.UserAuth[1]) - - # Establish client for events - event_client = Client() - - # Get catalogue search start time - if args.startT is None: - tstart = sta.startdate - else: - tstart = args.startT - - # Get catalogue search end time - if args.endT is None: - tend = sta.enddate - else: - tend = args.endT - if tstart > sta.enddate or tend < sta.startdate: - continue - - # Temporary print locations - tlocs = sta.location - if len(tlocs) == 0: - tlocs = [''] - for il in range(0, len(tlocs)): - if len(tlocs[il]) == 0: - tlocs[il] = "--" - sta.location = tlocs - - # Update Display - print(" ") - print(" ") - print("|"+"="*50+"|") - print("| {0:>8s} |".format( - sta.station)) - print("|"+"="*50+"|") - print("| Station: {0:>2s}.{1:5s} |".format( - sta.network, sta.station)) - print("| Channel: {0:2s}; Locations: {1:15s} |".format( - sta.channel, ",".join(tlocs))) - print("| Lon: {0:7.2f}; Lat: {1:6.2f} |".format( - sta.longitude, sta.latitude)) - print("| Start time: {0:19s} |".format( - sta.startdate.strftime("%Y-%m-%d %H:%M:%S"))) - print("| End time: {0:19s} |".format( - sta.enddate.strftime("%Y-%m-%d %H:%M:%S"))) - print("|"+"-"*50+"|") - print("| Searching Possible events: |") - print("| Start: {0:19s} |".format( - tstart.strftime("%Y-%m-%d %H:%M:%S"))) - print("| End: {0:19s} |".format( - tend.strftime("%Y-%m-%d %H:%M:%S"))) - if args.maxmag is None: - print("| Mag: >{0:3.1f}".format(args.minmag) + - " |") - else: - msg = "| Mag: {0:3.1f}".format(args.minmag) + \ - " - {0:3.1f}".format(args.maxmag) + \ - " |" - print(msg) - - print("| ... |") - - # Get catalogue using deployment start and end - cat = event_client.get_events( - starttime=tstart, endtime=tend, - minmagnitude=args.minmag, maxmagnitude=args.maxmag) - - # Total number of events in Catalogue - nevK = 0 - nevtT = len(cat) - print( - "| Found {0:5d}".format(nevtT) + - " possible events |") - ievs = range(0, nevtT) - - # Get Local Data Availabilty - if len(args.localdata) > 0: - print("|"+"-"*50+"|") - print("| Cataloging Local Data... |") - if args.useNet: - stalcllist = utils.list_local_data_stn( - lcldrs=args.localdata, sta=sta.station, - net=sta.network, dtype=args.dtype, altnet=sta.altnet) - print("| {0:>2s}.{1:5s}: {2:6d} files ".format( - sta.network, sta.station, len(stalcllist))) - else: - stalcllist = utils.list_local_data_stn( - lcldrs=args.localdata, dtype=args.dtype, sta=sta.station) - print("| {0:5s}: {1:6d} files ".format( - sta.station, len(stalcllist))) - else: - stalcllist = [] - print("|"+"="*50+"|") - - # Select order of processing - if args.reverse: - ievs = range(0, nevtT) - else: - ievs = range(nevtT-1, -1, -1) - - # Read through catalogue - for iev in ievs: - - # Extract event - ev = cat[iev] - - # Initialize Split object with station info - split = Split(sta) - - # Add event to split object - accept = split.add_event( - ev, gacmin=args.mindist, gacmax=args.maxdist, - phase=args.phase, returned=True) - - # Define time stamp - yr = str(split.meta.time.year).zfill(4) - jd = str(split.meta.time.julday).zfill(3) - hr = str(split.meta.time.hour).zfill(2) - - # If event is accepted (data exists) - if accept: - - # Display Event Info - nevK = nevK + 1 - if args.reverse: - inum = iev + 1 - else: - inum = nevtT - iev + 1 - print(" ") - print("|"+"*"*50+"|") - print("* #{0:d} ({1:d}/{2:d}): {3:13s} {4}".format( - nevK, inum, nevtT, split.meta.time.strftime( - "%Y%m%d_%H%M%S"), stkey)) - if args.verb: - print("* Phase: {}".format(args.phase)) - print("* Origin Time: " + - split.meta.time.strftime("%Y-%m-%d %H:%M:%S")) - print( - "* Lat: {0:6.2f}; Lon: {1:7.2f}".format( - split.meta.lat, split.meta.lon)) - print( - "* Dep: {0:6.2f} km; Mag: {1:3.1f}".format( - split.meta.dep, split.meta.mag)) - print("* Dist: {0:7.2f} km;".format(split.meta.epi_dist) + - " Epi dist: {0:6.2f} deg\n".format(split.meta.gac) + - "* Baz: {0:6.2f} deg;".format(split.meta.baz) + - " Az: {0:6.2f} deg".format(split.meta.az)) - - # Event Folder - timekey = split.meta.time.strftime("%Y%m%d_%H%M%S") - datadir = datapath / timekey - ZNEfile = datadir / 'ZNE_data.pkl' - LQTfile = datadir / 'LQT_data.pkl' - metafile = datadir / 'Meta_data.pkl' - stafile = datadir / 'Station_data.pkl' - splitfile = datadir / 'Split_results_auto.pkl' - - # Check if RF data already exist and overwrite has been set - if datadir.exists(): - if splitfile.exists(): - if not args.ovr: - continue - - if args.recalc: - if np.sum([file.exists() for file in - [ZNEfile, metafile, stafile]]) < 3: - continue - sta = pickle.load(open(stafile, "rb")) - split = Split(sta) - meta = pickle.load(open(metafile, "rb")) - split.meta = meta - dataZNE = pickle.load(open(ZNEfile, "rb")) - split.dataZNE = dataZNE - - # Rotate from ZNE to 'LQT' - split.rotate(align='LQT') - - # Filter rotated traces - split.dataLQT.filter('bandpass', freqmin=args.fmin, - freqmax=args.fmax) - - # Calculate snr over dt_snr seconds - split.calc_snr() - - # Save LQT Traces - pickle.dump(split.dataLQT, open(LQTfile, "wb")) - - else: - - # Get data - has_data = split.download_data( - client=data_client, dts=args.dts, stdata=stalcllist, - dtype=args.dtype, ndval=args.ndval, new_sr=args.new_sampling_rate, - returned=True, verbose=args.verb) - - if not has_data: - continue - - # Rotate from ZNE to 'LQT' - split.rotate(align='LQT') - - # Filter rotated traces - split.dataLQT.filter('bandpass', freqmin=args.fmin, - freqmax=args.fmax) - - # Calculate snr over dt_snr seconds - split.calc_snr() - - # If SNR lower than user-specified threshold, continue - if split.meta.snrq < args.msnr: - if args.verb: - print( - "* SNRQ < {0:.1f}, continuing".format(args.msnr)) - print("*"*50) - continue - - # Make sure no processing happens for NaNs - if np.isnan(split.meta.snrq): - if args.verb: - print("* SNR NaN, continuing") - print("*"*50) - continue - - # Create Folder if it doesn't exist - if not datadir.exists(): - datadir.mkdir(parents=True) - - # Save ZNE Traces - pickle.dump(split.dataZNE, open(ZNEfile, "wb")) - - # Save LQT Traces - pickle.dump(split.dataLQT, open(LQTfile, "wb")) - - if args.verb: - print("* SNRQ: {}".format(split.meta.snrq)) - print("* SNRT: {}".format(split.meta.snrt)) - - if args.calc or args.recalc: - - # Analyze - split.analyze(verbose=args.verb) - - # Continue if problem with analysis - if split.RC_res.edtt is None or split.SC_res.edtt is None: - if args.verb: - print("* !!! DOF Error. --> Skipping...") - print("*"*50) - continue - - # Determine if Null and Quality of estimate - split.is_null(args.snrTlim, verbose=args.verb) - split.get_quality(verbose=args.verb) - - # Display results - if args.verb: - split.display_meta() - if args.calc or args.recalc: - split.display_results() - split.display_null_quality() - - # Save event meta data - pickle.dump(split.meta, open(metafile, "wb")) - - # Save Station Data - pickle.dump(split.sta, open(stafile, "wb")) - - if args.calc or args.recalc: - # Save Split Data - file = open(splitfile, "wb") - pickle.dump(split.SC_res, file) - pickle.dump(split.RC_res, file) - pickle.dump(split.null, file) - pickle.dump(split.quality, file) - file.close() - - # Initialize diagnostic figure and plot it - if args.diagplot: - dplot = DiagPlot(split) - dplot.plot_diagnostic() - plt.figure(dplot.axes[0].number) - plt.show() - - -if __name__ == "__main__": - - # Run main program - main() diff --git a/docs/Makefile b/docs/Makefile index 7de6ff9..d4bb2cb 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -12,10 +12,6 @@ BUILDDIR = _build help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -github: - @make html - @cp -a _build/html/. ../docs - .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new diff --git a/docs/_build/doctrees/api.doctree b/docs/_build/doctrees/api.doctree index f95f35a..dbe17a7 100644 Binary files a/docs/_build/doctrees/api.doctree and b/docs/_build/doctrees/api.doctree differ diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index 32b896d..319e7aa 100644 Binary files a/docs/_build/doctrees/environment.pickle and b/docs/_build/doctrees/environment.pickle differ diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree index 6a53fa0..f56db43 100644 Binary files a/docs/_build/doctrees/index.doctree and b/docs/_build/doctrees/index.doctree differ diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo index 0ebf660..2d3bffb 100644 --- a/docs/_build/html/.buildinfo +++ b/docs/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 848b712f5a7eb6004a52ae3ef105677c +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: a57d86190da7e2b5f00ceb6d3c0e6a5c tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/_images/Figure_3.png b/docs/_build/html/_images/Figure_3.png index cd3e81a..b0f102e 100644 Binary files a/docs/_build/html/_images/Figure_3.png and b/docs/_build/html/_images/Figure_3.png differ diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt index 3f92d89..16b26a1 100644 --- a/docs/_build/html/_sources/index.rst.txt +++ b/docs/_build/html/_sources/index.rst.txt @@ -18,8 +18,8 @@ teleseismic shear-wave splitting analysis in two different modes: Once the splitting analysis has been done, the results can be aggregated to produce averaged splitting parameters and plotted (:ref:`splitaverage`). The tutorials below show an example using data -from `one station `_ of the -USArray Transportable Array network. +from `one station `_ of the +Yukon-Northwest Seismograph Network. .. note:: @@ -31,8 +31,6 @@ USArray Transportable Array network. :target: https://zenodo.org/badge/latestdoi/211722700 .. image:: https://travis-ci.org/paudetseis/SplitPy.svg?branch=master :target: https://travis-ci.org/paudetseis/ -.. image:: https://codecov.io/gh/paudetseis/SplitPy/branch/master/graph/badge.svg - :target: https://codecov.io/gh/paudetseis/SplitPy .. toctree:: :maxdepth: 1 diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css index 0119285..4738b2e 100644 --- a/docs/_build/html/_static/basic.css +++ b/docs/_build/html/_static/basic.css @@ -1,12 +1,5 @@ /* - * basic.css - * ~~~~~~~~~ - * * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ /* -- main layout ----------------------------------------------------------- */ @@ -15,6 +8,12 @@ div.clearer { clear: both; } +div.section::after { + display: block; + content: ''; + clear: left; +} + /* -- relbar ---------------------------------------------------------------- */ div.related { @@ -109,22 +108,18 @@ img { /* -- search page ----------------------------------------------------------- */ ul.search { - margin: 10px 0 0 20px; - padding: 0; + margin-top: 10px; } ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; + padding: 5px 0; } ul.search li a { font-weight: bold; } -ul.search li div.context { +ul.search li p.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -216,7 +211,7 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ div.body { - min-width: 450px; + min-width: 360px; max-width: 800px; } @@ -231,14 +226,8 @@ a.headerlink { visibility: hidden; } -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; +a:visited { + color: #551A8B; } h1:hover > a.headerlink, @@ -271,25 +260,25 @@ p.rubric { font-weight: bold; } -img.align-left, .figure.align-left, object.align-left { +img.align-left, figure.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } -img.align-right, .figure.align-right, object.align-right { +img.align-right, figure.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } -img.align-center, .figure.align-center, object.align-center { +img.align-center, figure.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } -img.align-default, .figure.align-default { +img.align-default, figure.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; @@ -313,24 +302,35 @@ img.align-default, .figure.align-default { /* -- sidebars -------------------------------------------------------------- */ -div.sidebar { +div.sidebar, +aside.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; - padding: 7px 7px 0 7px; + padding: 7px; background-color: #ffe; width: 40%; float: right; + clear: right; + overflow-x: auto; } p.sidebar-title { font-weight: bold; } +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + /* -- topics ---------------------------------------------------------------- */ +nav.contents, +aside.topic, div.topic { border: 1px solid #ccc; - padding: 7px 7px 0 7px; + padding: 7px; margin: 10px 0 10px 0; } @@ -352,10 +352,6 @@ div.admonition dt { font-weight: bold; } -div.admonition dl { - margin-bottom: 0; -} - p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; @@ -366,9 +362,34 @@ div.body p.centered { margin-top: 25px; } +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + /* -- tables ---------------------------------------------------------------- */ table.docutils { + margin-top: 10px; + margin-bottom: 10px; border: 0; border-collapse: collapse; } @@ -398,10 +419,6 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } -table.footnote td, table.footnote th { - border: 0 !important; -} - th { text-align: left; padding-right: 5px; @@ -416,32 +433,34 @@ table.citation td { border-bottom: none; } -th > p:first-child, -td > p:first-child { +th > :first-child, +td > :first-child { margin-top: 0px; } -th > p:last-child, -td > p:last-child { +th > :last-child, +td > :last-child { margin-bottom: 0px; } /* -- figures --------------------------------------------------------------- */ -div.figure { +div.figure, figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption { +div.figure p.caption, figcaption { padding: 0.3em; } -div.figure p.caption span.caption-number { +div.figure p.caption span.caption-number, +figcaption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text { +div.figure p.caption span.caption-text, +figcaption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -468,10 +487,71 @@ table.field-list td, table.field-list th { /* -- hlist styles ---------------------------------------------------------- */ +table.hlist { + margin: 1em 0; +} + table.hlist td { vertical-align: top; } +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + /* -- other body styles ----------------------------------------------------- */ @@ -495,26 +575,53 @@ ol.upperroman { list-style: upper-roman; } -li > p:first-child { +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { margin-top: 0px; } -li > p:last-child { +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { margin-bottom: 0px; } -dl.footnote > dt, -dl.citation > dt { - float: left; +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; } -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; } -dl.footnote > dd:after, -dl.citation > dd:after { +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { content: ""; clear: both; } @@ -531,10 +638,6 @@ dl.field-list > dt { padding-right: 5px; } -dl.field-list > dt:after { - content: ":"; -} - dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; @@ -546,7 +649,7 @@ dl { margin-bottom: 15px; } -dd > p:first-child { +dd > :first-child { margin-top: 0px; } @@ -560,6 +663,21 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + dt:target, span.highlighted { background-color: #fbe54e; } @@ -573,14 +691,6 @@ dl.glossary dt { font-size: 1.1em; } -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - .versionmodified { font-style: italic; } @@ -621,8 +731,9 @@ dl.glossary dt { .classifier:before { font-style: normal; - margin: 0.5em; + margin: 0 0.5em; content: ":"; + display: inline-block; } abbr, acronym { @@ -637,29 +748,69 @@ pre { overflow-y: hidden; /* fixes display issues on Chrome browsers */ } +pre, div[class*="highlight-"] { + clear: both; +} + span.pre { -moz-hyphens: none; -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; } td.linenos pre { - padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { - margin-left: 0.5em; + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; } table.highlighttable td { - padding: 0 0.5em 0 0.5em; + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; } div.code-block-caption { + margin-top: 1em; padding: 2px 5px; font-size: small; } @@ -668,12 +819,14 @@ div.code-block-caption code { background-color: transparent; } -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ } div.code-block-caption span.caption-number { @@ -685,21 +838,7 @@ div.code-block-caption span.caption-text { } div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; + margin: 1em 0; } code.xref, a code { @@ -740,8 +879,7 @@ span.eqno { } span.eqno a.headerlink { - position: relative; - left: 0px; + position: absolute; z-index: 1; } diff --git a/docs/_build/html/_static/css/badge_only.css b/docs/_build/html/_static/css/badge_only.css index 3c33cef..88ba55b 100644 --- a/docs/_build/html/_static/css/badge_only.css +++ b/docs/_build/html/_static/css/badge_only.css @@ -1 +1 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/docs/_build/html/_static/css/theme.css b/docs/_build/html/_static/css/theme.css index aed8cef..0f14f10 100644 --- a/docs/_build/html/_static/css/theme.css +++ b/docs/_build/html/_static/css/theme.css @@ -1,6 +1,4 @@ -/* sphinx_rtd_theme version 0.4.3 | MIT license */ -/* Built 20190212 16:02 */ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.7.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content .code-block-caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content .code-block-caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content table>caption .headerlink,.rst-content table>caption a .headerlink,a .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content table>caption .headerlink,.rst-content table>caption .btn .headerlink,.btn .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content table>caption .headerlink,.rst-content table>caption .nav .headerlink,.nav .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.btn .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.nav .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.btn .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.nav .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.admonition{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo,.rst-content .wy-alert-warning.admonition{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title,.rst-content .wy-alert-warning.admonition .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.admonition{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.admonition{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.admonition{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.3576515979%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.3576515979%;width:48.821174201%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.3576515979%;width:31.7615656014%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type="datetime-local"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{position:absolute;content:"";display:block;left:0;top:0;width:36px;height:12px;border-radius:4px;background:#ccc;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27AE60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:.3em;display:block}.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:before,.wy-breadcrumbs:after{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#3a7ca8;height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin:12px 0 0 0;display:block;font-weight:bold;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a{color:#404040}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;padding:.809em;display:block;color:#fcfcfc;margin-bottom:.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:gray}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:gray}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{width:100%}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1100px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;display:block;overflow:auto}.rst-content pre.literal-block,.rst-content div[class^='highlight']{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px 0}.rst-content pre.literal-block div[class^='highlight'],.rst-content div[class^='highlight'] div[class^='highlight']{padding:0px;border:none;margin:0}.rst-content div[class^='highlight'] td.code{width:100%}.rst-content .linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;display:block;overflow:auto}.rst-content div[class^='highlight'] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content pre.literal-block,.rst-content div[class^='highlight'] pre,.rst-content .linenodiv pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:12px;line-height:1.4}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^='highlight'],.rst-content div[class^='highlight'] pre{white-space:pre-wrap}}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last,.rst-content .admonition .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .section ol p:last-child,.rst-content .section ul p:last-child{margin-bottom:24px}.rst-content .line-block{margin-left:0px;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink{visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after,.rst-content .code-block-caption .headerlink:after{content:"";font-family:FontAwesome}.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content .toctree-wrapper p.caption:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after,.rst-content .code-block-caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:baseline;position:relative;top:-0.4em;line-height:0;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:gray}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}.rst-content table.docutils td .last,.rst-content table.docutils td .last :last-child{margin-bottom:0}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content tt,.rst-content tt,.rst-content code{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content pre,.rst-content kbd,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold;margin-bottom:12px}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-regular.eot");src:url("../fonts/Lato/lato-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-regular.woff2") format("woff2"),url("../fonts/Lato/lato-regular.woff") format("woff"),url("../fonts/Lato/lato-regular.ttf") format("truetype");font-weight:400;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bold.eot");src:url("../fonts/Lato/lato-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bold.woff2") format("woff2"),url("../fonts/Lato/lato-bold.woff") format("woff"),url("../fonts/Lato/lato-bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bolditalic.eot");src:url("../fonts/Lato/lato-bolditalic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bolditalic.woff2") format("woff2"),url("../fonts/Lato/lato-bolditalic.woff") format("woff"),url("../fonts/Lato/lato-bolditalic.ttf") format("truetype");font-weight:700;font-style:italic}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-italic.eot");src:url("../fonts/Lato/lato-italic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-italic.woff2") format("woff2"),url("../fonts/Lato/lato-italic.woff") format("woff"),url("../fonts/Lato/lato-italic.ttf") format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:url("../fonts/RobotoSlab/roboto-slab.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.ttf") format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.ttf") format("truetype")} + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js index daccd20..0398ebb 100644 --- a/docs/_build/html/_static/doctools.js +++ b/docs/_build/html/_static/doctools.js @@ -1,315 +1,149 @@ /* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * + * Base JavaScript utilities for all Sphinx HTML documentation. */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); } - return result; }; -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - /** * Small JavaScript module for the documentation. */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); }, /** * i18n support */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } }, - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; }, - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; }, /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + * helper function to focus on search bar */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); }, /** - * highlight the search words provided in the url in the text + * Initialise the domain index toggle buttons */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, + }; - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); }, - initOnKeyListeners: function() { - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); } + break; } } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } }); - } + }, }; // quick alias for translations -_ = Documentation.gettext; +const _ = Documentation.gettext; -$(document).ready(function() { - Documentation.init(); -}); +_ready(Documentation.init); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js index 23fc755..b16db03 100644 --- a/docs/_build/html/_static/documentation_options.js +++ b/docs/_build/html/_static/documentation_options.js @@ -1,12 +1,13 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '0.0.1', - LANGUAGE: 'None', +const DOCUMENTATION_OPTIONS = { + VERSION: '0.2.0', + LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', FILE_SUFFIX: '.html', LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, }; \ No newline at end of file diff --git a/docs/_build/html/_static/jquery.js b/docs/_build/html/_static/jquery.js index a1c07fd..c4c6022 100644 --- a/docs/_build/html/_static/jquery.js +++ b/docs/_build/html/_static/jquery.js @@ -1,2 +1,2 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"),i("table.docutils.footnote").wrap("
"),i("table.docutils.citation").wrap("
"),i(".wy-menu-vertical ul").not(".simple").siblings("a").each(function(){var e=i(this);expand=i(''),expand.on("click",function(n){return t.toggleCurrent(e),n.stopPropagation(),!1}),e.prepend(expand)})},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),i=e.find('[href="'+n+'"]');if(0===i.length){var t=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(i=e.find('[href="#'+t.attr("id")+'"]')).length&&(i=e.find('[href="#"]'))}0this.docHeight||(this.navBar.scrollTop(i),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",function(){this.linkScroll=!1})},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:e.exports.ThemeNav,StickyNav:e.exports.ThemeNav}),function(){for(var r=0,n=["ms","moz","webkit","o"],e=0;e"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t { + const [docname, title, anchor, descr, score, filename, kind] = result + return score }, */ @@ -28,9 +23,11 @@ if (!Scorer) { // or matches in the last dotted part of the object name objPartialMatch: 6, // Additive scores depending on the priority of the object - objPrio: {0: 15, // used to be importantResults - 1: 5, // used to be objectResults - 2: -5}, // used to be unimportantResults + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, // Used when the priority is not in the mapping. objPrioDefault: 0, @@ -39,445 +36,571 @@ if (!Scorer) { partialTitle: 7, // query found in terms term: 5, - partialTerm: 2 + partialTerm: 2, }; } -if (!splitQuery) { - function splitQuery(query) { - return query.split(/\s+/); +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings } /** * Search Module */ -var Search = { - - _index : null, - _queued_query : null, - _pulse_status : -1, - - htmlToText : function(htmlString) { - var htmlElement = document.createElement('span'); - htmlElement.innerHTML = htmlString; - $(htmlElement).find('.headerlink').remove(); - docContent = $(htmlElement).find('[role=main]')[0]; - if(docContent === undefined) { - console.warn("Content block not found. Sphinx search tries to obtain it " + - "via '[role=main]'. Could you check your theme or template."); - return ""; - } - return docContent.textContent || docContent.innerText; - }, +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; - init : function() { - var params = $.getQueryParameters(); - if (params.q) { - var query = params.q[0]; - $('input[name="q"]')[0].value = query; - this.performSearch(query); - } + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; }, - loadIndex : function(url) { - $.ajax({type: "GET", url: url, data: null, - dataType: "script", cache: true, - complete: function(jqxhr, textstatus) { - if (textstatus != "success") { - document.getElementById("searchindexloader").src = url; - } - }}); + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); }, - setIndex : function(index) { - var q; - this._index = index; - if ((q = this._queued_query) !== null) { - this._queued_query = null; - Search.query(q); + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); } }, - hasIndex : function() { - return this._index !== null; - }, + hasIndex: () => Search._index !== null, - deferQuery : function(query) { - this._queued_query = query; - }, + deferQuery: (query) => (Search._queued_query = query), - stopPulse : function() { - this._pulse_status = 0; - }, + stopPulse: () => (Search._pulse_status = -1), - startPulse : function() { - if (this._pulse_status >= 0) - return; - function pulse() { - var i; + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { Search._pulse_status = (Search._pulse_status + 1) % 4; - var dotString = ''; - for (i = 0; i < Search._pulse_status; i++) - dotString += '.'; - Search.dots.text(dotString); - if (Search._pulse_status > -1) - window.setTimeout(pulse, 500); - } + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; pulse(); }, /** * perform a search for something (or wait until index is loaded) */ - performSearch : function(query) { + performSearch: (query) => { // create the required interface elements - this.out = $('#search-results'); - this.title = $('

' + _('Searching') + '

').appendTo(this.out); - this.dots = $('').appendTo(this.title); - this.status = $('

 

').appendTo(this.out); - this.output = $(' @@ -317,8 +248,6 @@

L

+

Z

+ + +
+ -
-
-

- © Copyright 2019, Pascal Audet & Andrew Schaeffer - -

+

© Copyright 2019, Pascal Audet & Andrew Schaeffer.

- Built with Sphinx using a theme provided by Read the Docs. -
+ Built with Sphinx using a + theme + provided by Read the Docs. + + - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index b090406..eb36422 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -1,177 +1,100 @@ - - + - - - - - Documentation — SplitPy 0.0.1 documentation - - - - - - - - - - - - - - - - - - + - + + Documentation — SplitPy 0.2.0 documentation + + - - + + + + + + - - - +
- -
- - -
- - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 24b286d..6768a48 100644 Binary files a/docs/_build/html/objects.inv and b/docs/_build/html/objects.inv differ diff --git a/docs/_build/html/py-modindex.html b/docs/_build/html/py-modindex.html index c319cc3..875e6b7 100644 --- a/docs/_build/html/py-modindex.html +++ b/docs/_build/html/py-modindex.html @@ -1,38 +1,21 @@ - - + - - - - - Python Module Index — SplitPy 0.0.1 documentation - - - - - - + + + Python Module Index — SplitPy 0.2.0 documentation + + - - - - - - - - - - - - - - - - + + + + + + @@ -40,131 +23,73 @@ - - - +
- -
- - -
- - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index 2ed094a..bc311d3 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -1,175 +1,99 @@ - - + - - - - - Search — SplitPy 0.0.1 documentation - - - - - - + + + Search — SplitPy 0.2.0 documentation + + - - - - - - - - - - - - - - - - + + + + + + + + - - - +
- -
- - -
- - - - - - - - - - - + diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index 700c124..9a38df0 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["api","index","links","scripts","splitpy","tutorials"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":2,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["api.rst","index.rst","links.rst","scripts.rst","splitpy.rst","tutorials.rst"],objects:{"":{splitpy:[4,0,0,"-"]},"splitpy.calc":{split_RotCorr:[0,1,1,""],split_SilverChan:[0,1,1,""],split_dof:[0,1,1,""],split_errorRC:[0,1,1,""],split_errorSC:[0,1,1,""],tshift:[0,1,1,""]},"splitpy.classes":{DiagPlot:[0,2,1,""],Meta:[0,2,1,""],PickPlot:[0,2,1,""],Result:[0,2,1,""],Split:[0,2,1,""]},"splitpy.classes.DiagPlot":{fd:[0,3,1,""],plot_diagnostic:[0,4,1,""],save:[0,4,1,""],split:[0,3,1,""]},"splitpy.classes.Meta":{az:[0,3,1,""],baz:[0,3,1,""],dep:[0,3,1,""],epi_dist:[0,3,1,""],gac:[0,3,1,""],inc:[0,3,1,""],lat:[0,3,1,""],lon:[0,3,1,""],mag:[0,3,1,""],slow:[0,3,1,""],time:[0,3,1,""]},"splitpy.classes.PickPlot":{fp:[0,3,1,""],ll:[0,3,1,""],plot_LQT_phases:[0,4,1,""],save:[0,4,1,""],split:[0,3,1,""],update_LQT:[0,4,1,""]},"splitpy.classes.Result":{Emat:[0,3,1,""],dtt:[0,3,1,""],edtt:[0,3,1,""],ephi:[0,3,1,""],errc:[0,3,1,""],phi:[0,3,1,""],phi_min:[0,3,1,""],trFast:[0,3,1,""],trQ_c:[0,3,1,""],trSlow:[0,3,1,""],trT_c:[0,3,1,""]},"splitpy.classes.Split":{"null":[0,3,1,""],RC_res:[0,3,1,""],SC_res:[0,3,1,""],add_data:[0,4,1,""],add_event:[0,4,1,""],analyze:[0,4,1,""],calc_snr:[0,4,1,""],dataLQT:[0,3,1,""],dataZNE:[0,3,1,""],display_meta:[0,4,1,""],display_null_quality:[0,4,1,""],display_results:[0,4,1,""],download_data:[0,4,1,""],get_quality:[0,4,1,""],is_null:[0,4,1,""],meta:[0,3,1,""],quality:[0,3,1,""],rotate:[0,4,1,""],save:[0,4,1,""],snrh:[0,3,1,""],snrq:[0,3,1,""],sta:[0,3,1,""]},"splitpy.gui":{Keep:[0,2,1,""],Pick:[0,2,1,""],Repeat:[0,2,1,""],Save:[0,2,1,""]},"splitpy.utils":{download_data:[0,1,1,""],list_local_data_stn:[0,1,1,""],parse_localdata_for_comp:[0,1,1,""],traceshift:[0,1,1,""]},splitpy:{calc:[0,0,0,"-"],gui:[0,0,0,"-"],utils:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"100000z":5,"107273z":5,"110000z":5,"18t03":5,"20160413_135517":5,"20160527_040843":5,"20160607_191515":5,"20160619_094723":5,"20160713_121112":5,"20160924_212841":5,"20170819_020052":5,"20170926_042000":5,"20180728_170723":5,"20180819_042858":5,"20180906_154914":5,"20180910_041902":5,"20180910_193137":5,"20180916_211148":5,"20181016_002812":5,"20190531_101232":5,"20190616_051716":5,"20190707_150840":5,"20190731_150233":5,"20190929_020251":5,"20191031_011119":5,"20200318_031345":5,"742000z":5,"boolean":0,"case":5,"class":1,"default":[0,1,3,5],"final":[3,5],"float":0,"function":0,"int":0,"long":[3,5],"new":[0,3,5],"null":[0,2,3,5],"return":0,"true":5,AND:4,BUT:4,DTS:3,FOR:4,For:[3,5],NOT:4,PKS:5,SKS:[0,1,3,5],ScS:5,THE:4,The:[0,1,3,4,5],There:[3,5],These:[0,3],USE:4,WITH:4,Yes:5,abov:4,accept:0,access:3,accompani:3,action:4,activ:[2,4],add:0,add_data:0,add_ev:0,added:0,after:[0,3,5],against:3,aggreg:1,align:0,all:[0,3,4,5],along:[4,5],alreadi:[0,3],also:[0,4,5],altern:[0,5],altnet:0,america:2,analysi:[0,1,3],analyz:[0,1,3],andrew:4,angl:[0,3],ani:[3,4,5],anwer:0,api:1,appli:[0,5],applic:0,arc:0,argument:[3,5],aris:4,arrai:1,arriv:[0,3,5],ask:5,associ:[0,3,4],associatd:3,attribut:0,audet:[2,4],auth:3,authentif:3,author:4,authpassword:3,auto:[3,5],autom:[1,3],automat:[3,4,5],avail:[0,3,4,5],averag:[1,3],ax0:0,ax1:0,ax2:0,ax3:0,axes:0,axi:0,axrc1:0,axrc2:0,axrc3:0,axrc4:0,axsc1:0,axsc2:0,axsc3:0,axsc4:0,axt:0,axvlin:0,azimuth:[0,5],back:0,backazimuth:5,bandpass:[],bar:0,barruol:2,base:[0,1,3,5],bash:3,basic:1,baz:[0,5],been:[0,1,3,4,5],befor:[3,5],behaviour:3,below:1,best:[0,5],between:[0,3,5],bgr:3,bokelmann:2,bool:0,both:[0,3],box:[0,5],build:0,bulletin:2,bundl:1,button:0,cageo:2,calc:[1,3,5],calc_snr:0,calcul:[0,3,5],call:0,can:[0,1,3,4,5],canada:2,care:3,carri:[0,5],chan:[0,3,5],chang:5,channel:[0,5],charg:4,check:[0,1,5],choos:5,circl:[0,3],cite:1,claim:4,classif:5,click:5,client:[0,3,5],clone:4,close:5,code:[3,5],collect:3,column:5,com:4,comma:3,common:0,comp:0,compat:3,compon:[0,3,5],comput:2,conda:1,condit:4,confid:0,connect:[3,4],consid:[3,5],contain:[0,3,5],contamin:5,content:0,contour:0,contract:4,control:[2,5],convent:0,coordin:0,copi:4,copyright:4,core:0,corner:[0,3],correct:[0,5],correl:[0,3,5],correspond:[0,5],creat:[1,4],criteria:5,current:[0,4],custom:[4,5],dai:[3,5],damag:4,dat:5,data:[0,1,3],databas:[0,1,3],datacent:3,datadisk:5,datalqt:0,dataset:3,datazn:0,date:3,daysac:5,ddt:[0,3],deal:4,defin:[0,3,5],deg:[0,5],degre:[0,3,5],delai:[0,3],denot:5,dep:[0,5],depend:1,depth:[0,5],desir:3,detail:1,detect:2,determin:[0,5],develop:1,diagnost:[0,3,5],diagplot:1,dict:0,dictionari:[0,3],differ:[0,1,5],direct:0,directori:[0,3],disagre:3,discard:5,disk:[3,5],displai:[0,5],display_meta:0,display_null_qu:0,display_result:0,dist:[3,5],distanc:[0,3],distribut:4,document:4,dof:0,doi:[2,4],done:[1,5],download:[0,1,3],download_data:0,dphi:[0,3,5],dst:3,dts:0,dtt:0,dttsc:0,due:0,durat:0,dure:3,each:[0,3,5],earthquak:0,east:0,edtt:0,either:[0,3],elev:5,elimin:5,emat:0,ematrix:0,enabl:1,end:[0,3,5],endt:3,endtim:5,energi:0,enter:3,environ:[1,2],ephi:0,epi:5,epi_dist:0,epicent:0,epicentr:0,equal:0,err:0,err_contour:0,err_dtt:0,err_phi:0,errc:0,error:[0,5],estiam:[],estim:[0,3,5],etc:5,eth:3,event:[0,3,4,5],everi:3,examin:5,exampl:[1,5],exceed:5,exclud:3,execut:1,exist:[3,5],exit:3,express:4,f_result:5,fair:[0,3,5],fals:[0,3,5],fast:[0,3,5],field:0,fig:[0,3,5],figur:[0,5],file:[0,3,4,5],filenam:3,fill:0,filter:[0,3],find:0,first:[0,5],fisher:0,fit:[0,4,5],flag:[3,5],fly:3,fmax:[0,3,5],fmin:[0,3,5],foat:0,folder:[3,5],follow:[0,4,5],forc:3,forg:4,format:0,found:5,fourth:5,fpathmatch:0,frame:5,framework:3,free:4,freedom:0,frequenc:[0,3,5],from:[0,1,3,5],furnish:4,further:[0,3,5],futur:5,g38118:2,gac:[0,5],gacmax:0,gacmin:0,gener:0,geologi:2,geometri:3,geonet:3,geoscienc:2,get:1,get_data_nez:[],get_qual:0,gfz:3,git:[2,4],github:[1,4],given:[0,3],good:[0,3,5],grant:4,graphic:5,great:[0,3],gui:[1,5],handl:0,has:[0,1,3,4,5],help:3,here:0,herebi:4,hhe:5,hhn:5,hhz:5,holder:4,horizont:0,http:[2,4],hypocent:0,iasp91:5,implement:[0,3],impli:4,improv:5,inc:0,incid:[0,5],includ:[3,4,5],increas:3,increment:3,indb:3,individu:3,info:[0,5],inform:[0,5],ingv:3,inherit:2,initi:0,insid:4,instal:1,instanc:3,instead:3,interact:[0,5],interfac:[3,5],internet:3,interv:0,ipgp:3,iri:[3,5],is_nul:0,its:4,januari:5,jgr:0,keep:[0,5],kei:[3,5],kind:4,koeri:3,lag:0,lat:[0,5],later:3,latitud:[0,5],lcldr:0,left:5,length:[3,5],let:5,letter:0,level:0,liabil:4,liabl:4,licenc:1,limit:[3,4],line:5,link:1,list:[0,3,5],list_local_data_stn:0,lithospher:2,lmu:3,load:[3,5],lobs3:5,loc:5,local:[0,3,5],localdata:3,locat:5,log:3,logfil:5,lon:[0,5],longitud:[0,5],longitudin:0,lqt:[0,5],ls_stdb:5,made:5,mag:[0,3,5],magnitud:[0,3,5],mai:[3,5],main:0,manual:[1,3],map:5,match:[0,3],matlab:[1,2],matrix:0,max:3,maxdist:3,maxdt:[0,3],maximum:[0,3],maxmag:3,measur:[2,3,5],merchant:4,merg:4,messag:[0,3,5],meta:[1,5],metadata:[0,5],method:[0,3,5],metnod:[],min:3,mindist:3,minim:0,minimum:[0,3,5],minmag:3,miscellan:3,misfit:0,miss:[0,3],mnt:5,mode:[1,3,5],model:5,modifi:4,modul:1,more:[1,3],most:[3,5],motion:[0,5],msnr:3,must:3,name:[0,3],nan:[0,3],ncedc:3,ndarrai:0,ndval:0,need:5,negat:3,neip:3,neotecton:2,neri:3,net:[0,3],network:[0,1,3,5],new_sampling_r:3,new_sr:0,newli:[0,4],nez:0,nois:0,non:[0,3,5],none:[0,3,5],noninfring:4,north:0,northwestern:2,note:[0,5],notic:4,number:0,object:0,obspi:[0,4,5],obtain:[3,4],occur:5,odc:3,older:3,oldest:3,onc:[1,5],one:[0,1,3,5],onli:[0,3,5],open:[0,5],option:[3,4,5],order:[3,5],orfeu:3,org:[2,4],origin:[0,5],other:[0,3,4],otherwis:4,out:[0,1,4,5],outsid:5,over:3,overrid:3,overwrit:[0,3,5],own:5,packag:4,pair:3,panel:5,paramet:[0,1,3,5],parse_localdata_for_comp:0,partial:[3,5],particl:[0,5],particular:[4,5],pascal:4,pass:5,password:3,path:[0,3,5],paudetsei:4,perform:3,permiss:4,permit:4,person:4,phase:[0,3,5],phi:[0,5],phi_min:0,phisc:0,pick:[0,1,3],pickl:[3,5],pickplot:1,pip:4,pkl:[3,5],place:5,pleas:4,plot:[0,1,3,5],plot_diagnost:0,plot_lqt_phas:0,png:0,point:0,polar:5,poor:[0,3,5],pop:5,portion:4,posit:[3,5],possibl:5,pre:[3,5],precis:3,predict:0,preferenti:3,present:[3,5],prevent:3,previou:5,previous:5,print:[0,5],proce:[0,3,5],process:[1,3],produc:[1,3,5],program:[3,5],prompt:[3,5],provid:[3,4,5],publish:4,purpos:4,pvh:0,pypi:1,pyqt5:[0,4],python:[1,3,4],qt5:0,qualiti:[0,3,5],query_fdsn_stdb:5,quick:1,radial:[0,3,5],rang:3,rate:[0,3],rather:3,ratio:0,raw:0,rc_re:0,recalc:5,recent:[3,5],recommend:4,recurs:0,red:5,refer:1,refin:[0,1,3,5],region:0,remain:4,repeat:[0,3],repositori:[1,4],repres:[0,3,5],request:[0,3,5],requir:[4,5],resif:3,restrict:[3,4],result:[1,3,5],retain:5,retriev:5,revers:3,rho:5,right:4,rotat:[0,3,5],routin:0,row:5,rtrace:0,run:5,sac:3,sampl:[0,3],save:[0,3,5],sc_nons_g:5,sc_re:0,scedc:3,schaeffer:[2,4],screen:0,script:[1,5],search:[3,5],sec:[0,3],second:5,see:[0,5],seismic:[0,5],seismogram:[0,3,5],seismolog:2,select:[3,5],sell:4,send:5,separ:[0,3,5],server:3,servic:3,set:[0,3,5],sever:[3,5],shall:4,shear:[0,1,2,3,5],shift:[0,5],show:[0,1,3,5],shown:1,signal:[0,5],silver:[0,3,5],simpl:0,simpli:[0,5],sinc:5,singl:[0,3],skip:[3,5],skk:[3,5],slow:[0,5],snr:[0,3,5],snrh:0,snrq:[0,5],snrt:[3,5],snrtlim:[0,3],societi:2,softwar:[1,4],sole:2,some:4,sometim:3,sort:0,sourc:1,space:0,specif:5,specifi:[3,5],split:[1,2,3,4,5],split_averag:[1,5],split_calc_auto:[1,5],split_calc_manu:[1,5],split_dof:0,split_errorrc:0,split_errorsc:0,split_rotcorr:0,split_silverchan:0,splite:3,splitlab:[1,2,3],splitpi:[0,1,2,3],sta:0,start:[0,1,3,5],startim:5,startt:3,starttim:5,station:[0,1,3],statu:5,stdata:0,stdb:[0,1,2,3,4],still:3,stkei:3,store:0,str:0,stream:0,string:[0,3],structur:5,subject:4,sublicens:4,subsequ:[3,5],substanti:4,success:0,successfulli:[],suitabl:5,summar:5,summari:[0,5],support:0,surfac:[0,5],system:0,take:[0,5],tangenti:[0,5],taup:0,taupymodel:0,teleseism:[0,1,3],temporarili:0,termin:5,test:[0,4],text:[0,5],tgtn:5,tgtn_rc:5,than:3,thei:[3,5],them:[3,5],therefor:0,thi:[0,3,4,5],third:5,those:3,three:[0,3,5],threshold:[0,3,5],through:5,time:[0,3,4,5],togeth:3,tool:1,toolbox:1,top:5,tort:4,total:3,toward:3,tp1:0,tp2:0,trace:[0,5],traceshift:0,transform:0,transport:1,transvers:[0,3],travel:0,tre:0,trfast:0,trn:0,trq:0,trq_c:0,trslow:0,trt:0,trt_c:0,trz:0,tshift:0,tutori:1,two:[0,1,3,5],type:[0,3,5],uniform:5,uniformli:5,updat:[0,5],update_lqt:0,usag:1,usarrai:1,use:[3,4,5],used:[0,3,5],user:[3,5],userauth:3,usernam:3,uses:[0,1,3,5],usg:3,using:[1,3,4,5],usp:3,utcdatetim:[0,3],util:1,valu:[0,3,5],verbiag:0,verbos:[0,3,5],version:[0,3,4],vertic:[0,5],visual:5,wai:3,walsh:0,warranti:4,wave:[0,1,2,3,5],waveform:[1,5],well:5,where:[1,4,5],whether:[0,4,5],which:[0,3,5],whom:4,widget:0,window:[0,1,3,5],wish:5,within:[3,5],without:4,work:[3,4],wrap:3,wustefeld:[1,2,3],year:5,yes:0,you:[4,5],your:[3,4,5],yyyymmdd_hrmnsc:5,zenodo:4,zero:3,zeroli:2,zne:[0,5],zne_data:[],zrt:0},titles:["Classes","Documentation","GitHub Repositories","Scripts","Licence","Tutorials"],titleterms:{"class":0,analysi:5,autom:5,averag:5,basic:4,calc:0,cite:4,conda:4,creat:5,data:5,databas:5,depend:4,descript:3,diagplot:0,document:1,download:5,environ:4,from:4,github:2,gui:0,instal:4,licenc:4,manual:5,meta:0,modul:0,pick:5,pickplot:0,process:5,pypi:4,refer:2,repositori:2,result:0,script:3,sourc:4,split:0,split_averag:3,split_calc_auto:3,split_calc_manu:3,splitpi:4,station:5,stdb:5,tutori:5,usag:[3,4],util:0}}) \ No newline at end of file +Search.setIndex({"alltitles":{"API Documentation":[[1,null]],"Automated analysis":[[5,"automated-analysis"]],"Citing SplitPy":[[2,"citing-splitpy"]],"Classes":[[0,null]],"Conda environment":[[4,"conda-environment"]],"Creating the StDb Database":[[5,"creating-the-stdb-database"]],"Dependencies":[[4,"dependencies"]],"Description":[[3,"description"],[3,"id1"],[3,"id3"]],"DiagPlot":[[0,"diagplot"]],"Documentation":[[1,null]],"Downloading and Processing":[[5,"downloading-and-processing"]],"Downloading data":[[5,"downloading-data"]],"GUI classes":[[0,"module-splitpy.gui"]],"Getting Started":[[1,null]],"GitHub Repositories":[[2,null]],"Installation":[[4,"installation"]],"Installing from GitHub development branch":[[4,"installing-from-github-development-branch"]],"Installing from source":[[4,"installing-from-source"]],"Licence":[[4,null]],"Manual analysis":[[5,"manual-analysis"]],"Meta":[[0,"meta"]],"Modules":[[0,"modules"]],"PickPlot":[[0,"pickplot"]],"Quick Links":[[1,null]],"Re-Processing":[[5,"re-processing"]],"Re-picking":[[5,"re-picking"]],"References":[[2,"references"]],"Result":[[0,"result"]],"Scripts":[[3,null]],"Scripts & Tutorials":[[1,null]],"Split":[[0,"split"]],"Station Metadata":[[4,"station-metadata"]],"Station average":[[5,"station-average"]],"Tutorials":[[5,null]],"Usage":[[3,"usage"],[3,"id2"],[3,"id4"]],"Using local data":[[4,"using-local-data"]],"Waveform Data":[[4,"waveform-data"]],"calc":[[0,"module-splitpy.calc"]],"split_average":[[3,"split-average"]],"split_calc_auto":[[3,"split-calc-auto"]],"split_calc_manual":[[3,"split-calc-manual"]],"utils":[[0,"module-splitpy.utils"]]},"docnames":["api","index","links","scripts","splitpy","tutorials"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["api.rst","index.rst","links.rst","scripts.rst","splitpy.rst","tutorials.rst"],"indexentries":{},"objects":{"splitpy":[[0,0,0,"-","calc"],[0,0,0,"-","gui"],[0,0,0,"-","utils"]],"splitpy.calc":[[0,1,1,"","split_RotCorr"],[0,1,1,"","split_SilverChan"],[0,1,1,"","split_dof"],[0,1,1,"","split_errorRC"],[0,1,1,"","split_errorSC"],[0,1,1,"","tshift"]],"splitpy.classes":[[0,2,1,"","DiagPlot"],[0,2,1,"","Meta"],[0,2,1,"","PickPlot"],[0,2,1,"","Result"],[0,2,1,"","Split"]],"splitpy.classes.DiagPlot":[[0,3,1,"","fd"],[0,4,1,"","plot_diagnostic"],[0,4,1,"","save"],[0,3,1,"","split"]],"splitpy.classes.Meta":[[0,3,1,"","align"],[0,3,1,"","az"],[0,3,1,"","baz"],[0,3,1,"","ddt"],[0,3,1,"","dep"],[0,3,1,"","dphi"],[0,3,1,"","epi_dist"],[0,3,1,"","gac"],[0,3,1,"","inc"],[0,3,1,"","lat"],[0,3,1,"","lon"],[0,3,1,"","mag"],[0,3,1,"","maxdt"],[0,3,1,"","ph"],[0,3,1,"","rotated"],[0,3,1,"","slow"],[0,3,1,"","time"],[0,3,1,"","ttime"],[0,3,1,"","zcomp"]],"splitpy.classes.PickPlot":[[0,3,1,"","fp"],[0,3,1,"","ll"],[0,4,1,"","plot_LQT_phases"],[0,4,1,"","save"],[0,3,1,"","split"],[0,4,1,"","update_LQT"]],"splitpy.classes.Result":[[0,3,1,"","Emat"],[0,3,1,"","dtt"],[0,3,1,"","edtt"],[0,3,1,"","ephi"],[0,3,1,"","errc"],[0,3,1,"","phi"],[0,3,1,"","phi_min"],[0,3,1,"","trFast"],[0,3,1,"","trQ_c"],[0,3,1,"","trSlow"],[0,3,1,"","trT_c"]],"splitpy.classes.Split":[[0,3,1,"","RC_res"],[0,3,1,"","SC_res"],[0,4,1,"","add_data"],[0,4,1,"","add_event"],[0,4,1,"","analyze"],[0,4,1,"","calc_snr"],[0,3,1,"","dataLQT"],[0,3,1,"","dataZ12"],[0,3,1,"id1","dataZNE"],[0,4,1,"","display_meta"],[0,4,1,"","display_null_quality"],[0,4,1,"","display_results"],[0,4,1,"","download_data"],[0,4,1,"","get_quality"],[0,4,1,"","is_null"],[0,3,1,"","meta"],[0,3,1,"","null"],[0,3,1,"","quality"],[0,4,1,"","rotate"],[0,4,1,"","save"],[0,3,1,"","snrh"],[0,3,1,"","snrq"],[0,3,1,"","sta"]],"splitpy.gui":[[0,2,1,"","Keep"],[0,2,1,"","Pick"],[0,2,1,"","Repeat"],[0,2,1,"","Save"]],"splitpy.utils":[[0,1,1,"","download_data"],[0,1,1,"","traceshift"]]},"objnames":{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},"objtypes":{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},"terms":{"":[0,3,5],"0":[0,3,4,5],"00":5,"000":5,"000000":5,"002":2,"01":5,"0120060190":2,"02":[0,3],"03":5,"03806173520674":5,"04":5,"05":5,"052":[],"07":5,"071":5,"08":2,"080":5,"1":[0,2,3,5],"10":[2,3,4,5],"10000":5,"100000z":5,"1016":2,"107273z":5,"11":0,"110000z":5,"111":[],"1130":2,"12":[4,5],"120":[0,3],"1204":2,"1211":2,"128":5,"13":5,"136":5,"14":5,"141":[],"15":[0,5],"167":5,"17":5,"176":5,"1785":2,"18":5,"180":0,"18t03":5,"19":5,"1990":0,"1f":5,"2":[0,3,4,5],"20":5,"2007":2,"2008":[1,2],"2013":[0,5],"2016":[2,5],"20160302_124948":5,"20160401_192455":5,"20160403_082352":5,"20160406_065848":5,"20160407_033253":5,"20160413_135517":5,"20160414_215027":5,"20160428_193324":5,"20160527_040843":5,"20160607_191515":[],"20160619_094723":[],"20160713_121112":[],"20160924_212841":[],"20170819_020052":[],"20170926_042000":[],"20180728_170723":[],"20180819_042858":[],"20180906_154914":[],"20180910_041902":[],"20180910_193137":[],"20180916_211148":[],"20181016_002812":[],"2019":4,"20190531_101232":[],"20190616_051716":[],"20190707_150840":[],"20190731_150233":[],"20190929_020251":[],"20191031_011119":[],"2020":[4,5],"20200318_031345":5,"2025":0,"21":[],"22":5,"23":0,"241":5,"25":5,"27":5,"27269":5,"2727":5,"3":[0,4,5],"30":0,"332":4,"34":[2,5],"3564780":2,"36765404740968":5,"369472":0,"369480":0,"37":5,"38":5,"39":5,"4":[0,3,5],"41":5,"44":2,"45":5,"47":0,"5":[0,3,5],"51":5,"51340359244245":5,"515":2,"5267":5,"52670":5,"528":2,"5281":2,"53":5,"6":[3,5],"61":5,"63":5,"68":5,"7":[4,5],"729":[],"742000z":5,"75":5,"76":5,"78":5,"8":5,"802":5,"807":2,"81":5,"810":2,"82":5,"85":[0,3],"87":5,"8889144288134":5,"89":5,"891":[],"921":5,"94":5,"97":2,"A":[0,2,4,5],"AND":4,"AS":4,"As":5,"BE":4,"BUT":4,"Be":3,"By":5,"FOR":4,"For":[3,4,5],"IN":4,"If":[2,3,4,5],"In":5,"It":[0,5],"NO":4,"NOT":4,"No":[3,5],"OF":4,"OR":4,"THE":4,"TO":4,"The":[0,1,3,4,5],"There":[3,4,5],"These":[0,3],"To":[4,5],"WITH":4,"_":[3,5],"__":[3,5],"___":[3,5],"_____":[3,5],"abov":4,"absent":4,"absolut":3,"accept":0,"access":3,"accompani":3,"action":4,"activ":[2,4],"ad":0,"add":0,"add_data":0,"add_ev":0,"after":[0,3,5],"against":3,"aggreg":1,"al":1,"align":0,"all":[0,3,4,5],"along":[4,5],"alreadi":3,"also":[0,4,5],"altern":[0,5],"altnet":[],"america":2,"an":[0,1,3,4,5],"analysi":[0,1,3],"analyz":[0,1,3],"andrew":4,"angl":[0,3],"angular":0,"ani":[3,4],"anwer":0,"appear":4,"appli":[0,5],"applic":[0,3],"ar":[0,1,3,5],"arc":0,"archiv":[0,3,4],"argument":[3,4,5],"aris":4,"arriv":[0,3,5],"ask":5,"associ":[0,3,4],"associatd":3,"attribut":0,"audet":[2,4],"auspass":3,"auth":3,"authent":3,"authentif":3,"author":4,"authpassword":3,"auto":[3,5],"autom":[1,3],"automat":[3,4,5],"avail":[0,3,4,5],"averag":[1,3],"ax":0,"ax0":0,"ax1":0,"ax2":0,"ax3":0,"axi":0,"axrc1":0,"axrc2":0,"axrc3":0,"axrc4":0,"axsc1":0,"axsc2":0,"axsc3":0,"axsc4":0,"axt":0,"axvlin":0,"az":[0,5],"azimuth":[0,5],"back":0,"backazimuth":5,"bar":0,"barruol":2,"base":[0,1,3,5],"bash":3,"baz":[0,5],"been":[0,1,3,4,5],"befor":[3,5],"behaviour":3,"below":[1,4],"best":[0,5],"between":[0,3,4,5],"bgr":3,"bokelmann":2,"bool":0,"boolean":0,"both":[0,3,4],"box":[0,5],"branch":1,"build":0,"bulletin":2,"bundl":1,"button":0,"c":[2,4,5],"cageo":2,"calc":[1,3,5],"calc_snr":0,"calcul":[0,3,5],"call":0,"can":[0,1,3,4,5],"canada":2,"care":3,"carri":[0,5],"case":[3,5],"caseher":[],"catalogu":5,"cd":4,"chan":[0,3,4,5],"chang":5,"channel":[3,4,5],"charact":[0,4],"charg":4,"check":[0,1,4,5],"choos":5,"circl":[0,3],"cite":1,"claim":4,"class":1,"classif":5,"click":5,"client":[0,3,4,5],"clone":4,"close":5,"code":[3,4,5],"collect":3,"column":5,"com":4,"comma":3,"command":4,"common":0,"comp":[],"compat":3,"compon":[0,3,5],"comput":2,"conda":1,"condit":4,"confid":0,"connect":4,"consid":[0,3,5],"contain":[0,3,4,5],"contamin":5,"content":0,"contour":0,"contract":4,"control":[2,5],"convent":[],"convert":4,"coordin":0,"copi":4,"copyright":4,"core":0,"corner":[0,3],"correct":[0,3,5],"correl":[0,3,5],"correspond":[0,4,5],"creat":[1,4],"criteria":5,"current":[0,4],"custom":4,"d":[0,3,4,5],"dai":[3,4,5],"damag":4,"dat":5,"data":[0,1,3],"databas":[0,1,3],"datacent":3,"datadisk":5,"dataless":4,"datalqt":0,"dataset":3,"dataz12":0,"datazn":0,"date":3,"daysac":5,"db":[0,3,5],"ddt":[0,3],"de":3,"deal":4,"default":[1,3,5],"defin":[0,3],"deg":[0,5],"degre":[0,3,5],"delai":[0,3],"denot":5,"dep":[0,5],"depend":[1,3],"depth":[0,5],"desir":3,"detail":[1,3,4],"detect":2,"determin":[0,5],"develop":1,"diagnost":[0,3,5],"diagplot":1,"dict":0,"dictionari":[0,3],"differ":[0,1,5],"direct":0,"directori":3,"discard":5,"disk":[3,5],"displai":[0,5],"display_meta":0,"display_null_qu":0,"display_result":0,"dist":[3,5],"distanc":[0,3],"distribut":4,"do":4,"doc":3,"document":4,"doe":4,"dof":0,"doi":[2,4],"don":4,"done":[1,5],"dot":4,"download":[0,1,3],"download_data":0,"dphi":[0,3,5],"drive":4,"dst":3,"dt":[0,3,5],"dtt":0,"dttsc":0,"dtype":[3,4],"due":[],"durat":0,"dure":[0,3],"e":[0,3,4,5],"each":[0,3,5],"earthquak":0,"earthscop":3,"east":0,"edtt":0,"edu":3,"eida":3,"either":[0,3],"elev":5,"elimin":5,"emat":0,"ematrix":0,"emsc":3,"enabl":1,"end":[0,3,5],"endt":3,"endtim":5,"energi":0,"enter":[],"environ":[1,2],"ephi":0,"epi":5,"epi_dist":0,"epicent":0,"epicentr":0,"equal":0,"err":0,"err_contour":0,"err_dtt":0,"err_phi":0,"errc":0,"error":[0,5],"estim":[0,3,5],"et":1,"etc":5,"eth":3,"event":[0,3,4,5],"everi":3,"exactli":4,"examin":5,"exampl":[1,4,5],"exceed":5,"exclud":3,"execut":1,"exist":[3,5],"exit":3,"express":4,"extens":[3,4],"f":0,"f_event":5,"f_result":5,"fair":[0,3,5],"fals":[0,3,5],"fast":[0,3,5],"fd":0,"fdsn":[0,3,4],"field":[0,4],"fig":[0,3,5],"figur":[0,5],"file":[0,3,4,5],"filenam":[3,4],"fill":[],"filter":[0,3],"final":[3,4,5],"find":[],"first":[4,5],"fisher":0,"fit":[0,4,5],"flag":3,"float":0,"fly":3,"fmax":[0,3,5],"fmin":[0,3,5],"foat":0,"folder":[3,4,5],"follow":[0,4,5],"forc":3,"forg":4,"form":3,"format":[0,3],"found":5,"fourth":5,"fp":0,"fpathmatch":[],"frame":5,"framework":3,"free":4,"freedom":0,"frequenc":[0,3,5],"from":[0,1,3,5],"fulli":0,"function":0,"furnish":4,"further":[0,3,5],"futur":5,"g":[2,3,4],"g38118":2,"gac":[0,5],"gacmax":0,"gacmin":0,"gen_stdb":4,"gener":0,"geofon":3,"geologi":2,"geometri":3,"geonet":3,"geoscienc":2,"get":0,"get_qual":0,"gfz":3,"git":[2,4],"github":1,"given":[0,3],"good":[0,3,5],"grant":4,"graphic":5,"great":[0,3],"grid":0,"ground":0,"gui":[1,5],"h":3,"ha":[0,1,3,4,5],"handl":0,"hard":4,"have":[0,3,4],"help":3,"here":[3,4],"herebi":4,"hh":5,"hhe":5,"hhn":5,"hhz":[4,5],"holder":4,"home":3,"horizont":0,"html":3,"http":[2,3,4],"hypocent":0,"hz":[0,3],"i":[0,1,3,4,5],"iasp91":5,"icgc":3,"identifi":[0,3],"ie":3,"iesdmc":3,"ignor":3,"implement":3,"impli":4,"improv":5,"inc":0,"incid":[0,5],"includ":[3,4,5],"increas":3,"increment":3,"indb":3,"index":3,"individu":3,"info":[0,5],"inform":[0,5],"ingv":3,"inherit":2,"initi":0,"input":4,"insid":4,"instal":1,"instanc":3,"instead":3,"instrument":0,"int":0,"interact":[0,5],"interfac":5,"internet":3,"interv":0,"ipgp":3,"iri":3,"irisph5":3,"is_nul":0,"isc":3,"its":4,"iu":3,"j":2,"januari":5,"jgr":0,"keep":[0,1,5],"kei":[3,5],"kind":4,"km":[0,5],"knmi":3,"koeri":3,"l":0,"lag":0,"lat":[0,5],"later":3,"latitud":[0,5],"lcldr":[],"left":5,"length":[0,3,5],"let":5,"letter":[],"level":0,"liabil":4,"liabl":4,"licenc":1,"like":4,"limit":[3,4],"line":5,"list":[0,3,5],"list_local_data_stn":[],"lithospher":2,"ll":0,"lmu":3,"load":[3,4,5],"loc":[4,5],"local":[0,1,3,5],"localdata":3,"locat":[4,5],"log":3,"logfil":5,"lon":[0,5],"long":[3,5],"longitud":[0,5],"longitudin":0,"lqt":[0,5],"ls_stdb":5,"m":0,"made":5,"mag":[0,3,5],"magnitud":[0,3,5],"mai":5,"main":[0,4],"manual":[1,3],"map":5,"match":3,"matlab":[1,2],"matrix":0,"max":3,"maxdist":3,"maxdt":[0,3],"maximum":[0,3],"maxmag":3,"measur":[2,3,5],"mechan":3,"merchant":4,"merg":4,"messag":[0,3,5],"meta":[1,5],"metadata":[0,1,5],"method":[0,3,5],"min":3,"mindist":3,"minim":0,"minimum":[0,3,5],"minise":4,"minmag":3,"miscellan":3,"misfit":0,"miss":[],"mnt":5,"mode":[1,3,5],"model":5,"modifi":4,"modul":1,"more":[1,3,4],"most":[3,5],"motion":[0,5],"mseed":[3,4],"msnr":3,"must":[3,4],"mw":5,"n":[0,4,5],"name":[0,3],"nan":[],"ncedc":3,"ndarrai":0,"ndval":[],"negat":3,"neip":[],"neotecton":2,"neri":[],"net":4,"network":[1,3,4,5],"new":[0,3,5],"new_sampling_r":3,"new_sr":0,"newli":[0,4],"nez":0,"niep":3,"noa":3,"node":3,"nois":0,"non":[0,3,5],"none":[0,3,5],"noninfring":4,"norsar":3,"north":0,"northwest":1,"northwestern":2,"note":[0,3,4,5],"notic":4,"nrcan":3,"null":[0,2,3,5],"number":0,"ny":[4,5],"o":[3,5],"object":0,"obspi":[0,4,5],"obtain":[3,4],"occur":5,"odc":3,"older":3,"oldest":3,"onc":[1,5],"one":[1,3,4,5],"onli":[0,3,4,5],"open":[0,5],"option":[3,5],"order":[3,5],"orfeu":3,"org":2,"orient":0,"orientpi":4,"origin":[0,5],"other":[0,3,4],"otherwis":4,"out":[0,1,4,5],"output":0,"outsid":5,"over":3,"overrid":3,"overwrit":[0,3,5],"p":[0,2],"packag":4,"pad":4,"pair":3,"panel":5,"paramet":[0,1,3,5],"parse_localdata_for_comp":[],"partial":[3,5],"particl":[0,5],"particular":[4,5],"pascal":4,"pass":5,"password":3,"path":[3,5],"paudetsei":4,"per":4,"perform":[0,3],"permiss":4,"permit":4,"person":4,"pgp":3,"ph":0,"phase":[0,3,5],"phi":[0,5],"phi_min":0,"phisc":0,"php":3,"pick":[0,1,3],"pickl":[3,5],"pickplot":1,"pip":4,"pk":5,"pkl":[3,4,5],"place":5,"pleas":2,"plot":[0,1,3,5],"plot_diagnost":0,"plot_lqt_phas":0,"png":0,"point":0,"polar":5,"poor":[0,3,5],"pop":5,"portion":4,"posit":[3,5],"possibl":5,"possibli":5,"potsdam":3,"pre":[3,5],"preced":3,"precis":3,"predict":0,"preferenti":[],"present":5,"previou":5,"previous":5,"print":[0,5],"proce":[0,3,5],"process":[1,3],"produc":[1,3,5],"program":[3,5],"prompt":[3,5],"provid":[3,4,5],"publish":4,"purpos":4,"pvh":0,"pyqt5":[0,4],"python":[1,3,4],"q":[0,3,5],"qt5":0,"qualiti":[0,3,5],"query_fdsn_stdb":5,"radial":[0,3,5],"rang":3,"raspishak":3,"rate":[0,3],"ratio":0,"raw":0,"rc":[0,3,5],"rc_re":0,"re":3,"read":4,"recalc":5,"recent":[3,5],"recogn":3,"recommend":4,"recurs":[],"red":5,"refer":1,"refin":[0,1,3,5],"region":0,"remain":4,"remov":0,"remove_respons":0,"repeat":[0,1,3],"repositori":[1,4],"repres":[0,3,5],"request":[0,3,5],"requir":[4,5],"resif":3,"resifph5":3,"resitut":0,"respons":0,"restrict":[3,4],"result":[1,3,5],"retain":5,"retriev":5,"return":0,"revers":3,"rfpy":4,"rfpy_calc":4,"rho":5,"right":4,"rotat":[0,3,5],"routin":0,"row":5,"rtrace":0,"run":[0,4,5],"sac":[3,4],"sampl":[0,3],"saniti":0,"save":[0,1,3,5],"sc":[0,3,5],"sc_nons_g":5,"sc_re":0,"scedc":3,"schaeffer":[2,4],"schaefferaj":4,"screen":0,"script":[4,5],"sd":[0,3,4],"search":[0,3,5],"sec":[0,3],"second":5,"see":[0,3,5],"seed":4,"seiscomp":[3,4],"seiscomp3":3,"seismic":[0,5],"seismogram":[0,3,5],"seismograph":1,"seismolog":2,"select":[3,5],"sell":4,"send":5,"separ":[3,5],"server":[3,5],"servic":[0,3,4],"set":[0,3,5],"sever":3,"shall":4,"shear":[0,1,2,3,5],"shift":[0,5],"should":[0,4],"show":[0,1,3,5],"shown":1,"signal":[0,5],"silver":[0,3,5],"simpl":0,"simpli":[0,4,5],"sinc":5,"singl":[0,3],"sk":[0,1,3,5],"skip":[3,5],"skk":[3,5],"slarchiv":3,"slow":[0,5],"snr":[0,3,5],"snrh":0,"snrq":[0,5],"snrt":[3,5],"snrtlim":[0,3],"so":[3,4],"societi":2,"softwar":[1,4],"sole":2,"some":4,"sort":[],"sourc":1,"space":0,"specif":5,"specifi":[3,5],"split":[1,2,3,4,5],"split_averag":[1,5],"split_calc_auto":[1,5],"split_calc_manu":[1,5],"split_dof":0,"split_errorrc":0,"split_errorsc":0,"split_rotcorr":0,"split_silverchan":0,"splite":3,"splitlab":[1,2,3],"splitpi":[0,1,3,4],"st":[],"sta":[0,4],"start":[0,3,5],"startim":5,"startt":3,"starttim":5,"station":[0,1,3],"statu":5,"stdata":[],"stdb":[0,1,2,3,4],"still":3,"stkei":3,"store":[0,4],"str":0,"stream":0,"string":[0,3],"structur":[3,4,5],"subject":4,"sublicens":4,"subsequ":[3,5],"substanti":4,"success":0,"suitabl":5,"summar":5,"summari":[0,5],"support":[],"surfac":[0,5],"system":0,"t":[0,4,5],"t1":0,"t2":0,"take":[3,5],"tangenti":[0,5],"taup":0,"taupymodel":0,"teleseism":[0,1,3],"temporarili":0,"termin":5,"test":[0,4],"texnet":3,"text":[0,5],"tgtn":[4,5],"tgtn_rc":5,"thei":[3,5],"them":[3,5],"therefor":0,"thi":[0,3,4,5],"third":5,"those":[3,4],"three":[0,3,5],"threshold":[0,3,5],"through":[4,5],"time":[0,3,5],"togeth":3,"token":3,"tokenfil":3,"tool":[1,4],"toolbox":1,"top":5,"tort":4,"total":3,"toward":3,"tp1":0,"tp2":0,"tr":0,"trace":[0,5],"traceshift":0,"transform":0,"transvers":[0,3],"travel":0,"tre":0,"trfast":0,"trn":0,"trq":0,"trq_c":0,"trslow":0,"trt":0,"trt_c":0,"true":[0,5],"trz":0,"tshift":0,"tt":0,"ttime":0,"two":[0,1,3,4,5],"type":[0,3,4,5],"uib":3,"un":[0,5],"uniform":5,"uniformli":5,"unknown":0,"up":5,"updat":[0,5],"update_lqt":0,"url":3,"us":[0,1,2,3,5],"user":[3,5],"userauth":3,"usernam":3,"usg":3,"usp":3,"utcdatetim":[0,3],"util":1,"v":[3,5],"valu":[3,5],"veloc":0,"verbiag":0,"verbos":[0,3,5],"version":[0,3,4],"vertic":[0,3,5],"visual":5,"wai":3,"walsh":0,"warranti":4,"wave":[0,1,2,3,5],"waveform":[1,3,5],"we":[4,5],"web":[0,3,4],"well":5,"where":[1,4,5],"whether":[0,4,5],"which":[0,3,4,5],"whom":4,"widget":0,"window":[0,1,3,5],"wish":5,"within":[3,5],"without":4,"work":[2,3],"wrap":3,"wustefeld":[1,2,3],"www":3,"x":5,"xml":4,"ye":[0,5],"year":[4,5],"you":[2,4,5],"your":[2,4],"yukon":1,"yyyymmdd_hrmnsc":5,"z":[0,3],"z12":0,"zcomp":[0,3],"zenodo":2,"zero":4,"zeroli":2,"zne":[0,5],"zrt":0},"titles":["Classes","Documentation","GitHub Repositories","Scripts","Licence","Tutorials"],"titleterms":{"analysi":5,"api":1,"autom":5,"averag":5,"branch":4,"calc":0,"cite":2,"class":0,"conda":4,"creat":5,"data":[4,5],"databas":5,"depend":4,"descript":3,"develop":4,"diagplot":0,"document":1,"download":5,"environ":4,"from":4,"get":1,"github":[2,4],"gui":0,"instal":4,"licenc":4,"link":1,"local":4,"manual":5,"meta":0,"metadata":4,"modul":0,"pick":5,"pickplot":0,"process":5,"quick":1,"re":5,"refer":2,"repositori":2,"result":0,"script":[1,3],"sourc":4,"split":0,"split_averag":3,"split_calc_auto":3,"split_calc_manu":3,"splitpi":2,"start":1,"station":[4,5],"stdb":5,"tutori":[1,5],"us":4,"usag":3,"util":0,"waveform":4}}) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index d02a695..78e26d8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -10,9 +10,9 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) +import os +import sys +sys.path.insert(0, os.path.abspath('../')) # -- Project information ----------------------------------------------------- @@ -22,28 +22,28 @@ author = 'Pascal Audet & Andrew Schaeffer' # The full version, including alpha/beta/rc tags -release = '0.0.1' - +from splitpy import __version__ as release # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.githubpages'] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon'] autodoc_member_order = 'bysource' html_logo = '../splitpy/examples/figures/SplitPy_logo.png' # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +# templates_path = ['_templates'] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +# The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # -- Options for HTML output ------------------------------------------------- @@ -53,23 +53,7 @@ # html_theme = 'sphinx_rtd_theme' -# html_theme_options = { -# 'canonical_url': '', -# 'analytics_id': 'UA-XXXXXXX-1', # Provided by Google in your dashboard -# 'logo_only': False, -# 'display_version': True, -# 'prev_next_buttons_location': 'bottom', -# 'style_external_links': False, -# 'vcs_pageview_mode': '', -# 'style_nav_header_background': 'white', -# # Toc options -# 'collapse_navigation': True, -# 'sticky_navigation': True, -# 'navigation_depth': 4, -# 'includehidden': True, -# 'titles_only': False -# } # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +# html_static_path = ['_static'] diff --git a/docs/index.rst b/docs/index.rst index 3f92d89..16b26a1 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -18,8 +18,8 @@ teleseismic shear-wave splitting analysis in two different modes: Once the splitting analysis has been done, the results can be aggregated to produce averaged splitting parameters and plotted (:ref:`splitaverage`). The tutorials below show an example using data -from `one station `_ of the -USArray Transportable Array network. +from `one station `_ of the +Yukon-Northwest Seismograph Network. .. note:: @@ -31,8 +31,6 @@ USArray Transportable Array network. :target: https://zenodo.org/badge/latestdoi/211722700 .. image:: https://travis-ci.org/paudetseis/SplitPy.svg?branch=master :target: https://travis-ci.org/paudetseis/ -.. image:: https://codecov.io/gh/paudetseis/SplitPy/branch/master/graph/badge.svg - :target: https://codecov.io/gh/paudetseis/SplitPy .. toctree:: :maxdepth: 1 diff --git a/docs/links.rst b/docs/links.rst index 375f72c..65c6768 100644 --- a/docs/links.rst +++ b/docs/links.rst @@ -15,4 +15,9 @@ References * Wustefeld, A., and Bokelmann, G. (2007). Null detection in shear-wave splitting measurements. Bulletin of the Seismological Society of America, 97, 1204-1211, https://doi.org/10.1785/0120060190 -* Wustefeld, A., Bokelmann, G., Zeroli, C., and Barruol, G. (2008). SplitLab: A shear-wave splitting environment in Matlab. Computers & Geoscience, 34, 515-528, https://doi.org/10.1016/j.cageo.2007.08.002 \ No newline at end of file +* Wustefeld, A., Bokelmann, G., Zeroli, C., and Barruol, G. (2008). SplitLab: A shear-wave splitting environment in Matlab. Computers & Geoscience, 34, 515-528, https://doi.org/10.1016/j.cageo.2007.08.002 + +Citing SplitPy +-------------- + +If you use SplitPy in your work, please cite the Zenodo DOI: https://doi.org/10.5281/zenodo.3564780 diff --git a/docs/scripts.rst b/docs/scripts.rst index 570e383..e831ae9 100644 --- a/docs/scripts.rst +++ b/docs/scripts.rst @@ -13,8 +13,8 @@ a station database provided as a :class:`~stdb.StDb` dictionary. .. _splitauto: -``split_calc_auto.py`` -++++++++++++++++++++++ +``split_calc_auto`` ++++++++++++++++++++ Description ----------- @@ -31,8 +31,19 @@ Usage .. code-block:: - $ split_calc_auto.py -h - usage: split_calc_auto.py [arguments] + $ split_calc_auto -h + + ################################################################### + # _ _ _ _ _ # + # ___ _ __ | (_) |_ ___ __ _| | ___ __ _ _ _| |_ ___ # + # / __| '_ \| | | __| / __/ _` | |/ __| / _` | | | | __/ _ \ # + # \__ \ |_) | | | |_ | (_| (_| | | (__ | (_| | |_| | || (_) | # + # |___/ .__/|_|_|\__|___\___\__,_|_|\___|___\__,_|\__,_|\__\___/ # + # |_| |_____| |_____| # + # # + ################################################################### + + usage: split_calc_auto [arguments] Script wrapping together the python-based implementation of SplitLab by Wustefeld and others. This version requests data on the fly for a given date @@ -53,53 +64,60 @@ Usage instance, providing IU will match with all stations in the IU network [Default processes all stations in the database] - -v, -V, --verbose Specify to increase verbosity. + -V, --verbose Specify to increase verbosity. -O, --overwrite Force the overwriting of pre-existing Split results. Default behaviour prompts for those that already exist. Selecting overwrite and skip (ie, both flags) negate each other, and both are set to false (every repeat is prompted). [Default False] - -K, --skip-existing Skip any event for which existing splitting results + --zcomp ZCOMP Specify the Vertical Component Channel Identifier. [Default Z]. + --skip-existing Skip any event for which existing splitting results are saved to disk. Default behaviour prompts for each event. Selecting skip and overwrite (ie, both flags) negate each other, and both are set to False (every repeat is prompted). [Default False] - -C, --calc Analyze data for shear-wave splitting. [Default saves + --calc Analyze data for shear-wave splitting. [Default saves data to folders for subsequent analysis] - -P, --plot-diagnostic + --plot-diagnostic Plot diagnostic window at end of process. [Default False] Server Settings: Settings associated with which datacenter to log into. - -S SERVER, --Server SERVER - Specify the server to connect to. Options include: - BGR, ETH, GEONET, GFZ, INGV, IPGP, IRIS, KOERI, LMU, - NCEDC, NEIP, NERIES, ODC, ORFEUS, RESIF, SCEDC, USGS, - USP. [Default IRIS] - -U USERAUTH, --User-Auth USERAUTH - Enter your IRIS Authentification Username and Password - (--User-Auth='username:authpassword') to access and - download restricted data. [Default no user and - password] + --server SERVER Base URL of FDSN web service compatible server (e.g. + “http://service.iris.edu”) or key string for recognized server (one + of 'AUSPASS', 'BGR', 'EARTHSCOPE', 'EIDA', 'EMSC', 'ETH', 'GEOFON', + 'GEONET', 'GFZ', 'ICGC', 'IESDMC', 'INGV', 'IPGP', 'IRIS', 'IRISPH5', + 'ISC', 'KNMI', 'KOERI', 'LMU', 'NCEDC', 'NIEP', 'NOA', 'NRCAN', + 'ODC', 'ORFEUS', 'RASPISHAKE', 'RESIF', 'RESIFPH5', 'SCEDC', + 'TEXNET', 'UIB-NORSAR', 'USGS', 'USP'). [Default 'IRIS'] + --user-auth USERAUTH Authentification Username and Password for the waveform server + (--user-auth='username:authpassword') to access and download + restricted data. [Default no user and password] + --eida-token TOKENFILE + Token for EIDA authentication mechanism, see http://geofon.gfz- + potsdam.de/waveform/archive/auth/index.php. If a token is provided, + argument --user-auth will be ignored. This mechanism is only + available on select EIDA nodes. The token can be provided in form of + the PGP message as a string, or the filename of a local file with the + PGP message in it. [Default None] Local Data Settings: - Settings associated with defining and using a local data base of pre- - downloaded day-long SAC files. + Settings associated with defining and using a local data base of pre-downloaded day-long + SAC or MSEED files. --local-data LOCALDATA - Specify a comma separated list of paths containing - day-long sac files of data already downloaded. If data - exists for a seismogram is already present on disk, it - is selected preferentially over downloading the data - using the Client interface - --no-data-zero Specify to force missing data to be set as zero, - rather than default behaviour which sets to nan. - --no-local-net Specify to prevent using the Network code in the - search for local data (sometimes for CN stations the - dictionary name for a station may disagree with that - in the filename. [Default Network used] + Specify absolute path to a SeisComP Data Structure (SDS) archive + containing day-long SAC or MSEED files(e.g., --local- + data=/Home/username/Data/SDS). See + https://www.seiscomp.de/seiscomp3/doc/applications/slarchive/SDS.html + for details on the SDS format. If this option is used, it takes + precedence over the --server settings. + --dtype DTYPE Specify the data archive file type, either SAC or MSEED. Note the + default behaviour is to search for SAC files. Local archive files + must have extensions of '.SAC' or '.MSEED'. These are case dependent, + so specify the correct case here. Parameter Settings: Miscellaneous default values and settings @@ -136,7 +154,7 @@ Usage the end time for the event search. This will override any station end times [Default end date of each station] - --reverse, -R Reverse order of events. Default behaviour starts at + --reverse Reverse order of events. Default behaviour starts at oldest event and works towards most recent. Specify reverse order and instead the program will start with the most recent events and work towards older @@ -158,8 +176,8 @@ Usage .. _splitmanual: -``split_calc_manual.py`` -++++++++++++++++++++++++ +``split_calc_manual`` ++++++++++++++++++++++ Description ----------- @@ -174,11 +192,22 @@ Usage .. code-block:: - $ split_calc_manual.py -h - usage: split_calc_manual.py [arguments] + $ split_calc_manual -h + + ################################################################################### + # _ _ _ _ _ # + # ___ _ __ | (_) |_ ___ __ _| | ___ _ __ ___ __ _ _ __ _ _ __ _| | # + # / __| '_ \| | | __| / __/ _` | |/ __| | '_ ` _ \ / _` | '_ \| | | |/ _` | | # + # \__ \ |_) | | | |_ | (_| (_| | | (__ | | | | | | (_| | | | | |_| | (_| | | # + # |___/ .__/|_|_|\__|___\___\__,_|_|\___|___|_| |_| |_|\__,_|_| |_|\__,_|\__,_|_| # + # |_| |_____| |_____| # + # # + ################################################################################### + + usage: split_calc_manual [arguments] Script to process and calculate the spliting parameters for a dataset that has - already been downloaded by split_calc_auto.py. + already been downloaded by split_calc_auto. positional arguments: indb Station Database to process from. @@ -220,15 +249,15 @@ Usage the end time for the event search. This will override any station end times [Default older end date for each the pair of stations] - --reverse-order, -R Reverse order of events. Default behaviour starts at + --reverse-order Reverse order of events. Default behaviour starts at oldest event and works towards most recent. Specify reverse order and instead the program will start with the most recent events and work towards older .. _splitaverage: -``split_average.py`` -++++++++++++++++++++ +``split_average`` ++++++++++++++++++ Description ----------- @@ -244,55 +273,57 @@ Usage .. code-block:: - $ split_average.py -h - usage: split_average.py [arguments] + $ split_average -h - Script to plot the average splitting results for a given station. Loads the - available .pkl files in the specified Station Directory. + ############################################################### + # _ _ _ # + # ___ _ __ | (_) |_ __ ___ _____ _ __ __ _ __ _ ___ # + # / __| '_ \| | | __| / _` \ \ / / _ \ '__/ _` |/ _` |/ _ \ # + # \__ \ |_) | | | |_ | (_| |\ V / __/ | | (_| | (_| | __/ # + # |___/ .__/|_|_|\__|___\__,_| \_/ \___|_| \__,_|\__, |\___| # + # |_| |_____| |___/ # + # # + ############################################################### - positional arguments: - indb Station Database to process from. + usage: split_average [arguments] - optional arguments: - -h, --help show this help message and exit - --keys STKEYS Specify a comma separated list of station keys for - which to perform analysis. These must be contained - within the station database. Partial keys will be used - to match against those in the dictionary. For - instance, providing IU will match with all stations in - the IU network [Default processes all stations in the - database] - -v, -V, --verbose Specify to increase verbosity. - --show-fig Specify show plots during processing - they are still - saved to disk. [Default only saves] - -A, --auto Specify to use automatically processed split results. - [Default uses refined ('manual') split results] + Script to plot the average splitting results for a given station. Loads the available .pkl + files in the specified Station Directory. + + positional arguments: + indb Station Database to process from. + + options: + -h, --help show this help message and exit + --keys STKEYS Specify a comma separated list of station keys for which to perform + analysis. These must be contained within the station database. Partial keys + will be used to match against those in the dictionary. For instance, + providing IU will match with all stations in the IU network [Default + processes all stations in the database] + -V, --verbose Specify to increase verbosity. + --show-fig Specify show plots during processing - they are still saved to disk. + [Default only saves] + --auto Specify to use automatically processed split results. [Default uses refined + ('manual') split results] Null Selection Settings: Settings associated with selecting which Null or Non-Null data is included - --nulls, --Nulls Specify this flag to include Null Values in the - average. [Default Non-Nulls only] - --no-nons, --No-Nons Specify this flag to exclude Non-Nulls from the - average [Default False] + --nulls Specify this flag to include Null Values in the average. [Default Non-Nulls + only] + --no-nons Specify this flag to exclude Non-Nulls from the average [Default False] Quality Selection Settings: - Settings associated with selecting the qualities to include in the - selection. + Settings associated with selecting the qualities to include in the selection. - --No-Good, --no-good Specify to exclude 'Good' measurements from the - average. [Default Good + Fair] - --No-Fair, --no-fair Specify to exclude 'Fair' measurements from the - average [Default Good + Fair] - --Poor, --poor Specify to include 'Poor' measurements in the average - [Default No Poors] + --no-good Specify to exclude 'Good' measurements from the average. [Default Good + + Fair] + --no-fair Specify to exclude 'Fair' measurements from the average [Default Good + + Fair] + --poor Specify to include 'Poor' measurements in the average [Default No Poors] Split Type Settings: Settings to Select which Split types are included in the selection. - --RC-Only, --rc-only, --RC-only - Specify to only include RC splits in the average. - [Default RC + SC] - --SC-Only, --sc-only, --SC-only - Specify to only include SC splits in the average. - [Default RC + SC] \ No newline at end of file + --RC-only Specify to only include RC splits in the average. [Default RC + SC] + --SC-only Specify to only include SC splits in the average. [Default RC + SC] \ No newline at end of file diff --git a/docs/splitpy.rst b/docs/splitpy.rst index 6028b45..b033199 100644 --- a/docs/splitpy.rst +++ b/docs/splitpy.rst @@ -30,7 +30,7 @@ Installation Dependencies ------------ -The current version has been tested using **Python > 3.6** \ +The current version has been tested using **Python = 3.12** \ Also, the following package is required: - `stdb `_ @@ -46,7 +46,7 @@ where ``SplitPy`` can be installed along with some of its dependencies. .. sourcecode:: bash - conda create -n split python=3.7 obspy -c conda-forge + conda create -n split -c conda-forge python=3.12 obspy Activate the newly created environment: @@ -58,12 +58,14 @@ Install remaining dependencies using ``pip`` inside the ``split`` environment: .. sourcecode:: bash - pip install stdb + pip install git+https://github.com/schaefferaj/stdb -Installing from Pypi --------------------- +Installing from GitHub development branch +----------------------------------------- -*This option is not available at this time* +.. sourcecode:: bash + + pip install git+https://github.com/paudetseis/splitpy Installing from source ---------------------- @@ -81,16 +83,55 @@ Installing from source pip install . -Citing SplitPy --------------- +Testing +------- + +A series of tests are located in the ``tests`` subdirectory. +In order to perform these tests, run ``pytest``: + +.. sourcecode:: bash + + conda install pytest + pytest -v --pyargs splitpy + +Using local data +================ + +The main script packaged with ``RfPy`` uses FDSN web services through and ``ObsPy`` `Client` to load waveform data. For waveform data locally stored on your hard drive, the scripts can use a `Client` that reads a `SeisComP Data Structure `_ archive containing SAC or miniSEED waveform data. Check out the scripts ``rfpy_calc`` below and the argument ``--local-data`` and ``--dtype`` for more details. + +Station Metadata +---------------- + +If you have data stored locally on your drive, it is likely you also have a station `XML `_ file containing the metadata. The corresponding ObsPy documentation is `here `_. + +To convert the station `XML` file to an input that can be read by ``OrientPy``, you run the command ``gen_stdb station.xml`` (only available on StDb version 0.2.7), which will create the file ``station.pkl``. If you don't have a station `XML` file but you have a dataless SEED file, you can convert it first to `XML` using `this tools `_. + +Waveform Data +------------- + +The SDS folder containing the waveform data has the structure: + +.. code-block:: python + + archive + + year + + network code + + station code + + channel code + type + + one file per day and location, e.g. NET.STA.LOC.CHAN.TYPE.YEAR.DOY + -If you use SplitPy in your work, please cite the Zenodo DOI: https://doi.org/10.5281/zenodo.3564780 +For example: -""" +.. code-block:: python -.. automodule:: splitpy - :members: + SDS/ + 2020/ + NY/ + TGTN/ + HHZ.D/ + NY.TGTN..HHZ.D.2020.332 + ... -Basic Usage -=========== +Note, the filename does not include the extension (`.MSEED` or `.SAC`), and the characters `.D` (for type Data) that appear in both the channel code and the filename. Note also the two dots (`..`). If there is a location code, it should appear between those dots (e.g., for a location code `10`, the corresponding filename should be `NY.TGTN.10.HHZ.D.2020.332`). There is no location code for the NY.TGTN data, and this field is simply absent from the filenames. Finally, the day-of-year (DOY) field must be zero-padded to be exactly 3 characters. diff --git a/docs/tutorials.rst b/docs/tutorials.rst index 5158de1..464208b 100644 --- a/docs/tutorials.rst +++ b/docs/tutorials.rst @@ -6,17 +6,17 @@ Creating the ``StDb`` Database All the scripts provided require a ``StDb`` database containing station information and metadata. Let's first create this database for station -LOBS3 and send the prompt to a logfile +TGTN and send the prompt to a logfile .. code-block:: - $ query_fdsn_stdb.py -N TA -C HH? -S TGTN TGTN > logfile + $ query_fdsn_stdb -N NY -C HH -S TGTN TGTN > logfile -To check the station info for TGTN, use the program ``ls_stdb.py``: +To check the station info for TGTN, use the program ``ls_stdb``: .. code-block:: - $ ls_stdb.py TGTN.pkl + $ ls_stdb TGTN.pkl Listing Station Pickle: TGTN.pkl NY.TGTN -------------------------------------------------------------------------- @@ -49,13 +49,11 @@ seismic data suitable for shear-wave splitting analysis. .. code-block:: - $ split_calc_auto.py --keys=NY.TGTN --local-data=/mnt/datadisk/DaySac/ --start=2020-01-01 --end=2020-05-20 TGTN.pkl + $ split_calc_auto --keys=NY.TGTN --local-data=/mnt/datadisk/DaySac/ --start=2020-01-01 --end=2020-05-20 TGTN.pkl This uses all default settings for window lengths, magnitude criteria, etc. -In this example, data will be used from IRIS as well as any local data -on disk (defined with the ``--local-data`` flag - this needs to be customized for -your own file structure). If no data exists on disk, then -the program will search on the specific data sever (through ``obspy`` clients). In this +In this example, the program will search on the specific data server +(through ``obspy`` clients) to download the waveforms. In this example, only events that occurred between January 1, 2020 and May 20, 2020 will be considered. Based on the criteria specified (see :ref:`splitauto`), seismograms will be downloaded where the minimum SNR threshold is exceeded. All data will be saved in separate @@ -65,10 +63,10 @@ Downloading and Processing -------------------------- You can run :ref:`splitauto` to automatically estimate the shear-wave splitting -parameters by specifying the argument ``-C`` or ``--calc``. Choosing ``-V`` +parameters by specifying the argument or ``--calc``. Choosing ``-V`` or ``--verbose`` will display the results to the terminal as the script proceeds. If you wish to visualize the results -for each event, you can further select ``-P`` or ``--plot-diagnostic``. This will pop a +for each event, you can further select ``--plot-diagnostic``. This will pop a summary Figure (i.e., ``Figure 1``) of the splitting results for this particular event. As an example of a Good, non-null estimate, type the following line in the terminal @@ -77,12 +75,22 @@ there is only one key in the database): .. code-block:: - $ split_calc_auto.py --start=2020-03-18 --end=2020-03-19 -V -C -P -O TGTN.pkl + $ split_calc_auto --start=2020-03-18 --end=2020-03-19 -V --calc --plot-diagnostic -O TGTN.pkl This will produce, in the terminal: .. code-block:: + ################################################################### + # _ _ _ _ _ # + # ___ _ __ | (_) |_ ___ __ _| | ___ __ _ _ _| |_ ___ # + # / __| '_ \| | | __| / __/ _` | |/ __| / _` | | | | __/ _ \ # + # \__ \ |_) | | | |_ | (_| (_| | | (__ | (_| | |_| | || (_) | # + # |___/ .__/|_|_|\__|___\___\__,_|_|\___|___\__,_|\__,_|\__\___/ # + # |_| |_____| |_____| # + # # + ################################################################### + |==================================================| | TGTN | |==================================================| @@ -100,7 +108,7 @@ This will produce, in the terminal: | Found 2 possible events | |==================================================| - |**************************************************| + ************************************************** * #1 (2/2): 20200318_031345 NY.TGTN * Phase: SKS * Origin Time: 2020-03-18 03:13:45 @@ -187,12 +195,22 @@ change the frequency settings and re-calculate the previous example: .. code-block:: - $ split_calc_auto.py --start=2020-03-18 --end=2020-03-19 --fmin=0.05 --fmax=1. -V -R -P -O TGTN.pkl + $ split_calc_auto --start=2020-03-18 --end=2020-03-19 --fmin=0.05 --fmax=1. -V --recalc --plot-diagnostic -O TGTN.pkl This will produce, in the terminal: .. code-block:: + ################################################################### + # _ _ _ _ _ # + # ___ _ __ | (_) |_ ___ __ _| | ___ __ _ _ _| |_ ___ # + # / __| '_ \| | | __| / __/ _` | |/ __| / _` | | | | __/ _ \ # + # \__ \ |_) | | | |_ | (_| (_| | | (__ | (_| | |_| | || (_) | # + # |___/ .__/|_|_|\__|___\___\__,_|_|\___|___\__,_|\__,_|\__\___/ # + # |_| |_____| |_____| # + # # + ################################################################### + |==================================================| | TGTN | |==================================================| @@ -210,7 +228,7 @@ This will produce, in the terminal: | Found 2 possible events | |==================================================| - |**************************************************| + ************************************************** * #1 (2/2): 20200318_031345 NY.TGTN * Phase: SKS * Origin Time: 2020-03-18 03:13:45 @@ -288,7 +306,7 @@ one day of data: .. code-block:: - $ split_calc_manual.py --start=2020-03-18 --end=2020-03-19 TGTN.pkl + $ split_calc_manual --start=2020-03-18 --end=2020-03-19 TGTN.pkl .. figure:: ../splitpy/examples/figures/Figure_2.png :align: center @@ -312,17 +330,28 @@ Plotting and subsequent processing of splitting results is carried out using :ref:`splitaverage`, where options are present to control selection of nulls and quality settings, as well as which methods are used. All available data are processed. By default, the script will search for the ``manual`` results. The user -can specify to use the ``auto`` results with the argument ``-A`` or ``--auto``. The final +can specify to use the ``auto`` results with the argument ``--auto``. The final average splits are then saved in a text file for future use. For example, after running the refined processing for 4 years of data for station -TGTN (i.e., typing ``split_calc_auto.py --start=2016-01-01 -V -C TGTN.pkl``, which will +TGTN (i.e., typing ``split_calc_auto --start=2016-01-01 -V --calc TGTN.pkl``, which will take a long time to run and process all the data), we can visualize the results by typing in a terminal: .. code-block:: - $ split_average.py --show-fig -V TGTN.pkl + $ split_average --show-fig -V --auto TGTN.pkl + + ############################################################### + # _ _ _ # + # ___ _ __ | (_) |_ __ ___ _____ _ __ __ _ __ _ ___ # + # / __| '_ \| | | __| / _` \ \ / / _ \ '__/ _` |/ _` |/ _ \ # + # \__ \ |_) | | | |_ | (_| |\ V / __/ | | (_| | (_| | __/ # + # |___/ .__/|_|_|\__|___\__,_| \_/ \___|_| \__,_|\__, |\___| # + # |_| |_____| |___/ # + # # + ############################################################### + --------------------------- Selection Criteria Null Value: @@ -333,35 +362,27 @@ by typing in a terminal: Fairs: True Poors: False --------------------------- - Processing 141 Events... - 20160413_135517 Good Non-Null -> Retained + Found 136 event folders... + Checking 'auto' results... + 20160302_124948 Poor Null -> Skipped + 20160401_192455 Good Non-Null -> Retained + 20160403_082352 Poor Non-Null -> Skipped + 20160406_065848 Poor Null -> Skipped + 20160407_033253 Good Non-Null -> Retained + 20160413_135517 Fair Non-Null -> Retained + 20160414_215027 Poor Null -> Skipped + 20160428_193324 Poor Non-Null -> Skipped 20160527_040843 Good Non-Null -> Retained - 20160607_191515 Fair Non-Null -> Retained - 20160619_094723 Fair Non-Null -> Retained - 20160713_121112 Fair Non-Null -> Retained - 20160924_212841 Good Non-Null -> Retained - 20170819_020052 Good Non-Null -> Retained - 20170926_042000 Good Non-Null -> Retained - 20180728_170723 Good Non-Null -> Retained - 20180819_042858 Good Non-Null -> Retained - 20180906_154914 Fair Non-Null -> Retained - 20180910_041902 Fair Non-Null -> Retained - 20180910_193137 Good Non-Null -> Retained - 20180916_211148 Good Non-Null -> Retained - 20181016_002812 Fair Non-Null -> Retained - 20190531_101232 Poor Non-Null -> Skipped - 20190616_051716 Good Non-Null -> Retained - 20190707_150840 Good Non-Null -> Retained - 20190731_150233 Good Non-Null -> Retained - 20190929_020251 Fair Non-Null -> Retained - 20191031_011119 Good Non-Null -> Retained - 20200318_031345 Fair Non-Null -> Retained - - *** Station Average from 21 measurements *** + ... + + *** Station Average from 41 measurements *** Loc: -128.2727, 61.5267 - PHI: -4.111 d +- 2.891 - DT: 0.729 s +- 0.052 + PHI: -81.802 d +- 3.080 + DT: 0.921 s +- 0.071 Saved to: PLOTS/NY.TGTN_RC-SC_Nons_G-F_results.dat + *** Catalogue of events and results *** + Saved to: PLOTS/NY.TGTN_RC-SC_Nons_G-F_events.dat + .. figure:: ../splitpy/examples/figures/Figure_3.png :align: center diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..6f8d378 --- /dev/null +++ b/meson.build @@ -0,0 +1,33 @@ +project('splitpy', 'c', + version : '0.2.0', + license: 'MIT', + meson_version: '>=0.64.0', +) + +py_mod = import('python') +py = py_mod.find_installation() +py_dep = py.dependency() + +py.install_sources( + 'splitpy/classes.py', + 'splitpy/calc.py', + 'splitpy/utils.py', + 'splitpy/gui.py', + 'splitpy/__init__.py', + 'splitpy/scripts/split_calc_auto.py', + 'splitpy/scripts/split_calc_manual.py', + 'splitpy/scripts/split_average.py', + 'splitpy/scripts/__init__.py', + 'splitpy/tests/get_meta.py', + 'splitpy/tests/test_args.py', + 'splitpy/tests/test_imports.py', + 'splitpy/tests/test_scripts.py', + 'splitpy/tests/__init__.py', + pure: false, + preserve_path: true, + ) + + install_data( + 'splitpy/examples/data/MMPY.pkl', + install_dir: py.get_install_dir(pure: false) / 'splitpy/examples/data', +) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6210fcf --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,37 @@ +[build-system] +build-backend = "mesonpy" +requires = ["meson-python>0.15.0", "numpy >= 1.25.0"] + + +[project] +name = "splitpy" +version = "0.2.0" +description = "Software for teleseismic shear-wave splitting analysis" +authors = [ + { name = "Pascal Audet", email = "pascal.audet@uottawa.ca" }, + { name = "Andrew Schaeffer", email = "andrew.schaeffer@NRCan-RNCan.gc.ca"} +] +maintainers = [ + { name = "Pascal Audet", email = "pascal.audet@uottawa.ca" }, + { name = "Andrew Schaeffer", email = "andrew.schaeffer@NRCan-RNCan.gc.ca"} +] +requires-python = ">=3.9" +readme = "README.md" +dependencies = ["numpy>=1.25", "obspy"] +classifiers = [ + "Development Status :: 5 - Stable", + "Environment :: Console", + "Intended Audience :: Science/Research", + "Programming Language :: Python :: 3 :: Only", + "Topic :: Scientific/Engineering :: Physics", +] + +[project.urls] +Homepage = "https://github.com/paudetseis/SplitPy" +Documentation = "https://paudetseis.github.io/SplitPy" +"Bug Tracker" = "https://github.com/paudetseis/SplitPy/issues" + +[project.scripts] +split_calc_auto = "splitpy.scripts.split_calc_auto:main" +split_calc_manual = "splitpy.scripts.split_calc_manual:main" +split_average = "splitpy.scripts.split_average:main" diff --git a/setup.py b/setup.py deleted file mode 100644 index 49c1811..0000000 --- a/setup.py +++ /dev/null @@ -1,38 +0,0 @@ -import os.path -from os import listdir -import re -from numpy.distutils.core import setup -from pathlib import Path - - -def find_version(*paths): - fname = os.path.join(os.path.dirname(__file__), *paths) - with open(fname) as fp: - code = fp.read() - match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", code, re.M) - if match: - return match.group(1) - raise RuntimeError("Unable to find version string.") - - -scripts = [str(x) for x in Path('Scripts').iterdir() if x.is_file()] - -setup( - name='splitpy', - version=find_version('splitpy', '__init__.py'), - description='Software for teleseismic shear-wave splitting analysis', - author='Pascal Audet, Andrew Schaeffer', - author_email='pascal.audet@uottawa.ca', - maintainer='Pascal Audet, Andrew Schaeffer', - maintainer_email='pascal.audet@uottawa.ca, andrew.schaeffer@canada.ca', - url='https://github.com/paudetseis/SplitPy', - classifiers=[ - 'Development Status :: 3 - Alpha', - 'License :: OSI Approved :: MIT License', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8'], - install_requires=['stdb', 'obspy', 'PyQt5'], - python_requires='>=3.6', - packages=['splitpy'], - scripts=scripts) diff --git a/splitpy/__init__.py b/splitpy/__init__.py index cd02b2a..352eb39 100644 --- a/splitpy/__init__.py +++ b/splitpy/__init__.py @@ -20,11 +20,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -__version__ = '0.1.0' +__version__ = '0.2.0' __author__ = 'Pascal Audet & Andrew Schaeffer' # -*- coding: utf-8 -*- -from . import utils, calc, arguments +from . import utils, calc from .classes import Split, PickPlot, DiagPlot from .gui import Pick, Keep, Save, Repeat diff --git a/splitpy/arguments.py b/splitpy/arguments.py deleted file mode 100644 index 99c7af6..0000000 --- a/splitpy/arguments.py +++ /dev/null @@ -1,751 +0,0 @@ -# Copyright 2019 Pascal Audet & Andrew Schaeffer -# -# This file is part of SplitPy. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -""" - -Module containing the main utility functions used in the `SplitPy` scripts -that accompany this package. - -""" - -# -*- coding: utf-8 -*- -from argparse import ArgumentParser -from os.path import exists as exist -from obspy import UTCDateTime -from numpy import nan - - -def get_arguments_calc_auto(argv=None): - """ - Get Options from :class:`~optparse.OptionParser` objects. - - This function is used for data processing on-the-fly (requires web connection) - - """ - - parser = ArgumentParser( - usage="%(prog)s [arguments] ", - description="Script wrapping " - "together the python-based implementation of SplitLab by " + - "Wustefeld and others. This version " + - "requests data on the fly for a given date range. Data is " + - "requested from the internet using " + - "the client services framework or from data provided on a " + - "local disk. The stations are processed " + - "one by one with the SKS Splitting parameters measured " + - "individually using both the " + - "Rotation-Correlation (RC) and Silver & Chan (SC) methods.") - parser.add_argument( - "indb", - help="Station Database to process from.", - type=str) - parser.add_argument( - "--keys", - action="store", - type=str, - dest="stkeys", - default="", - help="Specify a comma separated list of station keys for " + - "which to perform the analysis. These must be " + - "contained within the station database. Partial keys " + - "will be used to match against those in the " + - "dictionary. For instance, providing IU will match with " + - "all stations in the IU network [Default processes " + - "all stations in the database]") - parser.add_argument( - "-v", "-V", "--verbose", - action="store_true", - dest="verb", - default=False, - help="Specify to increase verbosity.") - parser.add_argument( - "-O", "--overwrite", - action="store_true", - dest="ovr", - default=False, - help="Force the overwriting of pre-existing Split results. " + - "Default behaviour prompts for those that " + - "already exist. Selecting overwrite and skip (ie, both flags) " + - "negate each other, and both are set to " + - "false (every repeat is prompted). [Default False]") - parser.add_argument( - "-K", "--skip-existing", - action="store_true", - dest="skip", - default=False, - help="Skip any event for which existing splitting results are " + - "saved to disk. Default behaviour prompts for " + - "each event. Selecting skip and overwrite (ie, both flags) " + - "negate each other, and both are set to " + - "False (every repeat is prompted). [Default False]") - parser.add_argument( - "-C", "--calc", - action="store_true", - dest="calc", - default=False, - help="Analyze data for shear-wave splitting. [Default saves data "+ - "to folders for subsequent analysis]") - parser.add_argument( - "-P", "--plot-diagnostic", - action="store_true", - dest="diagplot", - default=False, - help="Plot diagnostic window at end of process. [Default False]") - parser.add_argument( - "-R", "--recalc", - action="store_true", - dest="recalc", - default=False, - help="Re-calculate estimates and overwrite existing splitting "+ - "results without re-downloading data. [Default False]") - - # Server Settings - ServerGroup = parser.add_argument_group( - title="Server Settings", - description="Settings associated with which " + - "datacenter to log into.") - ServerGroup.add_argument( - "-S", "--Server", - action="store", - type=str, - dest="Server", - default="IRIS", - help="Specify the server to connect to. Options include: " + - "BGR, ETH, GEONET, GFZ, INGV, IPGP, IRIS, KOERI, LMU, NCEDC, " + - "NEIP, NERIES, ODC, ORFEUS, RESIF, SCEDC, USGS, USP. [Default IRIS]") - ServerGroup.add_argument( - "-U", "--User-Auth", - action="store", - type=str, - dest="UserAuth", - default="", - help="Enter your IRIS Authentification Username and Password " + - "(--User-Auth='username:authpassword') to access and download " + - "restricted data. [Default no user and password]") - - # Database Settings - DataGroup = parser.add_argument_group( - title="Local Data Settings", - description="Settings associated with defining and using a " + - "local data base of pre-downloaded day-long SAC files.") - DataGroup.add_argument( - "--local-data", - action="store", - type=str, - dest="localdata", - default=None, - help="Specify a comma separated list of paths containing " + - "day-long sac files of data already downloaded. " + - "If data exists for a seismogram is already present on " + - "disk, it is selected preferentially over downloading " + - "the data using the Client interface") - DataGroup.add_argument( - "--dtype", - action="store", - type=str, - dest="dtype", - default='SAC', - help="Specify the data archive file type, either SAC " + - " or MSEED. Note the default behaviour is to search for " + - "SAC files. Local archive files must have extensions of '.SAC' "+ - " or '.MSEED. These are case dependent, so specify the correct case"+ - "here.") - DataGroup.add_argument( - "--no-data-zero", - action="store_true", - dest="ndval", - default=False, - help="Specify to force missing data to be set as zero, rather " + - "than default behaviour which sets to nan.") - DataGroup.add_argument( - "--no-local-net", - action="store_false", - dest="useNet", - default=True, - help="Specify to prevent using the Network code in the " + - "search for local data (sometimes for CN stations " + - "the dictionary name for a station may disagree with that " + - "in the filename. [Default Network used]") - - # Constants Settings - ConstGroup = parser.add_argument_group( - title='Parameter Settings', - description="Miscellaneous default values and settings") - ConstGroup.add_argument( - "--sampling-rate", - action="store", - type=float, - dest="new_sampling_rate", - default=10., - help="Specify new sampling rate in Hz. [Default 10.]") - ConstGroup.add_argument( - "--min-snr", - action="store", - type=float, - dest="msnr", - default=5., - help="Minimum SNR value calculated on the radial (Q) component "+ - "to proceed with analysis (dB). [Default 5.]") - ConstGroup.add_argument( - "--window", - action="store", - type=float, - dest="dts", - default=120., - help="Specify time window length before and after the SKS " - "arrival. The total window length is 2*dst (sec). [Default 120]") - ConstGroup.add_argument( - "--max-delay", - action="store", - type=float, - dest="maxdt", - default=4., - help="Specify the maximum delay time in search (sec). "+ - "[Default 4]") - ConstGroup.add_argument( - "--dt-delay", - action="store", - type=float, - dest="ddt", - default=0.1, - help="Specify the time delay increment in search (sec). "+ - "[Default 0.1]") - ConstGroup.add_argument( - "--dphi", - action="store", - type=float, - dest="dphi", - default=1., - help="Specify the fast angle increment in search (degree). "+ - "[Default 1.]") - ConstGroup.add_argument( - "--snrT", - action="store", - type=float, - dest="snrTlim", - default=1., - help="Specify the minimum SNR Threshold for the Transverse " + - "component to be considered Non-Null. [Default 1.]") - ConstGroup.add_argument( - "--fmin", - action="store", - type=float, - dest="fmin", - default=0.02, - help="Specify the minimum frequency corner for bandpass " + - "filter (Hz). [Default 0.02]") - ConstGroup.add_argument( - "--fmax", - action="store", - type=float, - dest="fmax", - default=0.5, - help="Specify the maximum frequency corner for bandpass " + - "filter (Hz). [Default 0.5]") - - # Event Selection Criteria - EventGroup = parser.add_argument_group( - title="Event Settings", - description="Settings associated with refining " - "the events to include in matching station pairs") - EventGroup.add_argument( - "--start", - action="store", - type=str, - dest="startT", - default="", - help="Specify a UTCDateTime compatible string representing " + - "the start time for the event search. This will override any " + - "station start times. [Default start date of each station]") - EventGroup.add_argument( - "--end", - action="store", - type=str, - dest="endT", - default="", - help="Specify a UTCDateTime compatible string representing " + - "the end time for the event search. This will override any " + - "station end times [Default end date of each station]") - EventGroup.add_argument( - "--reverse", - action="store_true", - dest="reverse", - default=False, - help="Reverse order of events. Default behaviour starts at " + - "oldest event and works towards most recent. " + - "Specify reverse order and instead the program will start " + - "with the most recent events and work towards older") - EventGroup.add_argument( - "--min-mag", - action="store", - type=float, - dest="minmag", - default=6.0, - help="Specify the minimum magnitude of event for which to " + - "search. [Default 6.0]") - EventGroup.add_argument( - "--max-mag", - action="store", - type=float, - dest="maxmag", - default=None, - help="Specify the maximum magnitude of event for which to " + - "search. [Default None, i.e. no limit]") - - # Geometry Settings - GeomGroup = parser.add_argument_group( - title="Geometry Settings", - description="Settings associatd with the " - "event-station geometries") - GeomGroup.add_argument( - "--min-dist", - action="store", - type=float, - dest="mindist", - default=85., - help="Specify the minimum great circle distance (degrees) " + - "between the station and event. [Default 85]") - GeomGroup.add_argument( - "--max-dist", - action="store", - type=float, - dest="maxdist", - default=120., - help="Specify the maximum great circle distance (degrees) " + - "between the station and event. [Default 120]") - GeomGroup.add_argument( - "--phase", - action="store", - type=str, - dest="phase", - default='SKS', - help="Specify the phase name to use. Be careful with the distance. " + - "setting. Options are 'SKS' or 'SKKS'. [Default 'SKS']") - - args = parser.parse_args(argv) - - # Check inputs - if not exist(args.indb): - parser.error("Input file " + args.indb + " does not exist") - - # create station key list - if len(args.stkeys) > 0: - args.stkeys = args.stkeys.split(',') - - # construct start time - if len(args.startT) > 0: - try: - args.startT = UTCDateTime(args.startT) - except: - parser.error( - "Cannot construct UTCDateTime from start time: " + - args.startT) - else: - args.startT = None - - # construct end time - if len(args.endT) > 0: - try: - args.endT = UTCDateTime(args.endT) - except: - parser.error( - "Cannot construct UTCDateTime from end time: " + - args.endT) - else: - args.endT = None - - # Parse User Authentification - if not len(args.UserAuth) == 0: - tt = args.UserAuth.split(':') - if not len(tt) == 2: - parser.error( - "Error: Incorrect Username and Password Strings for " + - "User Authentification") - else: - args.UserAuth = tt - else: - args.UserAuth = [] - - # Check existing file behaviour - if args.skip and args.ovr: - args.skip = False - args.ovr = False - - # Parse Local Data directories - if args.localdata is not None: - args.localdata = args.localdata.split(',') - else: - args.localdata = [] - - # Check NoData Value - if args.ndval: - args.ndval = 0.0 - else: - args.ndval = nan - - # Check selected phase - if args.phase not in ['SKS', 'SKKS', 'PKS']: - parser.error( - "Error: choose between 'SKS', 'SKKS and 'PKS'.") - - # Check distances for all phases - if not args.mindist: - if args.phase == 'SKS': - args.mindist = 85. - elif args.phase == 'SKKS': - args.mindist = 90. - elif args.phase == 'PKS': - args.mindist = 130. - if not args.maxdist: - if args.phase == 'SKS': - args.maxdist = 120. - elif args.phase == 'SKKS': - args.maxdist = 130. - elif args.phase == 'PKS': - args.maxdist = 150. - if args.mindist < 85. or args.maxdist > 180.: - parser.error( - "Distances should be between 85 and 180 deg. for " + - "teleseismic 'SKS', 'SKKS' and 'PKS' waves.") - - return args - - -def get_arguments_calc_manual(argv=None): - """ - Get Options from :class:`~optparse.OptionParser` objects. - - This function is used for processing SKS data offline - - """ - - parser = ArgumentParser( - usage="%(prog)s [arguments] ", - description="Script to process " - "and calculate the spliting parameters for a dataset " + - "that has already been downloaded by split_calc_auto.py. ") - - # General Settings - parser.add_argument( - "indb", - help="Station Database to process from.", - type=str) - parser.add_argument( - "--keys", - action="store", - type=str, - dest="stkeys", - default="", - help="Specify a comma separated list of station keys " + - "for which to perform analysis. These must be " + - "contained within the station database. Partial keys " + - "will be used to match against those in the " + - "dictionary. For instance, providing IU will match " + - "with all stations in the IU network [Default " + - "processes all stations in the database]") - parser.add_argument( - "-v", "-V", "--verbose", - action="store_true", - dest="verb", - default=False, - help="Specify to increase verbosity.") - - # Constants Settings - ConstGroup = parser.add_argument_group( - title='Parameter Settings', - description="Miscellaneous default values and settings") - ConstGroup.add_argument( - "--window", - action="store", - type=float, - dest="dts", - default=120., - help="Specify time window length before and after the SKS " - "arrival. The total window length is 2*dst (sec). [Default 120]") - ConstGroup.add_argument( - "--max-delay", - action="store", - type=float, - dest="maxdt", - default=4., - help="Specify the maximum delay time. [Default 4 s]") - ConstGroup.add_argument( - "--time-increment", - action="store", - type=float, - dest="ddt", - default=0.1, - help="Specify the time increment. [Default 0.1 s]") - ConstGroup.add_argument( - "--angle-increment", - action="store", - type=float, - dest="dphi", - default=1., - help="Specify the angle increment. [Default 1 d]") - ConstGroup.add_argument( - "--transverse-SNR", - action="store", - type=float, - dest="snrTlim", - default=1., - help="Specify the minimum SNR Threshold for the Transverse " + - "component to be considered Non-Null. [Default 1.]") - - # Event Selection Criteria - EventGroup = parser.add_argument_group( - title="Event Settings", - description="Settings associated with " + - "refining the events to include in matching station pairs") - EventGroup.add_argument( - "--start", - action="store", - type=str, - dest="startT", - default="", - help="Specify a UTCDateTime compatible string representing the " + - "start time for the event search. This will override any station " + - "start times. [Default more recent start date for each station pair]") - EventGroup.add_argument( - "--end", - action="store", - type=str, - dest="endT", - default="", - help="Specify a UTCDateTime compatible string representing the " + - "end time for the event search. This will override any station " + - "end times [Default older end date for each the pair of stations]") - EventGroup.add_argument( - "--reverse-order", "-R", - action="store_true", - dest="reverse", - default=False, - help="Reverse order of events. Default behaviour starts at oldest " + - "event and works towards most recent. Specify reverse order and " + - "instead the program will start with the most recent events and " + - "work towards older") - - args = parser.parse_args(argv) - - # Check inputs - if not exist(args.indb): - parser.error("Input file " + args.indb + " does not exist") - - # create station key list - if len(args.stkeys) > 0: - args.stkeys = args.stkeys.split(',') - - # construct start time - if len(args.startT) > 0: - try: - args.startT = UTCDateTime(args.startT) - except: - parser.error( - "Cannot construct UTCDateTime from start time: " + args.startT) - else: - args.startT = None - - # construct end time - if len(args.endT) > 0: - try: - args.endT = UTCDateTime(args.endT) - except: - parser.error( - "Cannot construct UTCDateTime from end time: " + args.endT) - else: - args.endT = None - - return args - - -def get_arguments_average(argv=None): - - parser = ArgumentParser( - usage="%(prog)s [arguments] ", - description="Script to plot the average splitting results for a " + - "given station. Loads the available .pkl files in the specified " + - "Station Directory.") - - # General Settings - parser.add_argument( - "indb", - help="Station Database to process from.", - type=str) - parser.add_argument( - "--keys", - action="store", - type=str, - dest="stkeys", - default="", - help="Specify a comma separated list of station keys " + - "for which to perform analysis. These must be " + - "contained within the station database. Partial keys " + - "will be used to match against those in the " + - "dictionary. For instance, providing IU will match " + - "with all stations in the IU network [Default " + - "processes all stations in the database]") - parser.add_argument( - "-v", "-V", "--verbose", - action="store_true", - dest="verb", - default=False, - help="Specify to increase verbosity.") - parser.add_argument( - "--show-fig", - action="store_true", - dest="showfig", - default=False, - help="Specify show plots during processing - " + - "they are still saved to disk. [Default only saves]") - parser.add_argument( - "-A", "--auto", - action="store_true", - dest="auto", - default=False, - help="Specify to use automatically processed split results. "+ - "[Default uses refined ('manual') split results]") - - # Null Settings - NullGroup = parser.add_argument_group( - title="Null Selection Settings", - description="Settings " - "associated with selecting which Null or Non-Null data is included") - NullGroup.add_argument( - "--nulls", "--Nulls", - action="store_true", - dest="nulls", - default=False, - help="Specify this flag to include Null Values in the average. " + - "[Default Non-Nulls only]") - NullGroup.add_argument( - "--no-nons", "--No-Nons", - action="store_false", - dest="nons", - default=True, - help="Specify this flag to exclude Non-Nulls from the average " + - "[Default False]") - - # Quality Settings - QualGroup = parser.add_argument_group( - title="Quality Selection Settings", - description="Settings associated with selecting the qualities " + - "to include in the selection.") - QualGroup.add_argument( - "--No-Good", "--no-good", - action="store_false", - dest="goods", - default=True, - help="Specify to exclude 'Good' measurements from the average. " + - "[Default Good + Fair]") - QualGroup.add_argument( - "--No-Fair", "--no-fair", - action="store_false", - dest="fairs", - default=True, - help="Specify to exclude 'Fair' measurements from the average " + - "[Default Good + Fair]") - QualGroup.add_argument( - "--Poor", "--poor", - action="store_true", - dest="poors", - default=False, - help="Specify to include 'Poor' measurements in the average " + - "[Default No Poors]") - - # Split Type Settings - SpTypGroup = parser.add_argument_group( - title="Split Type Settings", - description="Settings to Select " - "which Split types are included in the selection.") - SpTypGroup.add_argument( - "--RC-Only", "--rc-only", "--RC-only", - action="store_false", - dest="SCinc", - default=True, - help="Specify to only include RC splits in the average. " + - "[Default RC + SC]") - SpTypGroup.add_argument( - "--SC-Only", "--sc-only", "--SC-only", - action="store_false", - dest="RCinc", - default=True, - help="Specify to only include SC splits in the average. " + - "[Default RC + SC]") - - args = parser.parse_args(argv) - - # Check inputs - if not exist(args.indb): - parser.error("Input file " + args.indb + " does not exist") - - # Check Nulls - if not args.nons and not args.nulls: - parser.error("One of Non-Nulls or Nulls must be included.") - - # Check Quality - if not args.goods and not args.fairs and not args.poors: - parser.error("At least one Quality must be included.") - - # Check Types - if not args.RCinc and not args.SCinc: - parser.error("At leat one Splitting Tyhpe must be included.") - - # Construct Null FileName Components - NullName = "" - if args.nons: - NullName = "_Nons" - if args.nulls: - NullName = NullName + "-Nulls" - else: - if args.nulls: - NullName = "_Nulls" - args.NullName = NullName - - # Construct Quality FileName Components - QualName = "" - if args.goods: - QualName = "_G" - if args.fairs: - QualName = QualName + "-F" - if args.poors: - QualName = QualName + "-P" - else: - if args.fairs: - QualName = "_F" - if args.poors: - QualName = QualName + "-P" - else: - if args.poors: - QualName = "_P" - args.QualName = QualName - - # Construct Type FileName Components - TypeName = "" - if args.RCinc and args.SCinc: - TypeName = "_RC-SC" - elif args.RCinc and not args.SCinc: - TypeName = "_RC" - elif not args.RCinc and args.SCinc: - TypeName = "_SC" - args.TypeName = TypeName - - return args - diff --git a/splitpy/calc.py b/splitpy/calc.py index 291cd57..fec55a6 100644 --- a/splitpy/calc.py +++ b/splitpy/calc.py @@ -43,6 +43,12 @@ def split_SilverChan(trQ, trT, baz, t1, t2, maxdt, ddt, dphi): Start time of picking window t2 : :class:`~obspy.core.utcdatetime.UTCDateTime` End time of picking window + maxdt : float + Maximum delay time considered in grid search (sec) + ddt : float + Delay time interval in grid search (sec) + dphi : float + Angular interval in grid search (deg) Returns ------- @@ -166,6 +172,12 @@ def split_RotCorr(trQ, trT, baz, t1, t2, maxdt, ddt, dphi): Start time of picking window t2 : :class:`~obspy.core.utcdatetime.UTCDateTime` End time of picking window + maxdt : float + Maximum delay time considered in grid search (sec) + ddt : float + Delay time interval in grid search (sec) + dphi : float + Angular interval in grid search (deg) Returns ------- @@ -391,6 +403,12 @@ def split_errorSC(tr, t1, t2, q, Emat, maxdt, ddt, dphi): Confidence level Emat : :class:`~numpy.ndarray` Energy minimization matrix + maxdt : float + Maximum delay time considered in grid search (sec) + ddt : float + Delay time interval in grid search (sec) + dphi : float + Angular interval in grid search (deg) Returns ------- @@ -461,6 +479,12 @@ def split_errorRC(tr, t1, t2, q, Emat, maxdt, ddt, dphi): Confidence level Emat : :class:`~numpy.ndarray` Energy minimization matrix + maxdt : float + Maximum delay time considered in grid search (sec) + ddt : float + Delay time interval in grid search (sec) + dphi : float + Angular interval in grid search (deg) Returns ------- diff --git a/splitpy/classes.py b/splitpy/classes.py index 73bed6f..6cde389 100644 --- a/splitpy/classes.py +++ b/splitpy/classes.py @@ -78,10 +78,30 @@ class Meta(object): Back-azimuth - pointing to earthquake from station (degrees) az : float Azimuth - pointing to station from earthquake (degrees) + ttime : float + Predicted arrival time (sec) + ph : str + Phase name slow : float Horizontal slowness of phase inc : float Incidence angle of phase at surface + maxdt : float + Maximum delay time considered in grid search (sec) + ddt : float + Delay time interval in grid search (sec) + dphi : float + Angular interval in grid search (deg) + align : str + Alignment of coordinate system for rotation + ('ZRT', 'LQT', or 'PVH') + rotated : bool + Whether or not data have been rotated to ``align`` + coordinate system + zcomp : str + Vertical Component Identifier. Should be a single character. + This is different then 'Z' only for fully unknown component + orientation (i.e., components are 1, 2, 3) """ @@ -142,9 +162,9 @@ def __init__(self, sta, event, gacmin=85., gacmax=180., phase='SKS', self.phase = phase self.accept = True else: - self.ttime = None - self.slow = None - self.inc = None + self.ttime = np.nan + self.slow = np.nan + self.inc = np.nan self.phase = None self.accept = False @@ -232,7 +252,7 @@ class Split(object): """ - def __init__(self, sta): + def __init__(self, sta, zcomp='Z'): # # Load example data if initializing empty object # if sta == 'demo' or sta == 'Demo': @@ -251,6 +271,7 @@ def __init__(self, sta): self.meta = None self.dataZNE = None self.dataLQT = None + self.zcomp = zcomp def add_event(self, event, gacmin=85., gacmax=120., phase='SKS', returned=False): @@ -294,7 +315,7 @@ def add_event(self, event, gacmin=85., gacmax=120., phase='SKS', def add_data(self, stream, returned=False, new_sr=5.): """ - Adds stream of raw data as object attribute + Adds stream as object attribute Parameters ---------- @@ -303,6 +324,11 @@ def add_data(self, stream, returned=False, new_sr=5.): returned : bool Whether or not to return the ``accept`` attribute + Attributes + ---------- + dataZNE : :class:`~obspy.core.Stream` + Stream container for NEZ seismograms + Returns ------- accept : bool @@ -311,7 +337,7 @@ def add_data(self, stream, returned=False, new_sr=5.): """ if not self.meta: - raise(Exception("No meta data available - aborting")) + raise Exception("No meta data available - aborting") if not self.meta.accept: return @@ -327,7 +353,7 @@ def add_data(self, stream, returned=False, new_sr=5.): # print(stream) if not isinstance(stream, Stream): - raise(Exception("Event has incorrect type")) + raise Exception("Event has incorrect type") try: self.dataZNE = stream @@ -337,19 +363,26 @@ def add_data(self, stream, returned=False, new_sr=5.): self.meta.accept = False # Filter Traces - self.dataZNE.filter('lowpass', freq=0.5*new_sr, - corners=2, zerophase=True) - self.dataZNE.resample(new_sr, no_filter=False) - - except: + if not stream[0].stats.sampling_rate == new_sr: + self.dataZNE.filter( + 'lowpass', + freq=0.5*new_sr, + corners=2, + zerophase=True) + self.dataZNE.resample( + new_sr, + no_filter=True) + + except Exception as e: print("Error: Not all channels are available") self.meta.accept = False if returned: return self.meta.accept - def download_data(self, client, stdata=[], dtype='SAC', ndval=np.nan, - new_sr=5., dts=120., returned=False, verbose=False): + def download_data(self, client, new_sr=5., dts=120., + returned=False, verbose=False, + remove_response=False): """ Downloads seismograms based on event origin time and P phase arrival and adds as object attribute. @@ -358,26 +391,35 @@ def download_data(self, client, stdata=[], dtype='SAC', ndval=np.nan, ---------- client : :class:`~obspy.client.fdsn.Client` Client object - ndval : float - Fill in value for missing data new_sr : float New sampling rate (Hz) dts : float Time duration (sec) - stdata : List - Station list + remove_response : bool + Remove instrument response from seismogram and resitute to true ground + velocity (m/s) using obspy.core.trace.Trace.remove_response() returned : bool Whether or not to return the ``accept`` attribute + verbose : bool + Output diagnostics to screen Returns ------- accept : bool Whether or not the object is accepted for further analysis + Attributes + ---------- + dataZNE : :class:`~obspy.core.Stream` + Stream containing ZNE :class:`~obspy.core.Trace` objects + dataZ12 : :class:`~obspy.core.Stream` + Stream containing Z12 :class:`~obspy.core.Trace` objects + (for un-oriented data) + """ if self.meta is None: - raise(Exception("Requires event data as attribute - aborting")) + raise Exception("Requires event data as attribute - aborting") if not self.meta.accept: return @@ -394,14 +436,15 @@ def download_data(self, client, stdata=[], dtype='SAC', ndval=np.nan, # Download data err, stream = utils.download_data( client=client, sta=self.sta, start=tstart, end=tend, - stdata=stdata, dtype=dtype, ndval=ndval, new_sr=new_sr, - verbose=verbose) + new_sr=new_sr, verbose=verbose, remove_response=remove_response, + zcomp=self.zcomp) # Store as attributes with traces in dictionary try: trE = stream.select(component='E')[0] trN = stream.select(component='N')[0] trZ = stream.select(component='Z')[0] + self.dataZNE = Stream(traces=[trZ, trN, trE]) # Filter Traces and resample @@ -409,24 +452,32 @@ def download_data(self, client, stdata=[], dtype='SAC', ndval=np.nan, corners=2, zerophase=True) self.dataZNE.resample(new_sr, no_filter=False) - # If there is no ZNE, perhaps there is Z12? - except: + # If there is no ZNE, perhaps there is Z12 (or zcomp12)? + except Exception as e: try: tr1 = stream.select(component='1')[0] tr2 = stream.select(component='2')[0] - trZ = stream.select(component='Z')[0] - self.dataZ12 = Stream(traces=[trZ, tr1, tr2]) + trZ = stream.select(component=self.zcomp)[0] - # Rotate from Z12 to ZNE using StDb azcorr attribute - self.rotate(align='ZNE') + # Force channel name to 'Z' if zcomp is not 'Z'' + if not self.zcomp == 'Z': + trZ.stats.channel = trZ.stats.channel[:-1] + 'Z' + + self.dataZNE = Stream(traces=[trZ, tr1, tr2]) # Filter Traces and resample self.dataZNE.filter('lowpass', freq=0.5*new_sr, corners=2, zerophase=True) - self.dataZNE.resample(new_sr, no_filter=False) + self.dataZNE.resample(new_sr, no_filter=True) + + # Save Z12 components in case it's necessary for later + self.dataZ12 = self.dataZNE.copy() - except: + # Rotate from Z12 to ZNE using StDb azcorr attribute + self.rotate(align='ZNE') + + except Exception as e: self.meta.accept = False if returned: @@ -438,9 +489,9 @@ def rotate(self, align=None): east (E) and north (N) to longitudinal (L), radial (Q) and tangential (T) components of motion. Note that the method 'rotate' from ``obspy.core.stream.Stream`` - is used for the rotation ``'ZNE->ZRT'`` and ``'ZNE->LQT'``. - Rotation ``'ZNE->PVH'`` is implemented separately here - due to different conventions. + is used for the rotation ``'ZNE->LQT'``. + + Can also rotate Z12 to ZNE. Parameters ---------- @@ -448,30 +499,42 @@ def rotate(self, align=None): Alignment of coordinate system for rotation ('ZNE' or 'LQT') + Returns + ------- + rotated : bool + Whether or not the object has been rotated + """ if not self.meta.accept: return + if self.meta.rotated: + print("Data have been rotated already - continuing") + return + # Use default values from meta data if arguments are not specified if not align: align = self.meta.align if align == 'ZNE': - # Rotating from 1,2 to N,E is the negative of - # rotation from RT to NE, with - # baz corresponding to azim of component 1 - from obspy.signal.rotate import rotate_rt_ne + from obspy.signal.rotate import rotate2zne # Copy traces - trZ = self.dataZ12.select(component='Z')[0].copy() - trN = self.dataZ12.select(component='1')[0].copy() - trE = self.dataZ12.select(component='2')[0].copy() + trZ = self.dataZNE.select(component='Z')[0].copy() + trN = self.dataZNE.select(component='1')[0].copy() + trE = self.dataZNE.select(component='2')[0].copy() azim = self.sta.azcorr - N, E = rotate_rt_ne(trN.data, trE.data, azim) - trN.data = -1.*N - trE.data = -1.*E + + # Try with left handed system + Z, N, E = rotate2zne(trZ.data, 0., -90., trN.data, + azim, 0., trE.data, azim+90., 0.) + + # Z, N, E = rotate2zne(trZ.data, 0., -90., trN.data, + # azim, 0., trE.data, azim+90., 0.) + trN.data = N + trE.data = E # Update stats of streams trN.stats.channel = trN.stats.channel[:-1] + 'N' @@ -494,7 +557,7 @@ def rotate(self, align=None): else: raise(Exception("incorrect 'align' argument")) - def calc_snr(self, t1=None, dt=30.): + def calc_snr(self, t1=None, dt=30., fmin=0.02, fmax=0.5): """ Calculates signal-to-noise ratio on either Z, L or P component @@ -535,6 +598,16 @@ def calc_snr(self, t1=None, dt=30.): trSigT.detrend().taper(max_percentage=0.05) trNzeT.detrend().taper(max_percentage=0.05) + # Filter between 0.1 and 1.0 (dominant P wave frequencies) + trSigQ.filter('bandpass', freqmin=fmin, freqmax=fmax, + corners=2, zerophase=True) + trSigT.filter('bandpass', freqmin=fmin, freqmax=fmax, + corners=2, zerophase=True) + trNzeQ.filter('bandpass', freqmin=fmin, freqmax=fmax, + corners=2, zerophase=True) + trNzeT.filter('bandpass', freqmin=fmin, freqmax=fmax, + corners=2, zerophase=True) + # Trim around S-wave arrival trSigQ.trim(t1, t1 + dt) trNzeQ.trim(t1 - dt, t1) @@ -563,6 +636,8 @@ def analyze(self, t1=None, t2=None, verbose=False): Start time of picking window t2 : :class:`~obspy.core.utcdatetime.UTCDateTime` End time of picking window + verbose : bool + Output diagnostics to screen Attributes ---------- @@ -622,8 +697,8 @@ def is_null(self, snrTlim=3., verbose=False): ---------- snrTlim : float Threshold for snr on T component - ds : int - Number of spaces to print out to screen (verbiage) + verbose : bool + Output diagnostics to screen Attributes ---------- @@ -675,8 +750,8 @@ def get_quality(self, verbose=False): Parameters ---------- - ds : int - Number of spaces to print out to screen (verbiage) + verbose : bool + Output diagnostics to screen Attributes ---------- @@ -1335,7 +1410,7 @@ def rot3D(inc, baz): 0.5, 0.9, 'Event: ' + self.split.meta.time.ctime() + ' ' + str(self.split.meta.lat) + 'N ' + str(self.split.meta.lon) + 'E ' + - str(np.int(self.split.meta.dep)) + 'km ' + 'Mw=' + + str(int(self.split.meta.dep)) + 'km ' + 'Mw=' + str(self.split.meta.mag), horizontalalignment='center') self.axes[2].text( 0.5, 0.7, 'Station: ' + self.split.sta.station + @@ -1345,7 +1420,7 @@ def rot3D(inc, baz): horizontalalignment='center') self.axes[2].text( 0.5, 0.5, r'Best fit RC values: $\phi$=' + - str(np.int(self.split.RC_res.phi)) + r'$\pm$' + + str(int(self.split.RC_res.phi)) + r'$\pm$' + str("{:.2f}").format(self.split.RC_res.ephi) + r' $\delta t$=' + str(self.split.RC_res.dtt) + r'$\pm$' + @@ -1353,7 +1428,7 @@ def rot3D(inc, baz): 's', horizontalalignment='center') self.axes[2].text( 0.5, 0.3, r'Best fit SC values: $\phi$=' + - str(np.int(self.split.SC_res.phi)) + r'$\pm$' + + str(int(self.split.SC_res.phi)) + r'$\pm$' + str("{:.2f}").format(self.split.SC_res.ephi) + r' $\delta t$=' + str(self.split.SC_res.dtt) + r'$\pm$' + @@ -1411,7 +1486,7 @@ def rot3D(inc, baz): extent = [phi.min(), phi.max(), dt.min(), dt.max()] X, Y = np.meshgrid(dt, phi) - E2 = np.roll(self.split.RC_res.Emat, np.int( + E2 = np.roll(self.split.RC_res.Emat, int( self.split.RC_res.phi - self.split.RC_res.phi_min), axis=0) Emin = self.split.RC_res.Emat.min() @@ -1470,7 +1545,7 @@ def rot3D(inc, baz): extent = [phi.min(), phi.max(), dt.min(), dt.max()] X, Y = np.meshgrid(dt, phi) - E2 = np.roll(self.split.SC_res.Emat, np.int( + E2 = np.roll(self.split.SC_res.Emat, int( self.split.SC_res.phi-self.split.SC_res.phi_min), axis=0) Emin = self.split.SC_res.Emat.min() diff --git a/splitpy/examples/figures/Figure_3.png b/splitpy/examples/figures/Figure_3.png index cd3e81a..b0f102e 100644 Binary files a/splitpy/examples/figures/Figure_3.png and b/splitpy/examples/figures/Figure_3.png differ diff --git a/splitpy/scripts/__init__.py b/splitpy/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Scripts/split_average.py b/splitpy/scripts/split_average.py similarity index 68% rename from Scripts/split_average.py rename to splitpy/scripts/split_average.py index 61b7137..e05bf55 100755 --- a/Scripts/split_average.py +++ b/splitpy/scripts/split_average.py @@ -30,7 +30,11 @@ import matplotlib.pyplot as plt import matplotlib.gridspec as gspec from math import ceil -from splitpy import arguments, Split + +from splitpy import Split + +from argparse import ArgumentParser +from os.path import exists as exist from pathlib import Path @@ -47,10 +51,200 @@ def angle_mean(dt, phi, ddt, dphi): return phase, dphase, radius, dradius - -def main(): - - args = arguments.get_arguments_average() +def get_arguments_average(argv=None): + + parser = ArgumentParser( + usage="%(prog)s [arguments] ", + description="Script to plot the average splitting results for a " + + "given station. Loads the available .pkl files in the specified " + + "Station Directory.") + + # General Settings + parser.add_argument( + "indb", + help="Station Database to process from.", + type=str) + parser.add_argument( + "--keys", + action="store", + type=str, + dest="stkeys", + default="", + help="Specify a comma separated list of station keys " + + "for which to perform analysis. These must be " + + "contained within the station database. Partial keys " + + "will be used to match against those in the " + + "dictionary. For instance, providing IU will match " + + "with all stations in the IU network [Default " + + "processes all stations in the database]") + parser.add_argument( + "-V", "--verbose", + action="store_true", + dest="verb", + default=False, + help="Specify to increase verbosity.") + parser.add_argument( + "--show-fig", + action="store_true", + dest="showfig", + default=False, + help="Specify show plots during processing - " + + "they are still saved to disk. [Default only saves]") + parser.add_argument( + "--auto", + action="store_true", + dest="auto", + default=False, + help="Specify to use automatically processed split results. "+ + "[Default uses refined ('manual') split results]") + + # Null Settings + NullGroup = parser.add_argument_group( + title="Null Selection Settings", + description="Settings " + "associated with selecting which Null or Non-Null data is included") + NullGroup.add_argument( + "--nulls", + action="store_true", + dest="nulls", + default=False, + help="Specify this flag to include Null Values in the average. " + + "[Default Non-Nulls only]") + NullGroup.add_argument( + "--no-nons", + action="store_false", + dest="nons", + default=True, + help="Specify this flag to exclude Non-Nulls from the average " + + "[Default False]") + + # Quality Settings + QualGroup = parser.add_argument_group( + title="Quality Selection Settings", + description="Settings associated with selecting the qualities " + + "to include in the selection.") + QualGroup.add_argument( + "--no-good", + action="store_false", + dest="goods", + default=True, + help="Specify to exclude 'Good' measurements from the average. " + + "[Default Good + Fair]") + QualGroup.add_argument( + "--no-fair", + action="store_false", + dest="fairs", + default=True, + help="Specify to exclude 'Fair' measurements from the average " + + "[Default Good + Fair]") + QualGroup.add_argument( + "--poor", + action="store_true", + dest="poors", + default=False, + help="Specify to include 'Poor' measurements in the average " + + "[Default No Poors]") + + # Split Type Settings + SpTypGroup = parser.add_argument_group( + title="Split Type Settings", + description="Settings to Select " + "which Split types are included in the selection.") + SpTypGroup.add_argument( + "--RC-only", + action="store_false", + dest="SCinc", + default=True, + help="Specify to only include RC splits in the average. " + + "[Default RC + SC]") + SpTypGroup.add_argument( + "--SC-only", + action="store_false", + dest="RCinc", + default=True, + help="Specify to only include SC splits in the average. " + + "[Default RC + SC]") + + args = parser.parse_args(argv) + + # Check inputs + if not exist(args.indb): + parser.error("Input file " + args.indb + " does not exist") + + # Create station key list + if len(args.stkeys) > 0: + args.stkeys = args.stkeys.split(',') + + # Check Nulls + if not args.nons and not args.nulls: + parser.error("One of Non-Nulls or Nulls must be included.") + + # Check Quality + if not args.goods and not args.fairs and not args.poors: + parser.error("At least one Quality must be included.") + + # Check Types + if not args.RCinc and not args.SCinc: + parser.error("At leat one Splitting Tyhpe must be included.") + + # Construct Null FileName Components + NullName = "" + if args.nons: + NullName = "_Nons" + if args.nulls: + NullName = NullName + "-Nulls" + else: + if args.nulls: + NullName = "_Nulls" + args.NullName = NullName + + # Construct Quality FileName Components + QualName = "" + if args.goods: + QualName = "_G" + if args.fairs: + QualName = QualName + "-F" + if args.poors: + QualName = QualName + "-P" + else: + if args.fairs: + QualName = "_F" + if args.poors: + QualName = QualName + "-P" + else: + if args.poors: + QualName = "_P" + args.QualName = QualName + + # Construct Type FileName Components + TypeName = "" + if args.RCinc and args.SCinc: + TypeName = "_RC-SC" + elif args.RCinc and not args.SCinc: + TypeName = "_RC" + elif not args.RCinc and args.SCinc: + TypeName = "_SC" + args.TypeName = TypeName + + return args + +def main(args=None): + + print() + print("###############################################################") + print("# _ _ _ #") + print("# ___ _ __ | (_) |_ __ ___ _____ _ __ __ _ __ _ ___ #") + print("# / __| '_ \| | | __| / _` \ \ / / _ \ '__/ _` |/ _` |/ _ \ #") + print("# \__ \ |_) | | | |_ | (_| |\ V / __/ | | (_| | (_| | __/ #") + print("# |___/ .__/|_|_|\__|___\__,_| \_/ \___|_| \__,_|\__, |\___| #") + print("# |_| |_____| |___/ #") + print("# #") + print("###############################################################") + print() + + if args is None: + # Run Input Parser + args = get_arguments_average() print("---------------------------") print("Selection Criteria ") @@ -121,7 +315,11 @@ def main(): Qual = [] Null = [] - print(" Processing {0:d} Events...".format(len(evs))) + print(" Found {0:d} event folders...".format(len(evs))) + if args.auto: + print(" Checking 'auto' results...") + else: + print(" Checking 'manual' results...") # Loop over Pickle Files and read in required data ic = 0 @@ -224,7 +422,8 @@ def main(): print(" {0} {1} Non-Null -> Skipped".format( str(Path(evSTR).name), split.quality)) - if not baz: + if len(baz) == 0: + print(" No splitting results to average") return # Gridspec for polar plot @@ -447,6 +646,8 @@ def main(): # Display Plot if args.showfig: plt.show() + else: + plt.close() if __name__ == "__main__": diff --git a/splitpy/scripts/split_calc_auto.py b/splitpy/scripts/split_calc_auto.py new file mode 100644 index 0000000..5d7b99a --- /dev/null +++ b/splitpy/scripts/split_calc_auto.py @@ -0,0 +1,798 @@ +#!/usr/bin/env python + +# Copyright 2019 Pascal Audet & Andrew Schaeffer +# +# This file is part of SplitPy. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# -*- coding: utf-8 -*- +import matplotlib.pyplot as plt +import matplotlib +import numpy as np +import pickle +import stdb +import copy + +from obspy.clients.fdsn import Client as FDSN_Client +from obspy.clients.filesystem.sds import Client as SDS_Client +from obspy import UTCDateTime + +from splitpy import utils +from splitpy import Split, DiagPlot + +from argparse import ArgumentParser +from os.path import exists as exist +from pathlib import Path + +matplotlib.use('Qt5Agg') + + +def get_arguments_calc_auto(argv=None): + + parser = ArgumentParser( + usage="%(prog)s [arguments] ", + description="Script wrapping " + "together the python-based implementation of SplitLab by " + + "Wustefeld and others. This version " + + "requests data on the fly for a given date range. Data is " + + "requested from the internet using " + + "the client services framework or from data provided on a " + + "local disk. The stations are processed " + + "one by one with the SKS Splitting parameters measured " + + "individually using both the " + + "Rotation-Correlation (RC) and Silver & Chan (SC) methods.") + parser.add_argument( + "indb", + help="Station Database to process from.", + type=str) + parser.add_argument( + "--keys", + action="store", + type=str, + dest="stkeys", + default="", + help="Specify a comma separated list of station keys for " + + "which to perform the analysis. These must be " + + "contained within the station database. Partial keys " + + "will be used to match against those in the " + + "dictionary. For instance, providing IU will match with " + + "all stations in the IU network [Default processes " + + "all stations in the database]") + parser.add_argument( + "-V", "--verbose", + action="store_true", + dest="verb", + default=False, + help="Specify to increase verbosity.") + parser.add_argument( + "-O", "--overwrite", + action="store_true", + dest="ovr", + default=False, + help="Force the overwriting of pre-existing Split results. " + + "Default behaviour prompts for those that " + + "already exist. Selecting overwrite and skip (ie, both flags) " + + "negate each other, and both are set to " + + "false (every repeat is prompted). [Default False]") + parser.add_argument( + "--zcomp", + dest="zcomp", + type=str, + default="Z", + help="Specify the Vertical Component Channel Identifier. "+ + "[Default Z].") + parser.add_argument( + "--skip-existing", + action="store_true", + dest="skip", + default=False, + help="Skip any event for which existing splitting results are " + + "saved to disk. Default behaviour prompts for " + + "each event. Selecting skip and overwrite (ie, both flags) " + + "negate each other, and both are set to " + + "False (every repeat is prompted). [Default False]") + parser.add_argument( + "--calc", + action="store_true", + dest="calc", + default=False, + help="Analyze data for shear-wave splitting. [Default saves data "+ + "to folders for subsequent analysis]") + parser.add_argument( + "--plot-diagnostic", + action="store_true", + dest="diagplot", + default=False, + help="Plot diagnostic window at end of process. [Default False]") + parser.add_argument( + "--recalc", + action="store_true", + dest="recalc", + default=False, + help="Re-calculate estimates and overwrite existing splitting "+ + "results without re-downloading data. [Default False]") + + # Server Settings + ServerGroup = parser.add_argument_group( + title="Server Settings", + description="Settings associated with which " + "datacenter to log into.") + ServerGroup.add_argument( + "--server", + action="store", + type=str, + dest="server", + default="IRIS", + help="Base URL of FDSN web service compatible " + "server (e.g. “http://service.iris.edu”) or key string for recognized " + "server (one of 'AUSPASS', 'BGR', 'EARTHSCOPE', 'EIDA', 'EMSC', 'ETH', " + "'GEOFON', 'GEONET', 'GFZ', 'ICGC', 'IESDMC', 'INGV', 'IPGP', 'IRIS', " + "'IRISPH5', 'ISC', 'KNMI', 'KOERI', 'LMU', 'NCEDC', 'NIEP', 'NOA', " + "'NRCAN', 'ODC', 'ORFEUS', 'RASPISHAKE', 'RESIF', 'RESIFPH5', 'SCEDC', " + "'TEXNET', 'UIB-NORSAR', 'USGS', 'USP'). [Default 'IRIS']") + ServerGroup.add_argument( + "--user-auth", + action="store", + type=str, + dest="userauth", + default=None, + help="Authentification Username and Password for the " + + "waveform server (--user-auth='username:authpassword') to access " + + "and download restricted data. [Default no user and password]") + ServerGroup.add_argument( + "--eida-token", + action="store", + type=str, + dest="tokenfile", + default=None, + help="Token for EIDA authentication mechanism, see " + + "http://geofon.gfz-potsdam.de/waveform/archive/auth/index.php. " + "If a token is provided, argument --user-auth will be ignored. " + "This mechanism is only available on select EIDA nodes. The token can " + "be provided in form of the PGP message as a string, or the filename of " + "a local file with the PGP message in it. [Default None]") + + # Database Settings + DataGroup = parser.add_argument_group( + title="Local Data Settings", + description="Settings associated with defining " + + "and using a local data base of pre-downloaded " + + "day-long SAC or MSEED files.") + DataGroup.add_argument( + "--local-data", + action="store", + type=str, + dest="localdata", + default=None, + help="Specify absolute path to a SeisComP Data Structure (SDS) " + + "archive containing day-long SAC or MSEED files" + + "(e.g., --local-data=/Home/username/Data/SDS). " + + "See https://www.seiscomp.de/seiscomp3/doc/applications/slarchive/SDS.html " + + "for details on the SDS format. If this option is used, it takes " + + "precedence over the --server settings.") + DataGroup.add_argument( + "--dtype", + action="store", + type=str, + dest="dtype", + default='MSEED', + help="Specify the data archive file type, either SAC " + + " or MSEED. Note the default behaviour is to search for " + + "SAC files. Local archive files must have extensions of " + + "'.SAC' or '.MSEED'. These are case dependent, so specify " + + "the correct case here.") + # DataGroup.add_argument( + # "--no-data-zero", + # action="store_true", + # dest="ndval", + # default=False, + # help="Specify to force missing data to be set as zero, rather " + + # "than default behaviour which sets to nan.") + # DataGroup.add_argument( + # "--no-local-net", + # action="store_false", + # dest="useNet", + # default=True, + # help="Specify to prevent using the Network code in the " + + # "search for local data (sometimes for CN stations " + + # "the dictionary name for a station may disagree with that " + + # "in the filename. [Default Network used]") + + # Constants Settings + ConstGroup = parser.add_argument_group( + title='Parameter Settings', + description="Miscellaneous default values and settings") + ConstGroup.add_argument( + "--sampling-rate", + action="store", + type=float, + dest="new_sampling_rate", + default=10., + help="Specify new sampling rate in Hz. [Default 10.]") + ConstGroup.add_argument( + "--min-snr", + action="store", + type=float, + dest="msnr", + default=5., + help="Minimum SNR value calculated on the radial (Q) component "+ + "to proceed with analysis (dB). [Default 5.]") + ConstGroup.add_argument( + "--window", + action="store", + type=float, + dest="dts", + default=120., + help="Specify time window length before and after the SKS " + "arrival. The total window length is 2*dst (sec). [Default 120]") + ConstGroup.add_argument( + "--max-delay", + action="store", + type=float, + dest="maxdt", + default=4., + help="Specify the maximum delay time in search (sec). "+ + "[Default 4]") + ConstGroup.add_argument( + "--dt-delay", + action="store", + type=float, + dest="ddt", + default=0.1, + help="Specify the time delay increment in search (sec). "+ + "[Default 0.1]") + ConstGroup.add_argument( + "--dphi", + action="store", + type=float, + dest="dphi", + default=1., + help="Specify the fast angle increment in search (degree). "+ + "[Default 1.]") + ConstGroup.add_argument( + "--snrT", + action="store", + type=float, + dest="snrTlim", + default=1., + help="Specify the minimum SNR Threshold for the Transverse " + + "component to be considered Non-Null. [Default 1.]") + ConstGroup.add_argument( + "--fmin", + action="store", + type=float, + dest="fmin", + default=0.02, + help="Specify the minimum frequency corner for bandpass " + + "filter (Hz). [Default 0.02]") + ConstGroup.add_argument( + "--fmax", + action="store", + type=float, + dest="fmax", + default=0.5, + help="Specify the maximum frequency corner for bandpass " + + "filter (Hz). [Default 0.5]") + + # Event Selection Criteria + EventGroup = parser.add_argument_group( + title="Event Settings", + description="Settings associated with refining " + "the events to include in matching station pairs") + EventGroup.add_argument( + "--start", + action="store", + type=str, + dest="startT", + default="", + help="Specify a UTCDateTime compatible string representing " + + "the start time for the event search. This will override any " + + "station start times. [Default start date of each station]") + EventGroup.add_argument( + "--end", + action="store", + type=str, + dest="endT", + default="", + help="Specify a UTCDateTime compatible string representing " + + "the end time for the event search. This will override any " + + "station end times [Default end date of each station]") + EventGroup.add_argument( + "--reverse", + action="store_true", + dest="reverse", + default=False, + help="Reverse order of events. Default behaviour starts at " + + "oldest event and works towards most recent. " + + "Specify reverse order and instead the program will start " + + "with the most recent events and work towards older") + EventGroup.add_argument( + "--min-mag", + action="store", + type=float, + dest="minmag", + default=6.0, + help="Specify the minimum magnitude of event for which to " + + "search. [Default 6.0]") + EventGroup.add_argument( + "--max-mag", + action="store", + type=float, + dest="maxmag", + default=None, + help="Specify the maximum magnitude of event for which to " + + "search. [Default None, i.e. no limit]") + + # Geometry Settings + GeomGroup = parser.add_argument_group( + title="Geometry Settings", + description="Settings associatd with the " + "event-station geometries") + GeomGroup.add_argument( + "--min-dist", + action="store", + type=float, + dest="mindist", + default=85., + help="Specify the minimum great circle distance (degrees) " + + "between the station and event. [Default 85]") + GeomGroup.add_argument( + "--max-dist", + action="store", + type=float, + dest="maxdist", + default=120., + help="Specify the maximum great circle distance (degrees) " + + "between the station and event. [Default 120]") + GeomGroup.add_argument( + "--phase", + action="store", + type=str, + dest="phase", + default='SKS', + help="Specify the phase name to use. Be careful with the distance. " + + "setting. Options are 'SKS' or 'SKKS'. [Default 'SKS']") + + args = parser.parse_args(argv) + + # Check inputs + if not exist(args.indb): + parser.error("Input file " + args.indb + " does not exist") + + # create station key list + if len(args.stkeys) > 0: + args.stkeys = args.stkeys.split(',') + + # construct start time + if len(args.startT) > 0: + try: + args.startT = UTCDateTime(args.startT) + except: + parser.error( + "Cannot construct UTCDateTime from start time: " + + args.startT) + else: + args.startT = None + + # construct end time + if len(args.endT) > 0: + try: + args.endT = UTCDateTime(args.endT) + except: + parser.error( + "Cannot construct UTCDateTime from end time: " + + args.endT) + else: + args.endT = None + + # Parse restricted data settings + if args.tokenfile is not None: + args.userauth = [None, None] + else: + if args.userauth is not None: + tt = args.userauth.split(':') + if not len(tt) == 2: + msg = ( + "Error: Incorrect Username and Password Strings " + + "for User Authentification") + parser.error(msg) + else: + args.userauth = tt + else: + args.userauth = [None, None] + + # Check existing file behaviour + if args.skip and args.ovr: + args.skip = False + args.ovr = False + + # Check Datatype specification + if args.dtype.upper() not in ['MSEED', 'SAC']: + parser.error( + "Error: Local Data Archive must be of types 'SAC'" + + "or MSEED. These must match the file extensions for " + + " the archived data.") + + # Check selected phase + if args.phase not in ['SKS', 'SKKS', 'PKS']: + parser.error( + "Error: choose between 'SKS', 'SKKS and 'PKS'.") + + # Check distances for all phases + if not args.mindist: + if args.phase == 'SKS': + args.mindist = 85. + elif args.phase == 'SKKS': + args.mindist = 90. + elif args.phase == 'PKS': + args.mindist = 130. + if not args.maxdist: + if args.phase == 'SKS': + args.maxdist = 120. + elif args.phase == 'SKKS': + args.maxdist = 130. + elif args.phase == 'PKS': + args.maxdist = 150. + if args.mindist < 85. or args.maxdist > 180.: + parser.error( + "Distances should be between 85 and 180 deg. for " + + "teleseismic 'SKS', 'SKKS' and 'PKS' waves.") + + return args + +def main(args=None): + + print() + print("###################################################################") + print("# _ _ _ _ _ #") + print("# ___ _ __ | (_) |_ ___ __ _| | ___ __ _ _ _| |_ ___ #") + print("# / __| '_ \| | | __| / __/ _` | |/ __| / _` | | | | __/ _ \ #") + print("# \__ \ |_) | | | |_ | (_| (_| | | (__ | (_| | |_| | || (_) | #") + print("# |___/ .__/|_|_|\__|___\___\__,_|_|\___|___\__,_|\__,_|\__\___/ #") + print("# |_| |_____| |_____| #") + print("# #") + print("###################################################################") + print() + + if args is None: + # Run Input Parser + args = get_arguments_calc_auto() + + # Load Database + # stdb=0.1.4 + try: + db, stkeys = stdb.io.load_db(fname=args.indb, keys=args.stkeys) + + # stdb=0.1.3 + except: + db = stdb.io.load_db(fname=args.indb) + + # Construct station key loop + allkeys = db.keys() + sorted(allkeys) + + # Extract key subset + if len(args.stkeys) > 0: + stkeys = [] + for skey in args.stkeys: + stkeys.extend([s for s in allkeys if skey in s]) + else: + stkeys = db.keys() + sorted(stkeys) + + # Loop over station keys + for stkey in list(stkeys): + + # Extract station information from dictionary + sta = db[stkey] + + # Output directory + datapath = Path('DATA') / stkey + if not datapath.is_dir(): + datapath.mkdir(parents=True) + + # Establish client + if args.localdata is None: + data_client = FDSN_Client( + base_url=args.server, + user=args.userauth[0], + password=args.userauth[1], + eida_token=args.tokenfile) + else: + data_client = SDS_Client( + args.localdata, + format=args.dtype) + + # Establish client for events + event_client = FDSN_Client() + + # Get catalogue search start time + if args.startT is None: + tstart = sta.startdate + else: + tstart = args.startT + + # Get catalogue search end time + if args.endT is None: + tend = sta.enddate + else: + tend = args.endT + if tstart > sta.enddate or tend < sta.startdate: + continue + + # Temporary print locations + tlocs = copy.copy(sta.location) + if len(tlocs) == 0: + tlocs = [''] + for il in range(0, len(tlocs)): + if len(tlocs[il]) == 0: + tlocs.append("--") + + # Update Display + print(" ") + print(" ") + print("|"+"="*50+"|") + print("| {0:>8s} |".format( + sta.station)) + print("|"+"="*50+"|") + print("| Station: {0:>2s}.{1:5s} |".format( + sta.network, sta.station)) + print("| Channel: {0:2s}; Locations: {1:15s} |".format( + sta.channel, ",".join(tlocs))) + print("| Lon: {0:7.2f}; Lat: {1:6.2f} |".format( + sta.longitude, sta.latitude)) + print("| Start time: {0:19s} |".format( + sta.startdate.strftime("%Y-%m-%d %H:%M:%S"))) + print("| End time: {0:19s} |".format( + sta.enddate.strftime("%Y-%m-%d %H:%M:%S"))) + print("|"+"-"*50+"|") + print("| Searching Possible events: |") + print("| Start: {0:19s} |".format( + tstart.strftime("%Y-%m-%d %H:%M:%S"))) + print("| End: {0:19s} |".format( + tend.strftime("%Y-%m-%d %H:%M:%S"))) + if args.maxmag is None: + print("| Mag: >{0:3.1f}".format(args.minmag) + + " |") + else: + msg = "| Mag: {0:3.1f}".format(args.minmag) + \ + " - {0:3.1f}".format(args.maxmag) + \ + " |" + print(msg) + + print("| ... |") + + # Get catalogue using deployment start and end + cat = event_client.get_events( + starttime=tstart, + endtime=tend, + minmagnitude=args.minmag, + maxmagnitude=args.maxmag) + + # Total number of events in Catalogue + nevK = 0 + nevtT = len(cat) + print( + "| Found {0:5d}".format(nevtT) + + " possible events |") + ievs = range(0, nevtT) + + # Select order of processing + if args.reverse: + ievs = range(0, nevtT) + else: + ievs = range(nevtT-1, -1, -1) + + # Read through catalogue + for iev in ievs: + + # Extract event + ev = cat[iev] + + # Initialize Split object with station info + split = Split(sta, zcomp=args.zcomp) + + # Add event to split object + accept = split.add_event( + ev, + gacmin=args.mindist, + gacmax=args.maxdist, + phase=args.phase, + returned=True) + + # Define time stamp + yr = str(split.meta.time.year).zfill(4) + jd = str(split.meta.time.julday).zfill(3) + hr = str(split.meta.time.hour).zfill(2) + + # If event is accepted (data exists) + if accept: + + # Display Event Info + nevK = nevK + 1 + if args.reverse: + inum = iev + 1 + else: + inum = nevtT - iev + 1 + print(" ") + print("*"*50) + print("* #{0:d} ({1:d}/{2:d}): {3:13s} {4}".format( + nevK, inum, nevtT, split.meta.time.strftime( + "%Y%m%d_%H%M%S"), stkey)) + if args.verb: + print("* Phase: {}".format(args.phase)) + print("* Origin Time: " + + split.meta.time.strftime("%Y-%m-%d %H:%M:%S")) + print( + "* Lat: {0:6.2f}; Lon: {1:7.2f}".format( + split.meta.lat, split.meta.lon)) + print( + "* Dep: {0:6.2f} km; Mag: {1:3.1f}".format( + split.meta.dep, split.meta.mag)) + print("* Dist: {0:7.2f} km;".format(split.meta.epi_dist) + + " Epi dist: {0:6.2f} deg\n".format(split.meta.gac) + + "* Baz: {0:6.2f} deg;".format(split.meta.baz) + + " Az: {0:6.2f} deg".format(split.meta.az)) + + # Event Folder + timekey = split.meta.time.strftime("%Y%m%d_%H%M%S") + datadir = datapath / timekey + ZNEfile = datadir / 'ZNE_data.pkl' + LQTfile = datadir / 'LQT_data.pkl' + metafile = datadir / 'Meta_data.pkl' + stafile = datadir / 'Station_data.pkl' + splitfile = datadir / 'Split_results_auto.pkl' + + # Check if RF data already exist and overwrite has been set + if datadir.exists(): + if splitfile.exists(): + if not args.ovr: + continue + + if args.recalc: + if np.sum([file.exists() for file in + [ZNEfile, metafile, stafile]]) < 3: + continue + sta = pickle.load(open(stafile, "rb")) + split = Split(sta) + meta = pickle.load(open(metafile, "rb")) + split.meta = meta + dataZNE = pickle.load(open(ZNEfile, "rb")) + split.dataZNE = dataZNE + + # Rotate from ZNE to 'LQT' + split.rotate(align='LQT') + + # Filter rotated traces + split.dataLQT.filter( + 'bandpass', + freqmin=args.fmin, + freqmax=args.fmax) + + # Calculate snr over dt_snr seconds + split.calc_snr() + + # Save LQT Traces + pickle.dump(split.dataLQT, open(LQTfile, "wb")) + + else: + + # Get data + has_data = split.download_data( + client=data_client, + new_sr=args.new_sampling_rate, + dts=args.dts, + returned=True, + verbose=args.verb) + + if not has_data: + continue + + # Rotate from ZNE to 'LQT' + split.rotate(align='LQT') + + # Filter rotated traces + split.dataLQT.filter( + 'bandpass', + freqmin=args.fmin, + freqmax=args.fmax) + + # Calculate snr over dt_snr seconds + split.calc_snr() + + # If SNR lower than user-specified threshold, continue + if split.meta.snrq < args.msnr: + if args.verb: + print( + "* SNRQ < {0:.1f}, continuing".format(args.msnr)) + print("*"*50) + continue + + # Make sure no processing happens for NaNs + if np.isnan(split.meta.snrq): + if args.verb: + print("* SNR NaN, continuing") + print("*"*50) + continue + + # Create Folder if it doesn't exist + if not datadir.exists(): + datadir.mkdir(parents=True) + + # Save ZNE Traces + pickle.dump(split.dataZNE, open(ZNEfile, "wb")) + + # Save LQT Traces + pickle.dump(split.dataLQT, open(LQTfile, "wb")) + + if args.verb: + print("* SNRQ: {}".format(split.meta.snrq)) + print("* SNRT: {}".format(split.meta.snrt)) + + if args.calc or args.recalc: + + # Analyze + split.analyze(verbose=args.verb) + + # Continue if problem with analysis + if split.RC_res.edtt is None or split.SC_res.edtt is None: + if args.verb: + print("* !!! DOF Error. --> Skipping...") + print("*"*50) + continue + + # Determine if Null and Quality of estimate + split.is_null(args.snrTlim, verbose=args.verb) + split.get_quality(verbose=args.verb) + + # Display results + if args.verb: + split.display_meta() + if args.calc or args.recalc: + split.display_results() + split.display_null_quality() + + # Save event meta data + pickle.dump(split.meta, open(metafile, "wb")) + + # Save Station Data + pickle.dump(split.sta, open(stafile, "wb")) + + if args.calc or args.recalc: + # Save Split Data + file = open(splitfile, "wb") + pickle.dump(split.SC_res, file) + pickle.dump(split.RC_res, file) + pickle.dump(split.null, file) + pickle.dump(split.quality, file) + file.close() + + # Initialize diagnostic figure and plot it + if args.diagplot: + dplot = DiagPlot(split) + dplot.plot_diagnostic() + plt.figure(dplot.axes[0].number) + plt.show() + + +if __name__ == "__main__": + + # Run main program + main() diff --git a/Scripts/split_calc_manual.py b/splitpy/scripts/split_calc_manual.py similarity index 63% rename from Scripts/split_calc_manual.py rename to splitpy/scripts/split_calc_manual.py index 1ee4bb7..526c723 100755 --- a/Scripts/split_calc_manual.py +++ b/splitpy/scripts/split_calc_manual.py @@ -23,28 +23,188 @@ # SOFTWARE. # -*- coding: utf-8 -*- -from pathlib import Path -from splitpy import Pick, Keep, Save, Repeat -from splitpy import PickPlot, DiagPlot -from splitpy import arguments, utils -from splitpy import Split import matplotlib.pyplot as plt +import matplotlib import numpy as np import pickle import stdb + from obspy.clients.fdsn import Client from obspy import UTCDateTime + +from splitpy import Pick, Keep, Save, Repeat +from splitpy import PickPlot, DiagPlot +from splitpy import utils +from splitpy import Split + from PyQt5.QtCore import pyqtSlot from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication -import matplotlib -matplotlib.use('Qt5Agg') +from argparse import ArgumentParser +from os.path import exists as exist +from pathlib import Path + +matplotlib.use('Qt5Agg') -def main(): - # Run Input Parser - args = arguments.get_arguments_calc_manual() +def get_arguments_calc_manual(argv=None): + + parser = ArgumentParser( + usage="%(prog)s [arguments] ", + description="Script to process " + "and calculate the spliting parameters for a dataset " + + "that has already been downloaded by split_calc_auto. ") + + # General Settings + parser.add_argument( + "indb", + help="Station Database to process from.", + type=str) + parser.add_argument( + "--keys", + action="store", + type=str, + dest="stkeys", + default="", + help="Specify a comma separated list of station keys " + + "for which to perform analysis. These must be " + + "contained within the station database. Partial keys " + + "will be used to match against those in the " + + "dictionary. For instance, providing IU will match " + + "with all stations in the IU network [Default " + + "processes all stations in the database]") + parser.add_argument( + "-V", "--verbose", + action="store_true", + dest="verb", + default=False, + help="Specify to increase verbosity.") + + # Constants Settings + ConstGroup = parser.add_argument_group( + title='Parameter Settings', + description="Miscellaneous default values and settings") + ConstGroup.add_argument( + "--window", + action="store", + type=float, + dest="dts", + default=120., + help="Specify time window length before and after the SKS " + "arrival. The total window length is 2*dst (sec). [Default 120]") + ConstGroup.add_argument( + "--max-delay", + action="store", + type=float, + dest="maxdt", + default=4., + help="Specify the maximum delay time. [Default 4 s]") + ConstGroup.add_argument( + "--time-increment", + action="store", + type=float, + dest="ddt", + default=0.1, + help="Specify the time increment. [Default 0.1 s]") + ConstGroup.add_argument( + "--angle-increment", + action="store", + type=float, + dest="dphi", + default=1., + help="Specify the angle increment. [Default 1 d]") + ConstGroup.add_argument( + "--transverse-SNR", + action="store", + type=float, + dest="snrTlim", + default=1., + help="Specify the minimum SNR Threshold for the Transverse " + + "component to be considered Non-Null. [Default 1.]") + + # Event Selection Criteria + EventGroup = parser.add_argument_group( + title="Event Settings", + description="Settings associated with " + + "refining the events to include in matching station pairs") + EventGroup.add_argument( + "--start", + action="store", + type=str, + dest="startT", + default="", + help="Specify a UTCDateTime compatible string representing the " + + "start time for the event search. This will override any station " + + "start times. [Default more recent start date for each station pair]") + EventGroup.add_argument( + "--end", + action="store", + type=str, + dest="endT", + default="", + help="Specify a UTCDateTime compatible string representing the " + + "end time for the event search. This will override any station " + + "end times [Default older end date for each the pair of stations]") + EventGroup.add_argument( + "--reverse-order", + action="store_true", + dest="reverse", + default=False, + help="Reverse order of events. Default behaviour starts at oldest " + + "event and works towards most recent. Specify reverse order and " + + "instead the program will start with the most recent events and " + + "work towards older") + + args = parser.parse_args(argv) + + # Check inputs + if not exist(args.indb): + parser.error("Input file " + args.indb + " does not exist") + + # create station key list + if len(args.stkeys) > 0: + args.stkeys = args.stkeys.split(',') + + # construct start time + if len(args.startT) > 0: + try: + args.startT = UTCDateTime(args.startT) + except: + parser.error( + "Cannot construct UTCDateTime from start time: " + args.startT) + else: + args.startT = None + + # construct end time + if len(args.endT) > 0: + try: + args.endT = UTCDateTime(args.endT) + except: + parser.error( + "Cannot construct UTCDateTime from end time: " + args.endT) + else: + args.endT = None + + return args + +def main(args=None): + + print() + print("###################################################################################") + print("# _ _ _ _ _ #") + print("# ___ _ __ | (_) |_ ___ __ _| | ___ _ __ ___ __ _ _ __ _ _ __ _| | #") + print("# / __| '_ \| | | __| / __/ _` | |/ __| | '_ ` _ \ / _` | '_ \| | | |/ _` | | #") + print("# \__ \ |_) | | | |_ | (_| (_| | | (__ | | | | | | (_| | | | | |_| | (_| | | #") + print("# |___/ .__/|_|_|\__|___\___\__,_|_|\___|___|_| |_| |_|\__,_|_| |_|\__,_|\__,_|_| #") + print("# |_| |_____| |_____| #") + print("# #") + print("###################################################################################") + print() + + if args is None: + # Run Input Parser + args = get_arguments_calc_manual() # Load Database # stdb=0.1.4 diff --git a/splitpy/tests/get_meta.py b/splitpy/tests/get_meta.py index f694833..ba6bcd1 100644 --- a/splitpy/tests/get_meta.py +++ b/splitpy/tests/get_meta.py @@ -1,7 +1,6 @@ import stdb import numpy as np from pkg_resources import resource_filename -from obspy.clients.fdsn import Client def get_stdb(): diff --git a/splitpy/tests/test_args.py b/splitpy/tests/test_args.py index a2c23cd..0b3a990 100644 --- a/splitpy/tests/test_args.py +++ b/splitpy/tests/test_args.py @@ -1,6 +1,8 @@ import numpy as np -from splitpy import arguments from pkg_resources import resource_filename +from splitpy.scripts import split_calc_auto as sca +from splitpy.scripts import split_calc_manual as scm +from splitpy.scripts import split_average as sa from pathlib import Path from . import get_meta @@ -9,14 +11,14 @@ 'examples/data/MMPY.pkl') def test_get_args_calc_auto(): - args = arguments.get_arguments_calc_auto([dbfile]) + args = sca.get_arguments_calc_auto([dbfile]) return args def test_get_args_calc_manual(): - args = arguments.get_arguments_calc_manual([dbfile]) + args = scm.get_arguments_calc_manual([dbfile]) return args def test_get_args_average(): - args = arguments.get_arguments_average([dbfile]) + args = sa.get_arguments_average([dbfile]) return args diff --git a/splitpy/tests/test_imports.py b/splitpy/tests/test_imports.py index f0e269b..d33906f 100644 --- a/splitpy/tests/test_imports.py +++ b/splitpy/tests/test_imports.py @@ -6,7 +6,7 @@ def test_obspy_import(): def test_splitpy_modules(): import splitpy - from splitpy import utils, calc, classes, arguments, gui + from splitpy import utils, calc, classes, gui from splitpy.classes import Meta, Result, Split from splitpy import Pick, Keep, Save, Repeat from splitpy import PickPlot, DiagPlot diff --git a/splitpy/tests/test_scripts.py b/splitpy/tests/test_scripts.py index 0c826c1..5ab478f 100644 --- a/splitpy/tests/test_scripts.py +++ b/splitpy/tests/test_scripts.py @@ -2,6 +2,7 @@ import numpy as np import pickle import stdb +import copy from obspy.clients.fdsn import Client from splitpy import Split, utils from . import test_args, get_meta @@ -41,10 +42,12 @@ def test_split(tmp_path): # Establish client if len(args.UserAuth) == 0: - data_client = Client(args.Server) + data_client = Client(args.server) else: data_client = Client( - args.Server, user=args.UserAuth[0], password=args.UserAuth[1]) + args.Server, + user=args.UserAuth[0], + password=args.UserAuth[1]) # Establish client for events event_client = Client() @@ -64,13 +67,12 @@ def test_split(tmp_path): continue # Temporary print locations - tlocs = sta.location + tlocs = copy.copy(sta.location) if len(tlocs) == 0: tlocs = [''] for il in range(0, len(tlocs)): if len(tlocs[il]) == 0: - tlocs[il] = "--" - sta.location = tlocs + tlocs.append("--") # Update Display print(" ") @@ -110,8 +112,10 @@ def test_split(tmp_path): # Get catalogue using deployment start and end cat = event_client.get_events( - starttime=tstart, endtime=tend, - minmagnitude=args.minmag, maxmagnitude=args.maxmag) + starttime=tstart, + endtime=tend, + minmagnitude=args.minmag, + maxmagnitude=args.maxmag) # Total number of events in Catalogue nevK = 0 @@ -121,27 +125,6 @@ def test_split(tmp_path): " possible events |") ievs = range(0, nevtT) - # Get Local Data Availabilty - if len(args.localdata) > 0: - print("|-----------------------------------------------|") - print("| Cataloging Local Data... |") - if args.useNet: - stalcllist = utils.list_local_data_stn( - lcldrs=args.localdata, sta=sta.station, - net=sta.network, altnet=sta.altnet) - print("| {0:>2s}.{1:5s}: {2:6d} files " + - " |".format( - sta.network, sta.station, len(stalcllist))) - else: - stalcllist = utils.list_local_data_stn( - lcldrs=args.localdata, sta=sta.station) - print("| {0:5s}: {1:6d} files " + - " |".format( - sta.station, len(stalcllist))) - else: - stalcllist = [] - print("|===============================================|") - # Select order of processing if args.reverse: ievs = range(0, nevtT) @@ -159,8 +142,11 @@ def test_split(tmp_path): # Add event to split object accept = split.add_event( - ev, gacmin=args.mindist, gacmax=args.maxdist, - phase=args.phase, returned=True) + ev, + gacmin=args.mindist, + gacmax=args.maxdist, + phase=args.phase, + returned=True) # Define time stamp yr = str(split.meta.time.year).zfill(4) @@ -214,9 +200,11 @@ def test_split(tmp_path): # Get data has_data = split.download_data( - client=data_client, dts=args.dts, stdata=stalcllist, - ndval=args.ndval, new_sr=args.new_sampling_rate, - returned=True, verbose=args.verb) + client=data_client, + dts=args.dts, + new_sr=args.new_sampling_rate, + returned=True, + verbose=args.verb) if not has_data: continue diff --git a/splitpy/utils.py b/splitpy/utils.py index c66bd3c..e9be13e 100644 --- a/splitpy/utils.py +++ b/splitpy/utils.py @@ -2,6 +2,7 @@ from obspy import UTCDateTime from numpy import nan, isnan, abs import numpy as np +import copy from obspy.core import Stream, read @@ -37,414 +38,14 @@ def traceshift(trace, tt): return rtrace - -def list_local_data_stn(lcldrs=list, sta=None, net=None, dtype='SAC', altnet=[]): - """ - Function to take the list of local directories and recursively - find all data that matches the station name - - Parameters - ---------- - lcldrs : List - List of local directories - sta : Dict - Station metadata from :mod:`~StDb` - net : str - Network name - altnet : List - List of alternative networks - - Returns - ------- - fpathmatch : List - Sorted list of matched directories - - """ - from fnmatch import filter - from os import walk - from os.path import join - - - if sta is None: - return [] - else: - if net is None: - sstrings = ['*.{0:s}.*.{1:s}'.format(sta, dtype)] - else: - sstrings = ['*.{0:s}.{1:s}.*.{2:s}'.format(net, sta, dtype)] - if len(altnet) > 0: - for anet in altnet: - sstrings.append( - '*.{0:s}.{1:s}.*.{2:s}'.format(anet, sta, dtype)) - - fpathmatch = [] - # Loop over all local data directories - for lcldr in lcldrs: - # Recursiely walk through directory - for root, dirnames, filenames in walk(lcldr): - # Keep paths only for those matching the station - for sstring in sstrings: - for filename in filter(filenames, sstring): - fpathmatch.append(join(root, filename)) - - fpathmatch.sort() - - return fpathmatch - - -def parse_localdata_for_comp(comp='Z', stdata=[], dtype='SAC', sta=None, - start=UTCDateTime, end=UTCDateTime, ndval=nan): - """ - Function to determine the path to data for a given component and alternate network - - Parameters - ---------- - comp : str - Channel for seismogram (one letter only) - stdata : List - Station list - sta : Dict - Station metadata from :mod:`~StDb` data base - start : :class:`~obspy.core.utcdatetime.UTCDateTime` - Start time for request - end : :class:`~obspy.core.utcdatetime.UTCDateTime` - End time for request - ndval : float or nan - Default value for missing data - - Returns - ------- - err : bool - Boolean for error handling (`False` is associated with success) - st : :class:`~obspy.core.Stream` - Stream containing North, East and Vertical components of motion - +def download_data(client=None, sta=None, start=UTCDateTime(), + end=UTCDateTime(), new_sr=0., verbose=False, + remove_response=False, zcomp='Z'): """ - - from fnmatch import filter - - # Get start and end parameters - styr = start.strftime("%Y") - stjd = start.strftime("%j") - edyr = end.strftime("%Y") - edjd = end.strftime("%j") - - # Intialize to default positive error - erd = True - - print( - ("* {0:2s}{1:1s} - Checking Disk".format(sta.channel.upper(), - comp.upper()))) - - # Time Window Spans Single Day - if stjd == edjd: - # Format 1 - lclfiles = list(filter( - stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.{4:2s}{5:1s}.{6:s}'.format( - styr, stjd, sta.network.upper( - ), sta.station.upper(), sta.channel.upper()[0:2], - comp.upper(), dtype))) - # Format 2 - if len(lclfiles) == 0: - lclfiles = list(filter( - stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.*{4:1s}.{5:s}'.format( - styr, stjd, sta.network.upper(), sta.station.upper(), - comp.upper(), dtype))) - - # Alternate Nets (for CN/PO issues) Format 1 - if len(lclfiles) == 0: - lclfiles = [] - for anet in sta.altnet: - lclfiles.extend( - list( - filter( - stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.' + - '{4:2s}{5:1s}.{6:s}'.format( - styr, stjd, anet.upper(), sta.station.upper(), - sta.channel.upper()[0:2], comp.upper(), dtype)))) - - # Alternate Nets (for CN/PO issues) Format 2 - if len(lclfiles) == 0: - # Check Alternate Networks - lclfiles = [] - for anet in sta.altnet: - lclfiles.extend( - list( - filter( - stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.*' + - '{4:1s}.{5:s}'.format( - styr, stjd, sta.network.upper(), - sta.station.upper(), comp.upper(), dtype)))) - - # If still no Local files stop - if len(lclfiles) == 0: - print("* - Data Unavailable") - return erd, None - - # Process the local Files - for sacfile in lclfiles: - # Read File - st = read(sacfile) - # st = read(sacfile, format="SAC") - - if dtype.upper() == 'MSEED': - if len(st) > 1: - st.merge(method=1, interpolation_samples=- - 1, fill_value=-123456789) - - # Should only be one component, otherwise keep reading If more - # than 1 component, error - if len(st) != 1: - pass - - else: - # Check start/end times in range - if (st[0].stats.starttime <= start and - st[0].stats.endtime >= end): - st.trim(starttime=start, endtime=end) - - eddt = False - # Check for NoData and convert to NaN if a SAC file - if dtype.upper() == 'SAC': - stnd = st[0].stats.sac['user9'] - if (not stnd == 0.0) and (not stnd == -12345.0): - st[0].data[st[0].data == stnd] = ndval - eddt = True - - # Check for Nan in stream for SAC - if True in isnan(st[0].data): - print( - "* !!! Missing Data Present !!! " + - "Skipping (NaNs)") - # Check for ND Val in stream for MSEED - elif -123456789 in st[0].data: - print( - "* !!! Missing Data Present !!! " + - "Skipping (MSEED fill)") - else: - if eddt and (ndval == 0.0): - if any(st[0].data == 0.0): - print( - "* !!! Missing Data Present " + - "!!! (Set to Zero)") - - st[0].stats.update() - tloc = st[0].stats.location - if len(tloc) == 0: - tloc = "--" - - # Processed succesfully...Finish - print(("* {1:3s}.{2:2s} - From Disk".format( - st[0].stats.station, st[0].stats.channel.upper(), - tloc))) - return False, st - - # Time Window spans Multiple days - else: - # Day 1 Format 1 - lclfiles1 = list( - filter(stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.{4:2s}{5:1s}.{6:s}'.format( - styr, stjd, sta.network.upper(), sta.station.upper(), - sta.channel.upper()[0:2], comp.upper(), dtype))) - # Day 1 Format 2 - if len(lclfiles1) == 0: - lclfiles1 = list( - filter(stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.*{4:1s}.{5:s}'.format( - styr, stjd, sta.network.upper(), - sta.station.upper(), comp.upper(), dtype))) - # Day 1 Alternate Nets (for CN/PO issues) Format 1 - if len(lclfiles1) == 0: - lclfiles1 = [] - for anet in sta.altnet: - lclfiles1.extend( - list( - filter( - stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.' + - '{4:2s}{5:1s}.{6:s}'.format( - styr, stjd, anet.upper(), sta.station.upper( - ), sta.channel.upper()[0:2], - comp.upper(), dtype)))) - # Day 1 Alternate Nets (for CN/PO issues) Format 2 - if len(lclfiles1) == 0: - lclfiles1 = [] - for anet in sta.altnet: - lclfiles1.extend( - list( - filter( - stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.*{4:1s}.{5:s}'.format( - styr, stjd, anet.upper(), - sta.station.upper(), comp.upper(), dtype)))) - - # Day 2 Format 1 - lclfiles2 = list( - filter(stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.{4:2s}{5:1s}.{6:s}'.format( - edyr, edjd, sta.network.upper( - ), sta.station.upper(), sta.channel.upper()[0:2], - comp.upper(), dtype))) - # Day 2 Format 2 - if len(lclfiles2) == 0: - lclfiles2 = list( - filter(stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.*' + - '{4:1s}.{5:s}'.format( - edyr, edjd, sta.network.upper(), - sta.station.upper(), - comp.upper(), dtype))) - # Day 2 Alternate Nets (for CN/PO issues) Format 1 - if len(lclfiles2) == 0: - lclfiles2 = [] - for anet in sta.altnet: - lclfiles2.extend( - list( - filter( - stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.' + - '{4:2s}{5:1s}.{6:s}'.format( - edyr, edjd, anet.upper(), sta.station.upper(), - sta.channel.upper()[0:2], comp.upper(), dtype)))) - # Day 2 Alternate Nets (for CN/PO issues) Format 2 - if len(lclfiles2) == 0: - lclfiles2 = [] - for anet in sta.altnet: - lclfiles2.extend( - list( - filter( - stdata, - '*/{0:4s}.{1:3s}.{2:s}.{3:s}.*.*{4:1s}.{5:s}'.format( - edyr, edjd, anet.upper(), sta.station.upper(), - comp.upper(), dtype)))) - - # If still no Local files stop - if len(lclfiles1) == 0 and len(lclfiles2) == 0: - print("* - Data Unavailable") - return erd, None - - # Now try to merge the two separate day files - if len(lclfiles1) > 0 and len(lclfiles2) > 0: - # Loop over first day file options - for sacf1 in lclfiles1: - st1 = read(sacf1) - if dtype.upper() == 'MSEED': - if len(st1) > 1: - st1.merge(method=1, interpolation_samples=- - 1, fill_value=-123456789) - - # Loop over second day file options - for sacf2 in lclfiles2: - st2 = read(sacf2) - if dtype.upper() == 'MSEED': - if len(st2) > 1: - st2.merge( - method=1, interpolation_samples=-1, fill_value=-123456789) - - # Check time overlap of the two files. - if st1[0].stats.endtime >= \ - st2[0].stats.starttime-st2[0].stats.delta: - # eddt1 = False - # eddt2 = False - # if dtype.upper() == 'SAC': - # # Check for NoData and convert to NaN - # st1nd = st1[0].stats.sac['user9'] - # st2nd = st2[0].stats.sac['user9'] - # if (not st1nd == 0.0) and (not st1nd == -12345.0): - # st1[0].data[st1[0].data == st1nd] = ndval - # eddt1 = True - # if (not st2nd == 0.0) and (not st2nd == -12345.0): - # st2[0].data[st2[0].data == st2nd] = ndval - # eddt2 = True - - st = st1 + st2 - # Need to work on this HERE (AJS OCT 2015). - # If Calibration factors are different, - # then the traces cannot be merged. - try: - st.merge(method=1, interpolation_samples=- - 1, fill_value=-123456789) - - # Should only be one component, otherwise keep - # reading If more than 1 component, error - if len(st) != 1: - print(st) - print("merge failed?") - - else: - if (st[0].stats.starttime <= start and - st[0].stats.endtime >= end): - st.trim(starttime=start, endtime=end) - - eddt = False - # Check for NoData and convert to NaN if a SAC file - if dtype.upper() == 'SAC': - stnd = st[0].stats.sac['user9'] - if (not stnd == 0.0) and (not stnd == -12345.0): - st[0].data[st[0].data == stnd] = ndval - eddt = True - - # Check for Nan in stream for SAC - if True in isnan(st[0].data): - print( - "* !!! Missing Data " + - "Present !!! Skipping (NaNs)") - # Check for ND Val in stream for MSEED - elif -123456789 in st[0].data: - print( - "* !!! Missing Data Present !!! " + - "Skipping (MSEED fill)") - else: - if (eddt1 or eddt2) and (ndval == 0.0): - if any(st[0].data == 0.0): - print( - "* !!! Missing " + - "Data Present !!! (Set " + - "to Zero)") - - st[0].stats.update() - tloc = st[0].stats.location - if len(tloc) == 0: - tloc = "--" - - # Processed succesfully...Finish - print(("* {1:3s}.{2:2s} - " + - "From Disk".format( - st[0].stats.station, - st[0].stats.channel.upper(), - tloc))) - return False, st - - except: - pass - else: - st2ot = st2[0].stats.endtime-st2[0].stats.delta - print("* - Merge Failed: No " + - "Overlap {0:s} - {1:s}".format( - st1[0].stats.endtime.strftime( - "%Y-%m-%d %H:%M:%S"), - st2ot.strftime("%Y-%m-%d %H:%M:%S"))) - - # If we got here, we did not get the data. - print("* - Data Unavailable") - return erd, None - - -def download_data(client=None, sta=None, start=UTCDateTime, end=UTCDateTime, - stdata=[], dtype='SAC', ndval=nan, new_sr=0., verbose=False): - """ - Function to build a stream object for a seismogram in a given time window either - by downloading data from the client object or alternatively first checking if the - given data is already available locally. - - Note - ---- - Currently only supports NEZ Components! + Function to build a stream object for a seismogram in a given time window + by getting data from a client object, either from a local SDS archive or + from an FDSN web-service. The function performs sanity checks for + the start times, sampling rates and window lengths. Parameters ---------- @@ -456,10 +57,17 @@ def download_data(client=None, sta=None, start=UTCDateTime, end=UTCDateTime, Start time for request end : :class:`~obspy.core.utcdatetime.UTCDateTime` End time for request - stdata : List - Station list - ndval : float or nan - Default value for missing data + new_sr : float + New sampling rate (Hz) + verbose : bool + Whether or not to print messages to screen during run-time + remove_response : bool + Remove instrument response from seismogram and resitute to true ground + velocity (m/s) using obspy.core.trace.Trace.remove_response() + zcomp: str + Vertical Component Identifier. Should be a single character. + This is different then 'Z' only for fully unknown component + orientation (i.e., components are 1, 2, 3) Returns ------- @@ -474,149 +82,121 @@ def download_data(client=None, sta=None, start=UTCDateTime, end=UTCDateTime, """ - from fnmatch import filter - from obspy import read, Stream - from os.path import dirname, join, exists - from numpy import any - from math import floor - - # Output - print(("* {0:s}.{1:2s} - ZNE:".format(sta.station, - sta.channel.upper()))) - - # Set Error Default to True - erd = True - - # Check if there is local data - if len(stdata) > 0: - # Only a single day: Search for local data - # Get Z localdata - errZ, stZ = parse_localdata_for_comp( - comp='Z', stdata=stdata, dtype=dtype, sta=sta, start=start, end=end, - ndval=ndval) - # Get N localdata - errN, stN = parse_localdata_for_comp( - comp='N', stdata=stdata, dtype=dtype, sta=sta, start=start, end=end, - ndval=ndval) - # Get E localdata - errE, stE = parse_localdata_for_comp( - comp='E', stdata=stdata, dtype=dtype, sta=sta, start=start, end=end, - ndval=ndval) - # Retreived Succesfully? - erd = errZ or errN or errE - if not erd: - # Combine Data - st = stZ + stN + stE - - # No local data? Request using client - if erd: - erd = False - - for loc in sta.location: - tloc = loc - # Construct location name - if len(tloc) == 0: - tloc = "--" - # Construct Channel List - channelsZNE = sta.channel.upper() + 'Z,' + sta.channel.upper() + \ - 'N,' + sta.channel.upper() + 'E' - print(("* {1:2s}[ZNE].{2:2s} - Checking Network".format( - sta.station, sta.channel.upper(), tloc))) - - # Get waveforms, with extra 1 second to avoid - # traces cropped too short - traces are trimmed later - try: - st = client.get_waveforms( - network=sta.network, - station=sta.station, location=loc, - channel=channelsZNE, starttime=start, - endtime=end+1., attach_response=False) - if len(st) == 3: - print("* - ZNE Data Downloaded") + # # Output + # print(("* {0:s}.{1:2s} - ZNE:".format(sta.station, + # sta.channel.upper()))) + for loc in sta.location: + + # Construct location name + if loc == "--": + tloc = "" + else: + tloc = copy.copy(loc) + + # Construct Channel List + cha = sta.channel.upper() + '?' + msg = "* {0:s}.{1:2s}?.{2:2s} - Checking Network".format( + sta.station, sta.channel.upper(), loc) + print(msg) + + # Get waveforms, with extra 1 second to avoid + # traces cropped too short - traces are trimmed later + try: + st = client.get_waveforms( + network=sta.network, + station=sta.station, + location=tloc, + channel=cha, + starttime=start, + endtime=end+1.) + except Exception as e: + if verbose: + print("* Met exception:") + print("* " + e.__repr__()) + st = None + else: + if len(st) == 3: # It's possible if len(st)==1 that data is Z12 - else: - # Construct Channel List - channelsZ12 = sta.channel.upper() + 'Z,' + \ - sta.channel.upper() + '1,' + \ - sta.channel.upper() + '2' - msg = "* {1:2s}[Z12].{2:2s} - Checking Network".format( - sta.station, sta.channel.upper(), tloc) - print(msg) - try: - st = client.get_waveforms( - network=sta.network, - station=sta.station, location=loc, - channel=channelsZ12, starttime=start, - endtime=end+1., attach_response=False) - if len(st) == 3: - print("* - Z12 Data Downloaded") - else: - st = None - except: - st = None - except: - st = None - - # Break if we successfully obtained 3 components in st - if not erd: - - break + print("* - Data Downloaded") + # break # Check the correct 3 components exist - if st is None: + if st is None or len(st) < 3: print("* Error retrieving waveforms") print("**************************************************") return True, None # Three components successfully retrieved - else: - - - - # Detrend and apply taper - st.detrend('linear').taper(max_percentage=0.05, max_length=5.) - - # Check start times - if not np.all([tr.stats.starttime == start for tr in st]): + if remove_response: + try: + st.remove_response() + if verbose: + print("*") + print("* Restituted stream to true ground velocity.") + print("*") + except Exception as e: + print("*") + print('* Cannot remove response, moving on.') + print("*") + + # Detrend and apply taper + st.detrend('demean').detrend('linear').taper( + max_percentage=0.05, max_length=5.) + + # Check start times + if not np.all([tr.stats.starttime == start for tr in st]): + if verbose: print("* Start times are not all close to true start: ") [print("* "+tr.stats.channel+" " + str(tr.stats.starttime)+" " + str(tr.stats.endtime)) for tr in st] print("* True start: "+str(start)) - print("* -> Shifting traces to true start") - delay = [tr.stats.starttime - start for tr in st] - st_shifted = Stream( - traces=[traceshift(tr, dt) for tr, dt in zip(st, delay)]) - st = st_shifted.copy() - - # Check sampling rate - sr = st[0].stats.sampling_rate - sr_round = float(floor_decimal(sr, 0)) - if not sr == sr_round: + print("* -> Shifting traces to true start") + delay = [tr.stats.starttime - start for tr in st] + st_shifted = Stream( + traces=[traceshift(tr, dt) for tr, dt in zip(st, delay)]) + st = st_shifted.copy() + + # Check sampling rate + sr = st[0].stats.sampling_rate + sr_round = float(floor_decimal(sr, 0)) + if not sr == sr_round: + if verbose: print("* Sampling rate is not an integer value: ", sr) print("* -> Resampling") - st.resample(sr_round, no_filter=False) + st.resample(sr_round, no_filter=False) + + # Try trimming + try: + st.trim(start, end) + except Exception as e: + print("* Unable to trim") + print("* -> Skipping") + print("**************************************************") - # Try trimming - try: - st.trim(start, end) - except: - print("* Unable to trim") - print("* -> Aborting") - print("**************************************************") - return True, None - - # Check final lengths - they should all be equal if start times - # and sampling rates are all equal and traces have been trimmed - if not np.allclose([tr.stats.npts for tr in st[1:]], st[0].stats.npts): - print("* Lengths are incompatible: ") - [print("* "+str(tr.stats.npts)) for tr in st] - print("* -> Aborting") - print("**************************************************") - - return True, None + return True, None - else: - print("* Waveforms Retrieved...") - return False, st + # Check final lengths - they should all be equal if start times + # and sampling rates are all equal and traces have been trimmed + if not np.allclose([tr.stats.npts for tr in st[1:]], st[0].stats.npts): + print("* Lengths are incompatible: ") + [print("* "+str(tr.stats.npts)) for tr in st] + print("* -> Skipping") + print("**************************************************") + + return True, None + + elif not np.allclose([st[0].stats.npts], int((end - start)*sr), + atol=1): + print("* Length is too short: ") + print("* "+str(st[0].stats.npts) + + " ~= "+str(int((end - start)*sr))) + print("* -> Skipping") + print("**************************************************") + + return True, None + + else: + print("* Waveforms Retrieved...") + return False, st